2

VBAには以下の2つの関数があります。は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

これは 2 つの方法で行うことができます

関数の修正
現在の関数は範囲変数を設定していません。このように動作します

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は、範囲だけでなくバリアント配列にも適用できるためです。ただし、2つの列全体を配列に読み込むのはかなり非効率的であるため、範囲参照(Set rangeVar = ...)を取得することに固執します。編集Excel2007/2010では、2つの列全体をVariant配列に読み込むと、関数が停止する可能性があります。これは、私がテストしていたExcel 2003の65536とは対照的に、ロードする行が100万行あるためです。

于 2012-02-29T08:50:13.840 に答える