Hugo написал: А у нас не хватает всех наших мощностей чтоб угадать что вообще нужно
масса данных = 2 столбца: слева текст1 и справа текст2 в виде = (диапазон, массив, словарь. коллекция,......)
x_find= (*ол*ко *во*ач*ва*) (изначальная фраза "только поворачивайся") отыскать x_find в текст1. Установить соответствующий найденному текст 2 поиск был максимально быстро
для следующего объема у "масса данных" число строк = 100.000...1.000.000 число таких "масса данных" = 10...100 количество доступов к каждому диапазону 100...10.000 раз
Насколько я понял искомое слово отредактировать нельзя? Даже учитывая огромный массив данных по ячейке формула отработает достаточно быстро. Хотя странно у меня ни if like не отработал, ни "=" зато .find(x_find) работает аж бегом. Но это все к словарю не прикрутишь (
Sub uuu()
Dim a()
Dim i&
'-----------
a = Range("Table1").Value
For i = 1 To UBound(a)
If a(i, 1) Like Cells(9, 3) Then
Beep
MsgBox a(i, 1)
End If
Next
End Sub
В данном случае массив не будет менять своего размера, но будет использоваться для поиска, поэтому это наиболее быстрый способ. А найденные совпадения Вы можете в словарь.
Sub ffffffff()
Dim a, x, i As Long
'как-то получили массив a
i = 0
For Each x In a 'For Each ... быстрее, чем For ... To... Даже с учетом i=i+1. А то Вы используете For to там где в этом нет необходимости.
i = i + 1
If d.exists(x) Then d(x) = d(x) & " " & i Else d(x) = i
Next
'Теперь у Вас есть Dictionary с уникальными значениями по Key
For Each x In d.Keys 'Прозваниваем по Key, ведь d.Keys - массив
'Если ошибки ситематические(т.е. имеют частые повторения), то этот способ принесет скорость.
'Если нет, то лучше по массиву сразу без создания Dictionary. Разница по времени может быть значительной
If k Like "*ол*ко *во*ач*ва*" Then s = s & "|" & k
Next
aRes = Split(s, "|") 'получаем массив "как есть" соответствий ожидаемому условию начиная с нумерации = 1
End Sub
tod2020, везде есть инструменты, у которых свои свойства и методы, и если их изучать, то постепенно придет понимание того что и от кого ждать, а так просто, быстро получить что-то не получиться... Перебор массива это самый быстрый способ, если б не словарь, например, но запись в словарь медленней, чем массив и т. д. Коллекция быстрей словаря, но ней нельзя многого того, что можно со словарем... Объект у которого есть метод типа obj("*ол*ко *во*ач*ва*") будет в чем-то медленней, но заточен для другого по своим возможностям и т. д.
tod2020 написал: может тут звездочку на какой-то спец символ заменить и exist сообразит что от него хотят
Тут пишут, что проект в думу вносят для признания равнозначности похожести, в силу существующих отказов людям считать документы, например, с именами Наталья и Наталия, равными. А вы хотите от простого в сущности объекта, работающего с понятиями уникальный ключ и его значение, того же, что и человек не всегда готов сделать. Google на таком поиске осмысленного вырос в гиганта (ну, может и не только на этом). Увы, в VBA, чтобы в массиве быстро искать похожее, нужно будет строить достаточно сложную конструкцию, или медленно - полный перебор.
я не хочу верить в безвыходность Может переменной присвоить результат какого нибудь оператора типа Like ("*ол*ко *во*ач*ва*") и по этой переменной искать??
tod2020 написал: ипа Like ("*ол*ко *во*ач*ва*") и по этой переменной искать??
Искать где? Как искать в массиве вам предложил kalbasiatka, как средствами Excel - Илья Демид Но и то и другое - это полный перебор всех исходных фраз на тест - удовлетворяют ли шаблону.
tod2020 написал: методом exist в 1000 раз быстрее чем Each
А как связаны два метода exists и Each? У них по сути разные задачи. и exists обычно используют в цикле, если необходимо найти более одного соответствия!
"Все гениальное просто, а все простое гениально!!!"
Можно при занесении в словарь сразу анализировать на это Like ("*ол*ко *во*ач*ва*") и заносить не сам ключ, а результат анализа. Только вот зачем? Если сразу известно что это значение годится - сразу его и берите, зачем его потом искать в словаре? Единственный смысл вижу такой - есть например десяток (или сотня) разных "Like ("*ол*ко *во*ач*ва*")", причём неизвестно что когда именно будем искать (например юзер будет выбирать из предложенного списка, а словарь уже "набит"), тогда можно при наполнении словаря сразу проанализировать и разложить например по ключам 1 - 100 эти значения. Затем когда нужно найти например что Like ("*ал*ка *ва*ач*ва*") (т.е. №25) - берём из словаря всё что собрано для ключа 25.
здесь я говоря про Each я говорю о цикле с использованием Each метод Item быстрее в 1000 раз по сравнению с перeбором с помощью цикла с использованием Each
Если хотите перебрать все ключи - быстрее перебирать массив, словарь не нужен. Если из всего массива позже нужно отобрать несколько (или одно) КОНКРЕТНОЕ значение - тогда есть смысл в словаре.
планируется для диапазона(переведенного в словарь например) число записей между 100.000 и 1.000.000 число таких диапазонов 10 -100 количество доступов к каждому диапазону 100 - 10.000 раз
нужно мегамоментальное поисковое и когда ещё идет поиск по неопределнным буквам и даже пропущенным словам
Можно увидеть code Item который создали программисты VBA и подкорректировать или создать свою функцию? словарь это же наверно обыкновенный arrey и применить к обкновенному arrey поисковую лоигку(которую наверно оттачивали десятилетиями) взятую из Item с возможностью Like
tod2020, я скопировал Ваш "словарь" пока не стало 0,5млн+ записей и протестировал на следующем коде:
Код
Sub FindLike()
Dim a()
Dim l As Long
Dim dic As New Dictionary
Dim t As Long
Dim sFind As String
t = Timer
a = [A2:A524289].Value2
sFind = Cells(9, 3)
For l = 1 To UBound(a)
If a(l, 1) Like sFind Then
dic.Add l, a(l, 1)
End If
Next
Debug.Print (Timer - t) * 1000
End Sub
На домашнем компьютере это заняло 1,5 секунды, на сервере это будет куда быстрее. Не знаю на чем и к каким скоростям Вы стремитесь, но все-таки похоже, что Вы выбрали не тот инструмент.