Хм... Этот код можно ускорить, если взять значения [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 тоже можно выстроить с учётом задачи - сперва проверять наиболее редкое и т.д. Например в этой задаче - если библиотека большая (посетителей много), а клиент приходит редко - то сперва проверяем клиента, затем дату. Если наоборот - один клиент это например все рабочие завода, но в день приходят мало - то сперва проверяем дату, а уж потом клиента.
в VBA механизм "ленивых вычислений" не реализован. поэтому будет вычисляться значение выражения полностью, даже если результат однозначно определяется частью выражения.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Я не понял с этими буквами-цифрами-последними. Например, идём снизу вверх, есть совпадение параметров, и первая буква - ОК, готово? Ну а если первая не буква - тогда запоминаем эту строку на случай, что буквы не найдём, и ищем дальше с буквой? И если букв нет, то возвращаем запомненный номер, а если будет буква, то номер строки с буквой? Или же просто ищем последнее, не анализируя - именно так я понял из объяснения (а буквы только туману напускают )
Ищем снизу вверх по критерию Дата и Картотека. Если первое встретившееся значение шкафа начинается с буквы, то выдаем строку, если нет, то ищем дальше с цифрой учитывая заказчика и выдаем строку где нашли.
Если ни того ни того не нашли то 0 или "".
Надеюсь так более ясно будет.
Пойду попробую вариант ber$erk с циклом. Он работает правильно, но хотелось бы альтернативу, чтоб скорость проверить!
Этот считает очень быстро на 35000 строк. Так быстро, что даже секунду не успеваю отмерить Но все равно если Hugo не лень, для общего развития поучиться другим приемам мне бы очень хотелось.
Да в общем уже есть быстрое решение, другое зачем? Можно ставить фильтр, затем перебирать отобранное - может будет чуть быстрее, может нет - но код будет сложнее. А по условиям опять непонятно: "Если первое встретившееся значение шкафа начинается с буквы, то выдаем строку, если нет, то ищем дальше с цифрой" - т.е. первое с цифрой пропускаем, и берём следующее? А если следующее будет с буквой - его игнорировать?
С.М.:Поиск по дате должен быть упорядочен (?) - нужна последняя, при одинаковых карточке и заказчике (?)
Поиск упорядочиваем по дате и карточке одновременно. При совпадении проверяем № шкафа. Если шкаф начинается с буквы от а...я то пишем номер этой строки. Если же шкаф просто цифровой, то проверяем а что там с заказчиком? Если номер заказчика совпал с условием - готово . выдаем эту строку, Если нет то ищем дальше совпадение даты и карточки и опять смотрим на заказчика пока ненайдем совпадения. Так и не нашли совпадения 0 или ""