VLOOKUP関数とは
このページを見てる時点でVLOOKUP関数の説明は不要とは思いますが、一応軽く説明します。
VLOOKUP関数はExcelのセルに埋め込むワークシート関数の1つで、縦に並んだ表形式のセルに書いてあるデータの中から条件に合う1つを取り出す関数です。
引数が4つと多いため、使い方に少し慣れが必要です。
構文
=VOOKUP(検索値, 範囲, 列番号, [検索方法])
検索値 | 表形式のセル範囲から探したい値と対になるキーを指定します。 |
範囲 | 表形式のセル範囲を指定します。キーと値が範囲内に入っていることが前提になるため一般的には2行以上の範囲を指定します。 |
列番号 | 表形式のセル範囲のキーの列から見て値が何列目になるかを指定します。範囲でD2:E5としてした場合、D列を1、E列は2と数えます。 |
検索方法 | 近似一致の場合はTRUE、完全一致の場合はFALSEを指定します。省略時はTRUE扱いになります。 |
戻り値 | VLOOKUP関数の結果(見つかったデータ)が返ります。 |
以下はB3セルにVLOOKUP関数を設定した場合の例です。右側の赤いD2:E5の範囲から、コード「B」の対になる名称である「名称2」を表示するためにB3セルに「=VLOOKUP(B2,D2:E5,2,FALSE)」を設定しています。
通常のVLOOKUP関数の使い方は以上です。
VBAでVLOOKUP関数を使うには
VBAでVLOOKUP関数を使うには、セルにVLOOKUP関数の数式を入力する方法と、セルには入力せずにVBA処理内でVLOOKUP関数を使う方法の2つに大別されます。
どちらでもいいのですが、場合によってはセルに入力できない場合もあるため、そのような場合はVBAの処理内で実行します。
セルにVLOOKUP関数の数式を入力する場合は、対象セルのRangeオブジェクトのFomulaプロパティに「=VLOOKUP(・・・)」と数式を書きます。
この場合は、セルの書式を「標準」などのVLOOKUP関数を実行できるセル書式にしておく必要があります。
セルに「=VLOOKUP()」を入力せずにVBA処理内でVLOOKUP関数を使う場合には、3つの書き方があります。
WorksheetFunctionプロパティを使う方法、Evaluateメソッドを使う方法、角括弧[]を使う方法の3つです。
これら4つの書き方はどれを使ってもVLOOKUP関数の結果が得られますので、状況や好みに応じて使い分けをしてください。
1つずつ説明していきます。
1. セルにVLOOKUP関数の数式を入力する方法(Range.Fomulaプロパティ)
セルにVLOOKUP関数を設定する場合はRangeオブジェクトのFormulaプロパティに、セルに入力するときと同じようにVLOOKUP関数の数式を設定します。
以下のコードは同じシートにある表形式のセル範囲を参照する場合です。
1 2 3 |
Sub VlookupTest1() Range("B4").Formula = "=VLOOKUP(B2,D2:E5,2,FALSE)" End Sub |
VLOOKUP関数を使う場合に別シートに表形式のセル範囲を用意することもよくあります。その場合もセルに手で入力するときと同じで、VLOOKUP関数の第二引数には「シート名!セル範囲」の形式で書きます。他の引数は上と同じです。
1 2 3 |
Sub VlookupTest2() Range("B4").Formula = "=VLOOKUP(B2,Sheet2!D2:E5,2,FALSE)" End Sub |
VBAにFormuraプロパティを使って書く場合は、一度セルにVLOOKUP関数を書いて、それをコピーしてVBAに反映させるとラクです。
2. WorksheetFunctionプロパティを使う方法
WorksheetFunctionプロパティを使う場合はVLookup関数の第一引数と第二引数はRangeオブジェクトでセルを指定する必要があります。
1 2 3 4 5 6 7 |
Sub WorksheetFunctionVlookupTest() Dim s As String '// VLOOKUP関数の結果 s = Application.WorksheetFunction.VLookup(Range("B2"), Range("D2:E5"), 2, False) Debug.Print s End Sub |
以下のように第一引数や第二引数に座標文字列だけを渡した場合は構文エラーになります。
Application.WorksheetFunction.VLookup(“B2”, “D2:E5”, 2, False)
3. Evaluateメソッドを使う方法
Evaluateメソッドを使う場合は、RangeオブジェクトのFormulaプロパティのときとほとんど同じ書き方になります。
Evaluate関数の引数文字列の左端にはExcel関数の数式を表す「=」は一般的には付けません。でも左端の「=」付けてても動作するため、Excelのセルに書いてある数式をそのままコピペしても構いません。
1 2 3 4 5 6 7 |
Sub EvaluateVlookupTest() Dim s As String '// VLOOKUP関数の結果 s = Application.Evaluate("VLOOKUP(B2,D2:E5,2,FALSE)") Debug.Print s End Sub |
VLOOKUP関数を使う場合にはほとんど関係ありませんが、Evaluateメソッドで文字列を扱うワークシート関数を書く場合、文字列のダブルクォーテーションのエスケープが必要になってきます。
例えば「=DATEDIF(“2023/1/1”, TODAY(), “D”)」とセルに書かれている数式をEvaluateメソッドの引数に転記する場合は、以下のように日付部分「“2023/1/1“」と「“D“」のダブルクォーテーションのエスケープが必要になります。
Application.Evaluate(“DATEDIF(“”2023/1/1“”, TODAY(), “”D“”)”)
4. []を使う方法
Evaluateメソッドと同じように全てのワークシート関数を角括弧の[]で書くことも出来ます。
セルの数式をコピペで大体いけます。ただ、この書き方はVBAでは一般的とは言えないため、未来の自分や他の人が見たときに「なにこれ?」って言われることがあるかもしれません。
1 2 3 4 5 6 7 |
Sub SquareVlookupTest() Dim s As String '// VLOOKUP関数の結果 s = [VLOOKUP(B2,D2:E5,2,FALSE)] Debug.Print s End Sub |