Страницы: Пред. 1 2 3 4 След.
RSS
VBA Как сделать поиск ещё быстрее?
 
Цитата
bedvit написал:
я про это ещё в постах #15 #21 #31 писал. Уже и ждать перестал ответа
подождите, погодите, я ещё не до конца разобрался и не обдумал тот массив информации что уже подсказали мне все здесь
Изменено: tod2020 - 17.08.2017 10:13:35
 
Цитата
bedvit написал:
Но на практике 100 раз одно и тоже никто не ищет и алгоритм может быть другой.
Про это я спрашивал в постах #31 и #33, но ответа внятного так и не последовало  :D  
"Все гениальное просто, а все простое гениально!!!"
 
Так культурней будет..
Код
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 А если не секрет, сколько записей у Вас встречалось максимально?
Изменено: AAF - 17.08.2017 10:25:10
 
Цитата
AAF написал:
PS А если не секрет, сколько записей у Вас встречалось максимально?
планируется для диапазона число записей между 100.000 и 1.000.000  
число диапазонов 10 -100
количество доступов к каждому диапазону 100 - 10.000 раз

и нужно видеть промежуточные результаты выводимые в ячейки эксель
Изменено: tod2020 - 17.08.2017 10:37:11
 
На счет n диапазонов беспокоитесь?
Это решаемо...
 
Поэтому мне нужны очень вместительные и очень скоростные (по загрузке/поиску/выгрузке)уже существующие объектs VBA
чтобы не стало всё  нудно долго и печально

Пока словари самые лучшие. Но может существует чтото быстрее больше сильнее чем словари...
Возможно гдето будут применены словари а гдето чтото другое
Изменено: tod2020 - 17.08.2017 10:38:13
 
Повторюсь "Для тестирования части кода на скорость предложено много хороших решений. Если нужно решение практической задачи готов подключиться (в новой теме)"-пожелание Виктора и правила форума для нас закон:)
«Бритва Оккама» или «Принцип Калашникова»?
 
Коллекции работают быстрее словаря. Но возможностей меньше.
 
А вот для N диапазонов:
Код
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 прав, что они быстрее... (почти как массивы)
Дальше развитие событий ведется уже на алгоритмическом фронте.
Так что можно начинать придумывать правильное название новой темы...  :)
 
Цитата
AAF написал:
Тоже можно проделать и с коллекциями, т. к.  Hugo  прав, что они быстрее... (почти как массивы)
Тоесть коллекции медленнее чем словари?
 
Быстрее, но операции по их обслуживанию больше и там нужно смотреть на структуру Вашей задачи...
Изменено: AAF - 17.08.2017 11:21:28
 
Быстрее всего будет найти 1 раз и умножить 1 на 100. :)
В чём смысл сто раз искать одно и то-же в одном и том-же наборе слов???
 
Мартын, в случае обновления таблицы:
Код
Optional ByVal refresh As Boolean

А так :
Код
Static d
 
Цитата
Мартын написал:
В чём смысл сто раз искать одно и то-же в одном и том-же наборе слов???
Смысл не в этом. Ну, например, пусть это 100 поисков разных значений. Задача - ускорить много поисков.
Другое дело, это зачем искать. Для разных задач могут быть быстрее те, или иные методы.
Изменено: SAS888 - 17.08.2017 12:13:10
Чем шире угол зрения, тем он тупее.
 
Цитата
SAS888 написал:
Ну, например, пусть это 100 поисков разных значений
Разные значения могут искаться в одном массиве один раз, только нужно из этих разных значений создать массив.
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
SAS888 написал:
могут быть быстрее те, или иные методы.

Если речь зашла о поиске, то смотри такой вариант. Пусть и не самый быстрый, но возможности у него огромные.
см.на втором листе :)
Изменено: Мартын - 17.08.2017 12:59:34
 
Мартын
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 написал:
использовать код Димы
Его там только функция создания соединения. Свою писать лень, да и смысла нет, она будет такой-же, а благодарность ему, она указана.
Цитата
kuklp написал:
да еще и в отфильтрованном столбце
Для запроса это без разницы.
Цитата
kuklp написал:
Все равно, что из пушки по воробьям. Вместо всего этого нагромождения, мона без привлечения сторонних библиотек:
Для такого примитивного примера - да. А как насчёт "без пушки" для такого условия "а*р*ж"?
Ваш пример не работает с таким условием, а мой - запросто. Да и сравнивать возможности SQL с какими-то примитивными фильтрами это как-то не в дугу. При всём уважении...
Я этот вариант поставил в ознакомительных целях, дабы ТС мог ощутить всю мощь SQL. В конце-концов мы так и не в курсе, какова его конечная цель. Может и пригодится.
 
