이 요청은 MS Access VBA를 기반으로합니다. 목록 상자 컨트롤에 항목이 있는지 가장 효율적인 방법이 무엇인지 알고 싶습니다.항목이 목록 상자 컨트롤에 있는지 여부를 확인하는 가장 효율적인 방법
0
A
답변
2
다음은 적합 할 수있는 샘플 함수입니다.
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
1
목록 상자가 특정 방식으로 정렬되거나 색인되어 있지 않다면 불행히도 선형 검색보다 효율적인 방법이 없습니다.
For i = 1 To TheComboBoxControl.ListCount
if TheComboBoxControl.ItemData(i) = "Item to search for" Then do_something()
Next i
1
당신이이 같은 문자열을 검색 할 수 있습니다 윈도우 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)
대상 문자열을 포함한 행의 인덱스를 반환해야합니다.