Страницы: 1
RSS
Нужен макрос для обработки таблички библиотеки, Поиск значения по столбцам используя массив VBA не формулу
 
Мальчики, помогите пожалуйста решить задачку.

У нас в библиотеки есть база которая формируется в своей программе и выгружается в excel ежедневно.
Требуется наладить процесс обработки этой базы.

Задачу я описала внутри приложенного файла.
Там видимо нужен массив и его обработка, только не формулой, а именно VBA.

Формула массива у меня уже получилась, но прошу именно в VBA!

Помогите пожалуйста  :)
Изменено: МашА - 10.01.2013 10:19:53
 
Потестируйте  :)
Учимся сами и помогаем другим...
 
Хм... Этот код можно ускорить, если взять значения [M7], [M6] и [M8] в переменные и сравнивать с переменными, а не лезть на каждой строке по 2 раза на лист, а потом ещё и третий раз.
Да и AND я обычно заменяю вложенными IF-THEN - так быстрее.
А OR можно заменить на SELECT CASE - тоже будут проверяться не все критерии, а до первого совпавшего.

Глубже не вникал, т.к. не вполне понял задачу :)
 
По первому пункту: я тоже об этом думал, но забыл и выложил такую версию :-)
про то, что If-Then и SELECT CASE быстрее AND и OR я не знал - учту на будущее. Спасибо!
Учимся сами и помогаем другим...
 
Про скорость самого SELECT CASE я точно не знаю, но допустим если в строке 10 последовательных OR - то они все должны провериться. А из 10 условий SELECT CASE проверятся только условия до первого совпадения - и возможно это будет уже первое :)
Ну и последовательность IF-THEN тоже можно выстроить с учётом задачи - сперва проверять наиболее редкое и т.д.
Например в этой задаче - если библиотека большая (посетителей много), а клиент приходит редко - то сперва проверяем клиента, затем дату.
Если наоборот - один клиент это например все рабочие завода, но в день приходят мало - то сперва проверяем дату, а уж потом клиента.
 
Цитата
ber$erk пишет: быстрее AND и OR
в VBA механизм "ленивых вычислений" не реализован.
поэтому будет вычисляться значение выражения полностью, даже если результат однозначно определяется частью выражения.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
ber$erk: Потестируйте
Большое спасибо, работает верно.
Цитата
Hugo:
Этот код можно ускорить...Глубже не вникал, т.к. не вполне понял задачу
Hugo a можете пожалуйста вникнуть и ускорить ?

Когда я делаю 30 000 строк и ставлю искомое значение по критерия в самое начало, то сильно тормозит.
Секунд 5-7.

Если задача Вам не очень понятно я могу ещё пояснить.
Что я не ясно объяснила, скажите? Где Вас запутала?
Изменено: МашА - 11.01.2013 21:15:50
 
А это сколько считает?
Учимся сами и помогаем другим...
 
Я не понял с этими буквами-цифрами-последними.
Например, идём снизу вверх, есть совпадение параметров, и первая буква - ОК, готово?
Ну а если первая не буква - тогда запоминаем эту строку на случай, что буквы не найдём, и ищем дальше с буквой? И если букв нет, то возвращаем запомненный номер, а если будет буква, то номер строки с буквой?
Или же просто ищем последнее, не анализируя - именно так я понял из объяснения (а буквы только туману напускают :) )
 
Ищем снизу вверх по критерию Дата и Картотека.
Если первое встретившееся значение шкафа начинается с буквы, то выдаем строку, если нет, то ищем дальше с цифрой учитывая заказчика и выдаем строку где нашли.

Если ни того ни того не нашли то 0 или "".

Надеюсь так более ясно будет.  ;)

Пойду попробую вариант ber$erk с циклом. Он работает правильно, но хотелось бы альтернативу, чтоб скорость проверить!

в любом случае ber$erk БОЛЬШОЕ СПАСИБО!
 
Цитата
ber$erk пишет:
А это сколько считает?
Этот считает очень быстро на 35000 строк. Так быстро, что даже секунду не успеваю отмерить  :D  
Но все равно если Hugo не лень, для общего развития поучиться другим приемам мне бы очень хотелось.

Большое спасибо всем кто мне помогает  :)
 
Да в общем уже есть быстрое решение, другое зачем?
Можно ставить фильтр, затем перебирать отобранное - может будет чуть быстрее, может нет - но код будет сложнее.
А по условиям опять непонятно: "Если первое встретившееся значение шкафа начинается с буквы, то выдаем строку, если нет, то ищем дальше с цифрой" - т.е. первое с цифрой пропускаем, и берём следующее? А если следующее будет с буквой - его игнорировать?
 
ber$erk!

06.11.2012
9
1

Ответ 33 :D
 
Цитата
ikki пишет:
в VBA механизм "ленивых вычислений" не реализован.
надо какую-нибудь копилку знаний по VBA создать и туда запостить
Изменено: nerv - 10.01.2013 18:04:38
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Цитата
МашА пишет:
Ищем снизу вверх по критерию Дата и Картотека.
Поиск по дате должен быть упорядочен (?) - нужна последняя, при одинаковых карточке и заказчике (?)
 
Мотя, да, ответ правильный!

И соответствует задаче.

Цитата
С.М.:Поиск  по дате должен быть упорядочен (?) - нужна последняя, при одинаковых карточке и заказчике (?)

Поиск упорядочиваем по дате и карточке одновременно. При совпадении проверяем № шкафа.
Если шкаф начинается с буквы от а...я то пишем номер этой строки.
Если же шкаф просто цифровой, то проверяем а что там с заказчиком?
Если номер заказчика совпал с условием - готово . выдаем эту строку,
Если нет то ищем дальше совпадение даты и карточки и опять смотрим на заказчика пока ненайдем совпадения.
Так и не нашли совпадения 0 или ""
Изменено: МашА - 10.01.2013 21:52:34
 
Так, эта "Угадал ?" (с) (новелла "Наваждение" из к/ф "Операция Ы и другие приключения Ш.")
Кстати, Маш, А кто is Alexander Filimonov ?
 
Цитата
ber$erk: А это сколько считает?
ber$erk, у Вас в коде объявлены переменные
Код
    Dim lRow&    Dim a    Dim iDate$, iKart$, iClient$

А что означают эти символы в конце переменных

Dim lRow &
Dim a
Dim iDate $, iKart $, iClient $
Изменено: МашА - 10.01.2013 21:53:13
 
Цитата
С.М. пишет: А кто is Alexander Filimonov ?
Это брат! Он в отъезде, а мне надо срочно доделать файл.
Сказал к пиши на Planetexcel там помогут.
Изменено: МашА - 10.01.2013 21:53:58
 
Нашёл у себя ошибку:
 
Цитата
МашА пишет:
А что означают эти символы в конце переменных?
Dim lRow& - объявление переменной типа Long (для ленивых :-))
Dim iDate$ - аналогично тип string
Dim a - переменная типа Variant
Изменено: ber$erk - 11.01.2013 21:16:48
Учимся сами и помогаем другим...
 
Цитата
ber$erk пишет:
Цитата
МашА пишет:

А что означают эти символы в конце переменных

Dim lRow&
Dim a
Dim iDate$ , iKart$ , iClient$


Dim lRow& - объявление переменной типа Long (для ленивых :-))
Dim iDate$ - аналогично тип string
Dim a - переменная типа Variant

Спасибо, не знала!
 
Маша, к Вам аналогичный вопрос: зачем в данном случае полное цитирование? Да и вообще зачем тут цитирование?
Страницы: 1
Наверх