配列の検索
「配列の中から特定の値を探したい」——初心者がよくつまずくポイントです。VBAには標準で検索関数がないので、自分でループや関数を作る必要があります。ここでは 一次元配列・二次元配列 の検索方法を、コード例とテンプレートでかみ砕いて説明します。
基本の考え方
- 一次元配列:
Forループで順番に調べる。見つかったら位置を返す。 - 二次元配列: 行×列をループして調べる。見つかったら行番号や列番号を返す。
- 便利関数化: 検索処理を関数にしておくと再利用できる。
テンプレ1:一次元配列の検索(値の位置を返す)
Function FindInArray_1D(arr As Variant, target As Variant) As Long
Dim i As Long
For i = LBound(arr) To UBound(arr)
If arr(i) = target Then
FindInArray_1D = i
Exit Function
End If
Next i
FindInArray_1D = -1 ' 見つからなかった場合
End Function
Sub Example_Search1D()
Dim fruits As Variant
fruits = Array("りんご", "みかん", "バナナ", "ぶどう")
Dim pos As Long
pos = FindInArray_1D(fruits, "バナナ")
If pos <> -1 Then
MsgBox "バナナは配列の " & pos & " 番目にあります"
Else
MsgBox "見つかりませんでした"
End If
End Sub
VB- ポイント: 見つからなければ
-1を返すようにしておくと便利。
テンプレ2:二次元配列の検索(行番号と列番号を返す)
Function FindInArray_2D(arr As Variant, target As Variant) As String
Dim r As Long, c As Long
For r = LBound(arr, 1) To UBound(arr, 1)
For c = LBound(arr, 2) To UBound(arr, 2)
If arr(r, c) = target Then
FindInArray_2D = "行=" & r & " 列=" & c
Exit Function
End If
Next c
Next r
FindInArray_2D = "見つかりません"
End Function
Sub Example_Search2D()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim rg As Range: Set rg = ws.Range("A1:C5")
Dim v As Variant: v = rg.Value
Dim result As String
result = FindInArray_2D(v, "バナナ")
MsgBox result
End Sub
VB- ポイント: Rangeを読み込むと自動で二次元配列になる。行・列を返すと確認しやすい。
テンプレ3:部分一致で検索(文字列の一部を探す)
Function FindPartialInArray(arr As Variant, keyword As String) As Long
Dim i As Long
For i = LBound(arr) To UBound(arr)
If InStr(1, arr(i), keyword) > 0 Then
FindPartialInArray = i
Exit Function
End If
Next i
FindPartialInArray = -1
End Function
Sub Example_SearchPartial()
Dim fruits As Variant
fruits = Array("りんご", "みかん", "バナナ", "ぶどう")
Dim pos As Long
pos = FindPartialInArray(fruits, "な")
If pos <> -1 Then
MsgBox "「な」を含む要素は " & fruits(pos)
Else
MsgBox "見つかりませんでした"
End If
End Sub
VB- ポイント:
InStrを使えば部分一致検索ができる。
テンプレ4:複数一致を全部返す(コレクション利用)
Function FindAllInArray(arr As Variant, target As Variant) As Collection
Dim results As New Collection
Dim i As Long
For i = LBound(arr) To UBound(arr)
If arr(i) = target Then results.Add i
Next i
Set FindAllInArray = results
End Function
Sub Example_SearchAll()
Dim nums As Variant
nums = Array(10, 20, 10, 30, 10)
Dim hits As Collection: Set hits = FindAllInArray(nums, 10)
Dim i As Long, msg As String
For i = 1 To hits.Count
msg = msg & hits(i) & "番目 " & vbCrLf
Next i
MsgBox "10が見つかった位置:" & vbCrLf & msg
End Sub
VB- ポイント: 同じ値が複数ある場合は
Collectionに全部入れて返す。
例題で練習
'例1:一次元配列で「バナナ」を検索
Sub Example1()
Example_Search1D
End Sub
'例2:二次元配列で「バナナ」を検索
Sub Example2()
Example_Search2D
End Sub
'例3:部分一致で「な」を含む要素を検索
Sub Example3()
Example_SearchPartial
End Sub
'例4:複数一致を全部返す
Sub Example4()
Example_SearchAll
End Sub
VB初心者向けポイント
- 一次元は単純ループ:
For i = LBound To UBound。 - 二次元は二重ループ: 行と列を両方回す。
- 部分一致はInStr: 文字列検索に便利。
- 複数一致はCollection: 位置を全部返せる。
- 見つからないときの扱い:
-1や「見つかりません」を返すようにしておくと安全。
