Excelのマクロで、ある番号に合致した行の値を返す処理が必要になりました。
まず思い付いたのが最初の行から1行ずつチェックをする方法。
これだと行が多いと処理時間がかかります。
次に思い付いたのが「Find」を使う方法。
これだとさほど時間がかかりません。
その後、「VBAはワークシート関数が使える(ことがある)。VLOOKUPを使えないか?」と思い付いたので試してみました。
X | A | B |
---|---|---|
1 | 番号 | 値 |
2 | 1 | 63 |
3 | 3 | 38 |
4 | 5 | 22 |
5 | 7 | 86 |
6 | 9 | 16 |
上の表の「番号」列に合致する「値」列の値を返す関数です。
Sub test1()
result = Application.WorksheetFunction.VLookup(5, Sheets("Sheet1").Range("A2:B6"), 2, False)
MsgBox result
End Sub
result = Application.WorksheetFunction.VLookup(5, Sheets("Sheet1").Range("A2:B6"), 2, False)
MsgBox result
End Sub
「Application.WorksheetFunction.VLookup」とするとVLOOKUPが使えます。
範囲は「Sheets(“Sheet1”).Range(“A2:B11”)」のように指定します。
他はワークシート関数としての使い方と同じです。
通常はこのような使い方でいいのですが、問題は合致する番号がない場合、エラーになって処理が止まってしまうケースです。
合致しない場合は「該当なし」と返すようにします。
Sub test2()
On Error Resume Next
result = Application.WorksheetFunction.VLookup(10, Sheets("Sheet1").Range("A2:B11"), 2, False)
If Err <> 0 Then
result = "該当なし"
End If
MsgBox result
End Sub
On Error Resume Next
result = Application.WorksheetFunction.VLookup(10, Sheets("Sheet1").Range("A2:B11"), 2, False)
If Err <> 0 Then
result = "該当なし"
End If
MsgBox result
End Sub
「On Error Resume Next」を使うとエラーが起きても処理が続きます。
エラーが起きると「Err」が「0」以外の値になるので、これで判定できます。
コメント