項目がリストボックス コントロール内にあるかどうかを確認する最も効率的な方法

StackOverflow https://stackoverflow.com/questions/105935

質問

このリクエストは MS Access VBA に基づいています。リストボックス コントロールに項目が存在するかどうかを確認する最も効率的な方法を知りたいです。

役に立ちましたか?

解決

これは、適合する可能性のあるサンプル関数です。

Function CheckForItem(strItem, ListB As ListBox) As Boolean
Dim rs As DAO.Recordset
Dim db As Database
Dim tdf As TableDef

    Set db = CurrentDb

    CheckForItem = False

    Select Case ListB.RowSourceType
        Case "Value List"
            CheckForItem = InStr(ListB.RowSource, strItem) > 0

        Case "Table/Query"
            Set rs = db.OpenRecordset(ListB.RowSource)

            For i = 0 To rs.Fields.Count - 1
                strList = strList & " & "","" & " & rs.Fields(i).Name
            Next

            rs.FindFirst "Instr(" & Mid(strList, 10) & ",'" & strItem & "')>0"

            If Not rs.EOF Then CheckForItem = True

        Case "Field List"

            Set tdf = db.TableDefs(ListB.RowSource)

            For Each itm In tdf.Fields
                If itm.Name = strItem Then CheckForItem = True
            Next

    End Select

End Function

他のヒント

残念ながら、リストボックスが何らかの特定の方法でソートまたはインデックス付けされていることを知っている場合を除き、線形検索より効率的な方法はありません。

For i = 1 To TheComboBoxControl.ListCount
  if TheComboBoxControl.ItemData(i) = "Item to search for" Then do_something()
Next i

Windows API を使用しても構わない場合は、次のような文字列を検索できます。

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long   
Private Const LB_FINDSTRINGEXACT = &H1A2

Dim index as Integer
Dim searchString as String
searchString = "Target" & Chr(0)

index = SendMessage(ListBox1.hWnd, LB_FINDSTRINGEXACT , -1, searchString)

これは、ターゲット文字列を含む行のインデックスを返す必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top