2009-08-21 81 views
0

所有,问题与VLOOKUP在VBA

我想在一个简单的VBA函数使用VLOOKUP,但它不断地返回#VALUE!

下面是代码:

Public Function getAreaName(UBR As Integer) As String 

    Dim result As String 
    Dim sheet As Worksheet 
    Set sheet = ActiveWorkbook.Sheets("UBR Report") 
    ' check level 3 then 2 then 4 then 5 
    result = Application.WorksheetFunction.VLookup(UBR, sheet.Range("UBRLookup"), Application.WorksheetFunction.Column(sheet.Range("UBRLookup[Level 3]")), False) 
    getAreaName = result 

End Function 

有什么想法?

回答

2

我不太清楚你想用“UBRLookup [Level 3]”引用做什么,但正如约瑟夫指出的那样,这是你做错的一点。

[不是Excel中命名区域的有效字符。

您引用的列需要是一个数值,这是您定义为命名范围的表数组的起始位置的偏移量。

如果您想要拉出的列是您命名范围中的第二列(例如您所指的[level 3]在第二列中),下面的内容应该可以工作。

Public Function getAreaName(UBR As Integer) As String 

    Dim result As String 
    Dim sheet As Worksheet 
    Set sheet = ActiveWorkbook.Sheets("UBR Report") 
    result = Application.WorksheetFunction.VLookup(UBR, sheet.Range("UBRLookup"), 2, False) 
    getAreaName = result 

End Function 

更新:
我看了一下Excel 2007中,从我所看到的列函数不公开为Application.WorksheetFunction。 您可以在=Column(D4)的工作表上使用它,但是当尝试在vba编辑器中自动完成时,该功能不存在。这可能是由于版本的差异,所以现在我会忽略它。

它仍然看起来像你错在使用第三个参数。如果你真的不想使用数字引用,我们需要找出函数出错的地方。

线沿线的一些测试

Debug.Print Application.WorksheetFunction.Column(D4) 
Debug.Print sheet.Range("UBRLookup[Level 3]") 

应该有希望帮助告诉你究竟到哪里去错了 - 我相信它会反对上述两种的,但如果它,然后返回一些有用的信息我们可能会更接近您的解决方案。

+0

我使用excel 2007 tablename [column]语法和column()函数来自动确定偏移量。不过,我会尝试使用手动设置。 – jwoolard 2009-08-21 15:13:22

+0

更新了上述内容。 Debug.Print注释是否在您的Excel 2007版本上运行? – Andy 2009-08-25 08:51:55

1

打破你的功能到更多的作品。然后调试它并确保每件作品都按照您的期望设置。

例子:

Public Function getAreaName(UBR As Integer) As String 
    Dim result As String 
    Dim sheet As Worksheet 
    Set sheet = ActiveWorkbook.Sheets("UBR Report") 
    Dim range as Range = sheet.Range("UBRLookup") 
    Dim column as Column = Application.WorksheetFunction 
      .Column(sheet.Range("UBRLookup[Level 3]")) 
    result = Application.WorksheetFunction.VLookup(UBR, range, column, False) 
    getAreaName = result 
End Function 

事实上,仅仅通过这样做,我发现了一些奇怪的。你在两个不同的地方使用范围,但在一个地方你要找UBRLookup,而在另一个地方,你正在寻找UBRLookup [Level 3],那是对的吗?

+0

无法正常工作。列不是有效的数据类型。 -1 – 2009-08-22 11:59:09

+0

@iDevlop它的空码。一个例子来向他展示我的意思是分手。我不知道Application.WorksheetFunction.Column()返回的结果是一个猜测,这是OP找出的结果。 – Joseph 2009-08-22 14:32:13

1

我被
Dim column as Column =
Application.WorksheetFunction.Column(sheet.Range("UBRLookup[Level 3]"))

你应该昏暗列长,我想,也许用一个变量名,这并不是一个属性混淆,像lngCol不安。

+0

我很惊讶原始版本甚至编译。我在Excel 2003中得到“用户定义类型未定义”,并且在Excel 2007对象模型中看不到一个Column对象 – barrowc 2009-08-22 05:43:43

+0

Right。 它应该是: dim lngCol as long lngCol = sheetx.range(“xxx”)。column – 2009-08-22 12:00:46

0

此部分:sheet.Range(“UBRLookup [Level 3]”)被怀疑为“UBRLookup [Level 3]”不是有效的范围名称。