#355 | 配列内の探索を行うプロシージャ例 | VBA | |
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 ※このプロシージャでは、3次元以上の配列は考慮していません。また添え字の最初の値(Option Base:0または1)についても考慮していません。 また2次元配列の探索対象は2次元目です。それらについては適宜このコードを書き換え てください。 ※「If ArrayData(iintLoop, intSCol) = varKeyword Then」の部分は、汎用性としては不十分で、必要に応じてCStr(varKeyword)などとした方がよい場合があります。 実行例: 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 |
|||
|
Copyright © T'sWare All rights reserved |