Это расширение вашей идеи использовать Join
и InStr
:
Sub TestArraySearch()
Dim A(4) As String
A(0) = "First"
A(1) = "Second"
A(2) = "Third"
A(3) = "Fourth"
A(4) = "Fifth"
Debug.Print FastArraySearch(A, "Fi")
Debug.Print FastArraySearch(A, "o")
Debug.Print FastArraySearch(A, "hird")
Debug.Print FastArraySearch(A, "Fou")
Debug.Print FastArraySearch(A, "ndTh")
Debug.Print FastArraySearch(A, "fth")
End Sub
Function FastArraySearch(SearchArray As Variant,SearchPhrase As String) As String
Dim Pos As Long, i As Long, NumCharsProcessed As Long, Txt As String
Pos = InStr(Join(SearchArray, "§"), SearchPhrase)
If Pos > 0 Then
For i = LBound(SearchArray) To UBound(SearchArray)
NumCharsProcessed = NumCharsProcessed + Len(SearchArray(i)) + 1
If NumCharsProcessed >= Pos Then
FastArraySearch = SearchArray(i)
Exit Function
End If
Next i
End If
End Function
Я не тестировал его, но это должно быть быстрее, чем выполнять отдельный поиск каждый раз в цикле. Он ищет один раз, затем просто складывает длины строк, пока не доберется до места совпадения. Поскольку длина строки сохраняется до любого из символов в строке, функция Len
сильно оптимизирована.
Если эта производительность все еще неприемлема, я думаю, вам нужно будет найти структуру данных, отличную от массива (например, отключенный набор записей, как предложил @Remou).