VBAでワークシート関数のVLOOKUP関数を使用して、複数条件で検索する方法をご説明します。
VLOOKUP関数を複数条件で使用するには、条件に指定する列を結合するために作業列を追加する必要があります。
作業列の追加方法も併せてご説明したいと思います。
基本的な使い方から高速処理の方法などについては下記記事をご覧ください。
- VLOOKUP関数の使い方と、エラー処理やループの方法
- 行と列の条件が一致するセルを取得する
- VLOOKUPの高速化
- VLOOKUPの複数条件を高速で処理する方法
- VLOOKUP関数で一致したデータをすべて取得する
1.列を挿入して作業列を作る方法
VLOOKUP関数を複数条件で処理するためには、検索値を結合する列と検索範囲の検索列の結合するための列を追加する必要があります。
検索値については変数に格納する際に結合する場合は、列を追加せずに処理が可能です。
列の操作については「列の選択、取得、追加(挿入)、削除」をご覧ください。
列の操作は「Columns」プロパティか、「Range」プロパティです。
列の追加は「Insert」メソッドを使用します。
Columns、Range.EntireColumnどちらでも追加個所を指定できます。
列を挿入するサンプルコード
たとえば5列目に挿入する場合は次のように記述します。
「Columns」の場合
Sub Sample1()
Columns(5).Insert
End Sub
「Range.EntireColumn」の場合
Sub Sample2()
Range("E1").EntireColumn.Insert
End Sub
2.作業列で検索値を結合する方法
作業列を追加した場合に、次は検索値となる列を作業列で結合する方法です。
こちらは単純に「&」を使用して結合するか、区切り文字を使用する場合は「Join関数」を使用して結合します。
次のようなデータを使用して説明します。
A列とB列を結合するために、赤線で囲われたC列に1列追加してA列とB列を結合します。
列を追加して結合するサンプルコード
Sub Sample3()
Dim i As Long
Columns(3).Insert
For i = 2 To 13
Cells(i, 3) = Cells(i, 1) & Cells(i, 2)
Next i
End Sub
「Columns(3).Insert」でC列に列を挿入して、「For~Next」で25行目までループしています。
ループについて不安な方は「「For~Next」「For Each In Next」「Do~Loop」 ループの使い方」をご覧ください。
「Cells(i, 3) = Cells(i, 1) & Cells(i, 2)」で追加したC列にA列とB列を「&」で結合しています。
3.列を挿入して複数条件でVLOOKUPで検索する方法
列の挿入、結合と順に説明してきましたが、それらを組み合わせて複数条件のVLOOKUP関数での検索をします。
先ほどと同じデータを使用して、「A列とB列」のリストから2つの条件に「E列とF列」が一致した結果をG列に入力します。
この場合C列に1列追加して、A列とB列を結合します。
E列とF列に関しては変数を使用する事で列を追加しなくても対応できます。
Sub Sample4()
Dim SearchWord As String '検索値
Dim SearchRange As Range '検索範囲
Dim WordMaxRow As Long '検索値最終行
Dim RangeMaxRow As Long '検索範囲最終行
Dim i As Long
WordMaxRow = Cells(Rows.Count, 5).End(xlUp).Row '検索値最終行
RangeMaxRow = Cells(Rows.Count, 1).End(xlUp).Row '検索範囲最終行
Columns(3).Insert '列挿入
'文字列を結合
For i = 2 To RangeMaxRow
Cells(i, 3) = Cells(i, 1) & Cells(i, 2)
Next i
Set SearchRange = Range(Cells(2, 3), Cells(RangeMaxRow, 4)) '検索範囲格納
For i = 2 To WordMaxRow '検索値数分ループ
SearchWord = Cells(i, 6) & Cells(i, 7) 'E列とF列の結合した検索値格納
Cells(i, 8) = Application.WorksheetFunction.VLookup _
(SearchWord, SearchRange, 2, False) '検索
Next i
End Sub
コードの説明
「WordMaxRow = Cells(Rows.Count, 5).End(xlUp).Row」で検索値の最終行を取得します。
「RangeMaxRow = Cells(Rows.Count, 1).End(xlUp).Row」で検索範囲の最終行を取得します。
「Columns(3).Insert」で2つの条件を結合するために、C列に列を挿入します。
「For~Next」で結合したい行数分ループして、文字列を結合しています。
「Set SearchRange = Range(Cells(2, 3), Cells(RangeMaxRow, 4))」で結合した文字列の列から価格の列を検索範囲として格納します。
「SearchWord = Cells(i, 6) & Cells(i, 7)」で検索値は列を追加せずに、変数へ結合して格納します。
「Application.WorksheetFunction.VLookup(SearchWord, SearchRange, 2, False)」でVLOOKUP関数で検索します。
これで、複数条件でVLOOKUP関数を使用して検索が可能です。