#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

実行結果のイミディエイトウィンドウ
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved