1次元または2次元の配列内の探索を行う汎用的プロシージャのサンプルです。ここでは探索対象とする配列内の列や返す列を引数として指定することができます。
Public Function ArraySearch(ArrayData As Variant, varKeyword As Variant, _
Optional SearchCol As Variant, _
Optional RetCol As Variant) As Variant
'概要 配列内の探索を行う
'引数 ArrayDat : 探索する配列データ
' varKeyword : 探索する値
' SearchCol : 探索対象の配列のフィールド番号(省略時はゼロ<左端>)
' RetCol : 返り値とする配列のフィールド番号(省略時および1次元配列は行番号)
'返値 指定されたフィールド番号の値(見つからない場合はNull)
Dim intSCol As Integer
Dim varDummy As Variant
Dim intDimNum As Integer
Dim iintLoop As Integer
Dim blnFinded As Boolean
'探索フィールドの設定
intSCol = IIf(IsMissing(SearchCol), 0, SearchCol)
'次元数を確認
On Error Resume Next
varDummy = ArrayData(1, 1)
If Err.Number > 0 Then
'エラーが発生したら1次元配列と判断
intDimNum = 1
Else
intDimNum = 2
End If
On Error GoTo 0
'配列内の探索ループ
If intDimNum = 1 Then
'1次元配列の場合
For iintLoop = LBound(ArrayData) To UBound(ArrayData) - 1
If ArrayData(iintLoop) = varKeyword Then
ArraySearch = iintLoop
blnFinded = True
Exit For
End If
Next iintLoop
Else
'2次元配列の場合
For iintLoop = LBound(ArrayData, 2) To UBound(ArrayData, 2) - 1
If ArrayData(intSCol, iintLoop) = varKeyword Then
If IsMissing(RetCol) Then
ArraySearch = iintLoop
Else
ArraySearch = ArrayData(RetCol, iintLoop)
End If
blnFinded = True
Exit For
End If
Next iintLoop
End If
If Not blnFinded Then
'見つからなかった場合
ArraySearch = Null
End If
End Function
実行例:
Sub ArraySearchTest1()
Dim aDat(6) As Variant
aDat(0) = "茨城県"
aDat(1) = "栃木県"
aDat(2) = "群馬県"
aDat(3) = "埼玉県"
aDat(4) = "千葉県"
aDat(5) = "東京都"
Debug.Print ArraySearch(aDat, "千葉県")
Debug.Print ArraySearch(aDat, "栃木県")
Debug.Print ArraySearch(aDat, "群馬県")
End Sub

Sub ArraySearchTest2()
Dim aDat(3, 6) As Variant
aDat(0, 0) = "A": aDat(1, 0) = "茨城県": aDat(2, 0) = "水戸市"
aDat(0, 1) = "B": aDat(1, 1) = "栃木県": aDat(2, 1) = "宇都宮市"
aDat(0, 2) = "C": aDat(1, 2) = "群馬県": aDat(2, 2) = "前橋市"
aDat(0, 3) = "D": aDat(1, 3) = "埼玉県": aDat(2, 3) = "さいたま市"
aDat(0, 4) = "E": aDat(1, 4) = "千葉県": aDat(2, 4) = "千葉市"
aDat(0, 5) = "F": aDat(1, 5) = "東京都": aDat(2, 5) = "新宿区"
Debug.Print ArraySearch(aDat, "F", 0, 1)
Debug.Print ArraySearch(aDat, "東京都", 1, 2)
Debug.Print ArraySearch(aDat, "東京都", 1)
Debug.Print ArraySearch(aDat, "前橋市", 2, 1)
End Sub

|