Le moyen le plus efficace de voir si un élément est ou non dans un contrôle de zone de liste
-
01-07-2019 - |
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.
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