Le moyen le plus efficace de voir si un élément est ou non dans un contrôle de zone de liste

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

Question

Cette demande est basée sur MS Access VBA. Je voudrais savoir quel est le moyen le plus efficace de vérifier si un élément existe dans un champ de liste déroulante.

Était-ce utile?

La solution

Voici un exemple de fonction qui pourrait être adaptée à vos besoins.

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

Autres conseils

Malheureusement, il n'y a pas de moyen plus efficace qu'une recherche linéaire, à moins que vous ne sachiez que votre liste de sélection est triée ou indexée d'une manière particulière.

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

Si cela ne vous dérange pas de recourir à l'API Windows, vous pouvez rechercher une chaîne comme celle-ci:

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)

Qui doit renvoyer l'index de la ligne contenant la chaîne cible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top