Страницы: 1
RSS
Ускорение пользовательской функции, определяющей категорию плательщика по большому справочнику
 
Добрый день!
Есть столбец с контрагентами, мне нужно определять кто они: ИП, физ.лицо или юр.лицо.
Есть лист с выгруженными юр.лицами на 250 000 позиций.
Макрос перебором смотрит есть ли там такая позиция, если нет, то, на всякий случай проверяет на наличие ООО, ЗАО, ПАО, БАНК в названии и т.д. (в настоящем макросе побольше условий). И если ничего не нашлось, то считается, что это физ.лицо. (запускал на 3000 позиций, один промах был, но для моих целей сойдет)
Так вот, но это ужасно долго, этот перебор очень медленный. Как можно перебор по этому справочнику ускорить?
ВПР в сто раз быстрей же считает. Можно, наверное, в функцию засунуть впр и если #ND, то уже проверить остальные условия...но нет ли более красивого и при этом быстрого решения?

Спасибо.
КОД
Изменено: whateverlover - 27.05.2020 22:31:27
 
whateverlover,  считать количество слов так не сильно здорово, Если предварительно пройти тримером и сравнить это и удалив все пробелы по длинне, то получите количество слов -1.
По вопросам из тем форума, личку не читаю.
 
БМВ,  спасибо!
поменяю на:
Код
qWords = Len(Trim(txt)) - Len(Replace(Trim(txt), " ", "")) + 1

А как быть с поиском по справочнику? (в справочнике, кстати, есть как юрики, так и ИП, поэтому пробую искать по первому столбцу, а тип контрагента беру уже из второго)

 
Цитата
этот перебор очень медленный. Как можно перебор по этому справочнику ускорить?
- перебирать не ячейки, а массив.
Но сперва стОит попробовать поиск. Хотя он в UDF кажется работал как у кого, но нужно бы проверить...
 
Hugo, спасибо) завтра на работе попробую на актуальных данных и поиск и массив.
 
Ещё вариант если список ФИО не меняется -
- объявляем публичный словарь (можно на уровне модуля, или статик)
- при первом вызове функции его заполняем, и используем
- при следующих сразу используем

P.S. вот вроде работает, можете мелочи шлифовать... Там с этим массивом я например прописал как проще на моём файле.
Кстати обнаружил неописанную хрень с CurrentRegion, убил на это пару минут...
Скрытый текст
Изменено: Hugo - 28.05.2020 00:22:27
 
Цитата
whateverlover написал:
поменяю на:
второй trim не нужен, с ним Replace справится.  
Код
qWords = Len(Trim(txt)) - Len(Replace(txt, " ", "")) + 1

а в идеале один раз Тримером пройти в начале обработки ,ведь потом это делается еще раз, но уже для поиска.

По поводу массива вместо листа или словаря
Код
 a = ThisWorkbook.Worksheets("Справочник ЮЛ-ИП").UsedRange.Value
- не знаю что там на листе, может есть лишние колонки, так что лучше
Код
With ThisWorkbook.Worksheets("Справочник ЮЛ-ИП")
    a = Intersect(Range("A:B"),.UsedRange).Value
End with


В идеале сравнить с ВПР , может и словарь не потребуется.
КАТПЛАТЕЛЬЩИК = WorksheetFunction.VLookup(txt, ThisWorkbook.Worksheets("Справочник ЮЛ-ИП").Range("A:B"), 2, False)

Был бы пример , был бы эксперимент.
Изменено: БМВ - 28.05.2020 08:31:38
По вопросам из тем форума, личку не читаю.
 
На моём листе нет лишних колонок :)
А вообще нужно знать как это дело будет применяться - если будет например подтягиваться для одного значения, или десятка - можно и ВПРом пройтись, не особо будет заметны потери времени.
Ну а если нужно обработать список из десятков тысяч (протянув формулу по столбцу), то думаю словарь должен вырвать очко :)
 
Цитата
Hugo написал:
Ну а если нужно обработать список из десятков тысяч (протянув формулу по столбцу), то думаю словарь должен вырвать очко
именно об это было
Цитата
БМВ написал:
может и
:D
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх