Pergunta

Este pedido é baseado em MS Access VBA. Gostaria de saber o que a maneira mais eficiente é, para ver se um item existe em um controle de caixa de listagem.

Foi útil?

Solução

Aqui está uma função de exemplo que pode ser adaptado para o exemplo.

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

Outras dicas

Infelizmente não há nenhuma maneira mais eficiente do que uma busca linear, a menos que você sabe que a sua caixa de listagem é classificada ou indexada de alguma forma particular.

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

Se você não se importa recorrer à API do Windows, você pode procurar por uma seqüência 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)

Qual deve retornar o índice da linha que contém a cadeia alvo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top