2

我在 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
4

2 回答 2

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
于 2012-02-29T08:37:36.153 回答
3

要传递范围,您首先需要获取对范围的引用。

你目前有这个:

rangeVar = Worksheets("SheetCache").Range("A:B")

这没有范围;它将整个范围读A:B入 Variant 数组。如果要获取范围引用,则需要使用Set关键字。

Set rangeVar = Worksheets("SheetCache").Range("A:B")

具有讽刺意味的是,这不会影响abb11函数的输出(编辑:在 Excel 2003 中),因为VLookup可以应用于 Variant 数组以及 Range。但是,将两整列读入一个数组是相当低效的,所以我会坚持获取一个范围引用 ( Set rangeVar = ...)。编辑在 Excel 2007/2010 中,将两个整列读入 Variant 数组可能会导致您的函数终止,因为要加载一百万行,而不是我正在测试的 Excel 2003 中的 65536 行。

于 2012-02-29T08:50:13.840 回答