我在VBA中有以下两个功能。 abb00
工作正常但abb11
没有。
我的问题是如何传递Range
变量作为VLookup
函数的参数?
Function abb00() 'demo func
abb00 = Application.WorksheetFunction.VLookup("a", _
Worksheets("SheetCache").Range("A:B"), 2, False)
End Function
Function abb11() 'demo func
rangeVar = Worksheets("SheetCache").Range("A:B")
abb11 = Application.WorksheetFunction.VLookup("a", rangeVar, 2, False)
End Function
答案 0 :(得分:4)
你可以用两种方式做到这一点
修复您的功能
您当前的功能未设置范围变量。它会像这样工作
Function abb11()
Dim rangeVar as Range
Set rangeVar = Worksheets("SheetCache").Range("A:B")
abb11 = Application.WorksheetFunction.VLookup("a", rangeVar, 2, False)
End Function
将范围传递给您的功能
或者,您可以将范围传递给函数,如此
Sub GetRange()
Dim rangeVar As Range
Set rangeVar = Worksheets("SheetCache").Range("A:B")
MsgBox abb2(rangeVar)
End Sub
Function abb2(ByVal rangeVar)
abb2 = Application.WorksheetFunction.VLookup("a", rangeVar, 2, False)
End Function
答案 1 :(得分:3)
要传递范围,首先需要获取范围的引用。
你目前有这个:
rangeVar = Worksheets("SheetCache").Range("A:B")
这不会得到一个范围;它将整个范围A:B
读入Variant数组。如果您想获得范围引用,则需要使用Set
关键字。
Set rangeVar = Worksheets("SheetCache").Range("A:B")
具有讽刺意味的是,这不会影响abb11
函数的输出(编辑:在Excel 2003中),因为VLookup
可以应用于Variant数组以及到一个范围。但是,将两个整列读入数组的效率相当低,因此我会坚持使用范围引用(Set rangeVar = ...
)。 编辑在Excel 2007/2010中,将两个完整列读入Variant数组可能会导致您的函数死亡,因为要加载一百万行而不是Excel 2003中的65536,这就是我正在测试。