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.

¿Fue útil?

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
scroll top