Сейчас 100раз поисков среди 10.000 слов выполняется за 2,32 сек способ1: переменной типа Range присваивается диапазон Range ("Table1") и поиск осуществляется через обращение к этой переменной
Каким способом на порядки быстрее осуществлять поиск? Какие-то есть специальные объекты для этого, это всё что я знаю
PS на всякий случай, может показать что 100раз поисков слова среди 10.000 слов за 2,32 сек итак быстро, но я скажу, НАДО быстрее, потому что мои другие объёмы массивов и число поисков превышают на порядки это всё
Sub qq()
Dim X_find As String, xx As Long, xx1 As Double, xx2 As Double, xx3 As Double, T
X_find = Cells(9, 5) ' искомое слово
xx = Cells(12, 5) ' число раз поиска
T = Time
a = Range("C2:C" & Cells(Rows.Count, 3).End(xlUp).Row).Value
For j = 1 To xx
For i = 1 To UBound(a, 1)
If a(i, 1) = X_find Then
m = m + 1: Exit For
End If
Next
Next
If m = 0 Then: MsgBox ("нет такого слова"): Exit Sub
xx1 = Application.RoundUp(Time, 2)
xx2 = Application.RoundUp(T, 5)
xx3 = Application.RoundUp((Time - T) * 100000, 2)
MsgBox ("найдено за " & xx3 & " сек")
End Sub
Без разницы. Скорость выполнения макроса зависит от количества обращений к ячейкам листа. В идеале - это забрали диапазон в массив, обработали и выгрузили на лист.
tod2020, На полное соответствии слова - в разы, а при использования InStr отличие по скорости будет варьироваться не значительно и несколько зависеть от конфиги компа.
' ==========ПОИСК ЧЕРЕЗ ОБРАЩЕНИЕ К ПЕРЕМЕННОЙ СОДЕРЖАЩЕЙ ДИАПАЗОН==========
Sub find2()
Dim xx1, xx2, xx3 As Double
Dim Rng As Range, arr(), cell
arr = Range("Table1").Value
X_find = Cells(9, 5) ' искомое слово
xx = Cells(12, 5) ' число раз поиска
T = Timevbb:
For Each cell In arr
If cell = X_find Then
m = m + 1
End If
Next cell
If m = 0 Then: MsgBox ("нет такого слова"): Exit Sub
If m < xx Then: GoTo vbb
xx1 = Application.RoundUp(Time, 2)
xx2 = Application.RoundUp(T, 5)
xx3 = Application.RoundUp((Time - T) * 100000, 2)
MsgBox ("найдено за " & xx3 & " сек")
End Sub
Есть словари, поиск в словаре по ключу - наверняка будет быстрее чем перебор всего массива, возможно можно сделать индексацию массива или бинарный поиск (к примеру преобразовав символы юникода в число, число должно искаться быстрее - в теории).
tod2020, все зависит от вашей конечной задачи, поиск по отсортированному массиву значительно быстрее, к примеру пройтись Match-ом, или использовать словарь или другие способы, которые применимы к вашей конечной задаче.
' ==========ПОИСК ЧЕРЕЗ ОБРАЩЕНИЕ К ПЕРЕМЕННОЙ СОДЕРЖАЩЕЙ ДИАПАЗОН==========
Sub find2()
Dim i&, X_find$, cell, m&
Dim arr(), dic1 As Object, xx&, t As Date
Set dic1 = CreateObject("Scripting.Dictionary")
arr = Range("Table1").Value
X_find = Cells(9, 5) ' искомое слово
xx = Cells(12, 5) ' число раз поиска
t = Timer
For Each cell In arr
dic1.Item(CStr(cell)) = 0
Next cell
For i = 1 To xx
If dic1.exists(X_find) Then m = m + 1
Next i
Debug.Print m
If m = 0 Then: MsgBox ("нет такого слова"): Exit Sub
Debug.Print m
MsgBox Format(Timer - t, "0.000")
End Sub
MCH написал: UPD: Сразу не увидел, но данный способ уже предложил bedvit
Михаил, перечислил несколько Но пока не дождался от автора темы конечного варианта задачи. Если данные все время меняются, то индексация или сортировка каждый раз - это жирно, смотреть на словари, если статистические - сортировка массива и Match с последним аргументом 1 или -1 (интервальный просмотр), глянуть на бинарный поиск, если в поставленных рамках задачи, то можно запоминать последний найденный элемент и с него вести поиск в массиве, 100 раз - будет быстрее в разы.. и т.д.