Function FindWhole(Optional ByVal sWhole As String, Optional rngColumn As Range, Optional ByVal refresh As Boolean)
Static d: Dim a, i As Long, x
FindWhole = Array()
If TypeName(d) <> "Dictionary" Then
Set d = CreateObject("Scripting.Dictionary"): d.CompareMode = 1
refresh = 1
End If
If refresh Then
d.RemoveAll
If rngColumn Is Nothing Then Exit Function Else a = rngColumn.Resize(, 1).Value
For Each x In a: i = i + 1: d(x) = d(x) & " " & i: Next
End If
If d.Exists(sWhole) Then FindWhole = Split(Trim(d(sWhole)))
End Function
Как разберетесь, можно продолжить развивать алгоритмы, а так пока в общем....
PS А если не секрет, сколько записей у Вас встречалось максимально?
Поэтому мне нужны очень вместительные и очень скоростные (по загрузке/поиску/выгрузке)уже существующие объектs VBA чтобы не стало всё нудно долго и печально
Пока словари самые лучшие. Но может существует чтото быстрее больше сильнее чем словари... Возможно гдето будут применены словари а гдето чтото другое
Повторюсь "Для тестирования части кода на скорость предложено много хороших решений. Если нужно решение практической задачи готов подключиться (в новой теме)"-пожелание Виктора и правила форума для нас закон:)
Function FindInField(Optional ByVal sWhole As String, Optional ByVal sName As String, Optional rngColumn As Range, Optional ByVal refresh As Boolean)
Static d: Dim a, i As Long, x
FindInField = Array()
If TypeName(d) <> "Dictionary" Then Set d = CreateObject("Scripting.Dictionary"): d.CompareMode = 1
If sName = "" Then Exit Function
If TypeName(d(sName)) <> "Dictionary" Then
Set d(sName) = CreateObject("Scripting.Dictionary")
d(sName).CompareMode = 1
refresh = 1
End If
If refresh Then
d(sName).RemoveAll
If rngColumn Is Nothing Then Exit Function Else a = rngColumn.Resize(, 1).Value
For Each x In a: i = i + 1: d(sName)(x) = d(sName)(x) & " " & i: Next
End If
If d(sName).Exists(sWhole) Then FindInField = Split(Trim(d(sName)(sWhole)))
End Function
Применение:
Код
Sub FindInFieldApply()
Dim a, sWhole As String, sName As String, rngColumn As Range, refresh As Boolean
sWhole = "воздевать"
sName = "СписокСлов1" 'Называете как хотите, что по этому имени к нему обращаться
Set rngColumn = Range("Table1")
a = FindInField(sWhole, sName, rngColumn)
MsgBox "Номера строк внутри диапазона: " & Join(a, ", ")
End Sub
На этом варианты с Dictionary по поиску с алгоритмом "как есть" вроде подошли к концу. Тоже можно проделать и с коллекциями, т. к. Hugo прав, что они быстрее... (почти как массивы) Дальше развитие событий ведется уже на алгоритмическом фронте. Так что можно начинать придумывать правильное название новой темы...
Мартын написал: В чём смысл сто раз искать одно и то-же в одном и том-же наборе слов???
Смысл не в этом. Ну, например, пусть это 100 поисков разных значений. Задача - ускорить много поисков. Другое дело, это зачем искать. Для разных задач могут быть быстрее те, или иные методы.
Мартын 1) на этом форуме принято обращение на Вы к незнакомым людям. 2) использовать код Димы для поиска(а фактически для фильтрации SQL запросом) да еще и в отфильтрованном столбце мягко говоря не совсем разумно. Имеет смысл только если Вы шарлатан, желающий побольше урвать при посимвольной оплате макроса Все равно, что из пушки по воробьям. Вместо всего этого нагромождения, мона без привлечения сторонних библиотек:
Код
Public Sub www()
Dim a
a = Application.Transpose([a1].CurrentRegion.Value)
a = Filter(a, "абор")
ThisWorkbook.Worksheets(2).Cells(7, 4).Resize(UBound(a)) = Application.Transpose(a)
End Sub
kuklp написал: Все равно, что из пушки по воробьям. Вместо всего этого нагромождения, мона без привлечения сторонних библиотек:
Для такого примитивного примера - да. А как насчёт "без пушки" для такого условия "а*р*ж"? Ваш пример не работает с таким условием, а мой - запросто. Да и сравнивать возможности SQL с какими-то примитивными фильтрами это как-то не в дугу. При всём уважении... Я этот вариант поставил в ознакомительных целях, дабы ТС мог ощутить всю мощь SQL. В конце-концов мы так и не в курсе, какова его конечная цель. Может и пригодится.
kuklp написал: использовать код Димы для поиска(а фактически для фильтрации SQL запросом) да еще и в отфильтрованном столбце мягко говоря не совсем разумно.
Да, ладно вам, Сергей, ворчать. Просто у очередного пользователя и участника форума открытие мира
отож. А для поиска по условию "а*р*ж" достаточно опять же одной строки с find и опять же без сторонних библиотек. По теме Сергей и написал
Цитата
SAS888 Для разных задач могут быть быстрее те, или иные методы
.
Цитата
Мартын написал: тоскливо после работы с Огнептицей наблюдать жалкие потуги слепить что-нибудь из того, что было в Ёкселе
а это уж совсем некрасиво со стороны. По мне так для банального поиска подключать ADODB это жалкие потуги Белазом перевозить авоську с пакетом молока. Я к чему - нравится Вам "Огнептица" - рад за Вас. Но на форуме по Эксель ругать этот самый Эксель ну совсем уж некошерно.
kuklp написал: Но на форуме по Эксель ругать этот самый Эксель ну совсем уж некошерно.
Можно и поругать, если объективно, но вся соль в том, что в данном вопросе отсортированный массив сделает по скорости и SQL и словари (и коллекции). ИМХО.
Мартын написал: жалкие потуги слепить что-нибудь из того, что было в Ёкселе?
Коллега, я вполне с вами согласен, что часто люди, работая с Excel, совмещают формат ввода данных, обработку и конечное представление в одном месте. Что часто плохо с точки зрения обработки. Но, увы, SQL тоже не панацея, моя "обзывалка" была посвящена собственно этому. И соглашусь с вами, что есть и некоторый не здоровый консерватизм (хотя SQL уже более 20 лет можно использовать в Excel - уже должен тоже быть консервативным способом использования) в использовании Excel. Сергей это и тебя касается с твоим Excel 2003 The Best. Кому что удобно Прикладываю пример из одной темы. Попробуйте средствами SQL в Excel найти результат по исходным таблицам. Нужно для каждого клиента из таблицы ТКлиенты подобрать нужное количество номиналов купюр из доступных в таблице ТКупюры, чтобы получить нужную сумму для клиента. Если сможете, сниму шляпу
Андрей, интересная задача. Решение жадным алгоритмом (без SQL) во вложении Правда алгоритм достаточно прост и не всегда может привести к желаемому результату.
В более сложных ситуациях распределения можно применять продвинутые алгоритмы для схожих задач: задача о рюкзаке, сумма подмножеств, упаковка в контейнеры, линейный раскрой и т.п. Думаю, что SQL предназначен не для этого.
Уважаемые коллеги! На сколько я понимаю, речь идет об ускорении поиска большого количества данных в большом количестве данных.
Например, есть две таблицы (на листах Excel). Пусть каждая из них по 100 000 строк и по 200 столбцов. Пусть в 1-ом столбце - какие-то уникальные номера. Задача: сравнить номера 1-ой таблицы с номерами 2-ой таблицы, и, при совпадении, заменить совпадающие строки 1-ой таблицы на совпадающие строки 2-ой таблицы. Естественно, что требуется это сделать максимально быстро. Предполагается, что совпадений достаточно много.
Какой бы Вы метод (способ) использовали? Коллекции? Словари? Массивы? Или еще что-то (смешанное)? Пример как раз подразумевает множественный поиск.
AAF написал: сравнить номера 1-ой таблицы с номерами 2-ой таблицы, и, при совпадении
А зачем? Списки уникальных значений 1-го столбца равны, это следует из равенства количества строк и отсутствия условия, что какие то значения этого столбца отсутствуют в одной из таблиц. Тогда зачем сравнивать? Простая синхронизация копией правильного источника. Вопрос поставлен не корректно, прям как в подписи SAS888, как хочешь так и толкуй
Андрей VG написал: Вопрос поставлен не корректно...
Согласен. Это к вопросу о том, что все зависит от конкретных условий и требований. Пусть количество строк таблиц произвольное (но большое)...
Цитата
Андрей VG написал: Если при прочих равных не описанных условиях, то быстрее всего будет сделать копирование одного диапазона в другой
Совершенно верно. Ничто не сравнится по скорости со встроенными методами Excel (сортировка и т. п.). ВЫВОД: Не зная начальных и конечных условий задачи, спорить о том, какой метод применить для наиболее рационального решения этой задачи - не имеет смысла.