问题与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
有什么想法?
我不太清楚你想用“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]")
应该有希望帮助告诉你究竟到哪里去错了 - 我相信它会反对上述两种的,但如果它,然后返回一些有用的信息我们可能会更接近您的解决方案。
打破你的功能到更多的作品。然后调试它并确保每件作品都按照您的期望设置。
例子:
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],那是对的吗?
无法正常工作。列不是有效的数据类型。 -1 – 2009-08-22 11:59:09
@iDevlop它的空码。一个例子来向他展示我的意思是分手。我不知道Application.WorksheetFunction.Column()返回的结果是一个猜测,这是OP找出的结果。 – Joseph 2009-08-22 14:32:13
我被Dim column as Column =
Application.WorksheetFunction.Column(sheet.Range("UBRLookup[Level 3]"))
你应该昏暗列长,我想,也许用一个变量名,这并不是一个属性混淆,像lngCol不安。
我很惊讶原始版本甚至编译。我在Excel 2003中得到“用户定义类型未定义”,并且在Excel 2007对象模型中看不到一个Column对象 – barrowc 2009-08-22 05:43:43
Right。 它应该是: dim lngCol as long lngCol = sheetx.range(“xxx”)。column – 2009-08-22 12:00:46
此部分:sheet.Range(“UBRLookup [Level 3]”)被怀疑为“UBRLookup [Level 3]”不是有效的范围名称。
我使用excel 2007 tablename [column]语法和column()函数来自动确定偏移量。不过,我会尝试使用手动设置。 – jwoolard 2009-08-21 15:13:22
更新了上述内容。 Debug.Print注释是否在您的Excel 2007版本上运行? – Andy 2009-08-25 08:51:55