Наиболее эффективный способ узнать, есть элемент в элементе управления listbox или его нет
-
01-07-2019 - |
Вопрос
Этот запрос основан на MS Access VBA.Я хотел бы знать, каков наиболее эффективный способ проверить, существует ли элемент в элементе управления listbox.
Решение
Вот пример функции, которая может быть адаптирована под вас.
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
Другие советы
К сожалению, нет более эффективного способа, чем линейный поиск, если только вы не знаете, что ваш список отсортирован или проиндексирован каким-то определенным образом.
For i = 1 To TheComboBoxControl.ListCount
if TheComboBoxControl.ItemData(i) = "Item to search for" Then do_something()
Next i
Если вы не возражаете прибегнуть к Windows API, вы можете выполнить поиск строки, подобной этой:
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)
Который должен возвращать индекс строки, содержащей целевую строку.
Не связан с StackOverflow