Цитата
Мартын написал:
А как насчёт "без пушки" для такого условия "а*р*ж"?
пригодиться точно
 
Доброе время суток.
Offtop
Цитата
kuklp написал:
использовать код Димы для поиска(а фактически для фильтрации SQL запросом) да еще и в отфильтрованном столбце мягко говоря не совсем разумно.
Да, ладно вам, Сергей, ворчать. Просто у очередного пользователя и участника форума открытие мира
Цитата
Мартын написал:
дабы ТС мог ощутить всю мощь SQL
Апологет, так сказать...  :D
 
Цитата
Андрей VG написал:
Апологет, так сказать..
А представляете как тоскливо после работы с Огнептицей наблюдать жалкие потуги слепить что-нибудь из того, что было в Ёкселе?
 
Цитата
Андрей VG написал:
Апологет, так сказать...
отож. А для поиска по условию "а*р*ж" достаточно опять же одной строки с find и опять же без сторонних библиотек. По теме Сергей и написал
Цитата
SAS888 Для разных задач могут быть быстрее те, или иные методы
.
Цитата
Мартын написал:
тоскливо после работы с Огнептицей наблюдать жалкие потуги слепить что-нибудь из того, что было в Ёкселе
а это уж совсем некрасиво со стороны. По мне так для банального поиска подключать ADODB это жалкие потуги Белазом перевозить авоську с пакетом молока. :D Я к чему - нравится Вам "Огнептица" - рад за Вас. Но на форуме по Эксель ругать этот самый Эксель ну совсем уж некошерно.
Я сам - дурнее всякого примера! ...
 
Цитата
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-ой таблицы.
Естественно, что требуется это сделать максимально быстро. Предполагается, что совпадений достаточно много.

Какой бы Вы метод (способ) использовали? Коллекции? Словари? Массивы? Или еще что-то (смешанное)?
Пример как раз подразумевает множественный поиск.
Изменено: SAS888 - 18.08.2017 10:21:40
Чем шире угол зрения, тем он тупее.
 
Цитата
SAS888 написал:
Пусть каждая из них по 100 000 строк и по 200 столбцов.
SAS888, Если при прочих равных не описанных условиях, то быстрее всего будет сделать копирование одного диапазона в другой
Код
Workbooks("Book1").Worksheets("Sheet1").UsedRange.Value = Workbooks("Book2").Worksheets("Sheet2").UsedRange.Value
:)  Ну, или удалить в получателе старый лист, и скопировать из источника требуемый лист с последующим переименованием.
Или вы что-то не договариваете.
 
Андрей VG, ну не договаривать можно, скажем...
Цитата
SAS888 написал:
сравнить номера 1-ой таблицы с номерами 2-ой таблицы, и, при совпадении
произвести процедуру по обработке этих строк для получения результирующей(не замена).
Что-то, типа, они клиенты, а я сервер... :)
Изменено: AAF - 18.08.2017 10:52:58
 
Цитата
AAF написал:
сравнить номера 1-ой таблицы с номерами 2-ой таблицы, и, при совпадении
А зачем? Списки уникальных значений 1-го столбца равны, это следует из равенства количества строк и отсутствия условия, что какие то значения этого столбца отсутствуют в одной из таблиц. Тогда зачем сравнивать? Простая синхронизация копией правильного источника. Вопрос поставлен не корректно, прям как в подписи SAS888, как хочешь так и толкуй :)
 
Цитата
Андрей VG написал:
Вопрос поставлен не корректно...
Согласен. Это к вопросу о том, что все зависит от конкретных условий и требований.
Пусть количество строк таблиц произвольное (но большое)...
Цитата
Андрей VG написал:
Если при прочих равных не описанных условиях, то быстрее всего будет сделать копирование одного диапазона в другой
Совершенно верно. Ничто не сравнится по скорости со встроенными методами Excel (сортировка и т. п.).
ВЫВОД: Не зная начальных и конечных условий задачи, спорить о том, какой метод применить для наиболее рационального решения этой задачи - не имеет смысла.
Изменено: SAS888 - 19.08.2017 05:13:46
Чем шире угол зрения, тем он тупее.
Страницы: Пред. 1 2 3 4 След.
Наверх