所有
我正在尝试在简单的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
有什么想法吗?
答案 0 :(得分:2)
我不太确定你正在试图用“UBRLookup [Level 3]”参考,但正如约瑟夫所指出的,那就是你做错了。
[
不是Excel中命名范围的有效字符。
您引用的列需要是一个数值,即您定义为命名范围的表数组起始处的偏移量。
如果要拉出的列是您指定范围内的第二列(例如,您所指的[级别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]")
应该有助于向您展示它出错的确切位置 - 我相信它会反对上述两种情况,但如果它返回一些有用的信息,那么我们可能会更接近您的解决方案。
答案 1 :(得分: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],这是正确的吗?
答案 2 :(得分:1)
我很不安
Dim column as Column =
Application.WorksheetFunction.Column(sheet.Range("UBRLookup[Level 3]"))
我认为你应该将列调暗,并且可能使用一个不要与属性混淆的变量名,比如lngCol。
答案 3 :(得分:0)
此部分: sheet.Range(“UBRLookup [Level 3]”)可疑,因为“UBRLookup [Level 3]”不是有效的范围名称。