La forma más eficaz de ver si un elemento está o no en un control de cuadro de lista
-
01-07-2019 - |
Pregunta
Esta solicitud se basa en MS Access VBA.Me gustaría saber cuál es la forma más eficiente de ver si existe un elemento en un control de cuadro de lista.
Solución
A continuación se muestra una función de ejemplo que podría adaptarse para adaptarse.
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
Otros consejos
Desafortunadamente, no existe una forma más eficiente que una búsqueda lineal, a menos que sepa que su cuadro de lista está ordenado o indexado de alguna manera particular.
For i = 1 To TheComboBoxControl.ListCount
if TheComboBoxControl.ItemData(i) = "Item to search for" Then do_something()
Next i
Si no te importa recurrir a la API de Windows, puedes buscar una cadena como esta:
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)
Que debería devolver el índice de la fila que contiene la cadena de destino.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow