Недавно потребовался инструмент, который загружает и фильтрует данные из разных Excel-файлов. Решил сделать GUI для формирования условий для данного фильтра. Пока это выглядит вот так
GUI можно использовать из библиотеки COM или XLL. Возвращает массив условий для фильтра и строку для пользователя для удобства.
sokol92, Владимир, спасибо за доп. информацию. Остались нераскрыты несколько пунктов по ссылке: 1. "If either <expression> or <like-pattern-expression> is Null, the result is Null." Видим что не всегда выполняется, пример:
Код
Debug.Print "" Like "[]" 'True. По ссылке: <expression> is Null, значит результат Null, т.е. False
2."<like-pattern-charlist-range>: This adds a range of characters to the character list, including all characters considered greater than or equal to the first <like-pattern-charlist-char> and considered less than or equal to the second <like-pattern-charlist-char>. If the end character of this range is considered less than the start character, runtime error 93 (Invalid pattern string) is raised." Видим что условие выполняется в примере ниже, последний символ НЕ больше первого, но выдается ошибка, пример:
Код
Debug.Print "F" Like "*[F-F]" 'почему Error? ведь True
3.Ничего не поясняется про такой пример:
Код
Debug.Print "5" Like "*[1-4-6]" 'True - диапазон с конца маски?
Debug.Print "2" Like "[1-4-6]" 'True - диапазон с начала маски?
Debug.Print "-" Like "[1-2-3]" 'почему True? ведь "-" не в начале и не в конце.
4."The next characters in <like-pattern-expression> do not form a valid, complete <like-pattern-element> according to the grammar. In this case, runtime error 93 (Invalid pattern string) is raised. Note that this runtime error is only raised if no other result has been produced before pattern matching proceeds far enough to encounter this error in the pattern."
Код
Debug.Print "F" Like "F[" 'почему False, а не Error?
Это стало понятно из тестов, что маска проверяется не всегда до конца, что приводит пользователя в замешательство, когда одна часть результатов False, другая Error 93. Лично вижу, что проверка маски до конца более правильный вариант, в ущерб снижения скорости выполнения для проверки оставшийся части маски. Здесь вопрос к обсуждению, что предпочтительнее: скорость или гарантированная ошибка при некорректной маске? Опрос: Что для вас важнее?
Дмитрий приветствую! Как хочет, так и сравнивает...и с начала и с конца...пример:
Код
Debug.Print "5" Like "*[1-4-6]" 'True - диапазон с конца маски
Debug.Print "2" Like "[1-4-6]" 'True - диапазон с начала маски
Поясню почему возникла эта тема. В С++ нет такого оператора. Я решил максимально точно воспроизвести Like VBA, но у меня не получилось воссоздать этот гениальный алгоритм, где нет четкой парадигмы. Где-то возвращает False, вместо ошибки, где-то True!!! (см. пост 1), где-то считает в одном контексте, где-то в другом, при одинаковой маске или одинаковых строках разные результаты... Где-то маска с открытой скобкой - ошибка "[...", где-то не ошибка (см. сообщение 3) и т.д.
Плюнул, сделал свою реализацию, где [1-4-6] считается валидной маской, всегда считается слева направо, как в регулярках, а не как в Like VBA (в одних случаях с конца, в других с начала, поди угадай какой должен быть результат - см. выше в этом сообщении) . И маска всегда проверяется на закрытую скобку и корректность диапазона "[a-b]" (первый символ не может быть больше последнего, но может быть равен - как в регулярках, в LIke может быть равен, а может быть и ошибка, см. пост 1). т.е. алгоритм должен предполагать только единственный точный валидный! результат, без экстрасенсов и гадалок или возвращать ошибку!
Мое почтение, джентльмены. Нужны ли сейчас в Excel современные (имеют POSIX-классы. Обратный поиск и другие фичи не тестировал.) регулярные выражения? В ассортименте: Поиск, вывод нужных символов, замена. Функционал из стандартных C++ библиотек. Не самописные (да я бы и не смог такой сложности проект быстро сделать, да и не быстро тоже) К примеру:
nilske, если прочитать мое сообщение 5, то там есть выдержка из спецификации, где написано, почему должно вернутся False (потому что "-" не в начале и не в конце charlist). А возращается True. Поэтому я и спрашиваю, почему так? Где проблема?
nilske, Вы считаете, что Like работает неправильно? И считаете, что это обсуждать не нужно? Т.е. работет неправильно, ну и ладно, че обсуждать-то, верно? Правильно ли я вас понял?
nilske, осталось... читаю спецификацию: "Дефис ( - ) может стоять либо в начале (после восклицательного знака, если он используется), либо в конце charlist , чтобы соответствовать самому себе. В любом другом месте дефис используется для обозначения диапазона символов." Пишу код:
ZVI, Владимир, приветствую! Цель вопроса? наверное пообщаться, выйти покурить в перерыв между работой (я не курю, но здесь-то можно в курилке?)
Цитата
ZVI написал: символ в диапазоне "[1-4]" ИЛИ символ "-" ИЛИ символ "6"
Да все верно, это валидный паттерн для старщего брата - Регулярных выражений. Можно проверить на https://regex101.com/ Собственно складывается впечатление, что Like писали спустя рукава, начали видимо хорошо, паттерны 1-2,3 выполняются с таким же итогом как и итог регулярных выражений... Потом что-то пошло не так (что-то не смогли?) или решили, а и так хватит... давайте сделаем ограничение на это ("-" разделитель только в конце или в начале, что в регулярках не обязательно), да и норм... Сомнительно... но Окей... Смотрим далее
Код
Debug.Print "F" Like "[" 'Error
Debug.Print "" Like "[" 'почему False?
Первый паттерн явно ошибочен, не закрыта скобка. Все понятно - ошибка. А второй возвращает False, т.е. маска норм, вопросов не вызывает? Смотрим регулярки - во всех двух случая ошибочная маска - ошибка (там же на сайте regex101 можно проверить, для всех языков)
Хорошо, специалисты говорят, не надо смотреть ругулярки, смотри спецификацию к оператору Like и не выдумывай лишнего... Если петтерн не соответствуеn спеке - это все UB...
Ну Ок говорю я, а где в спеке написано что задать диапазон следующим образом [F-F] ошибка? И почему если это ошибка, не выходит сообщение в VBA? Я вижу в спеке лишь ошибку, если первое значение больше второго (должно быть в возрастающем порядке) ..."[A-Z] является допустимым шаблоном, но [Z-A] не является."... Если ошибка, зачем возвращается True (я понимаю еще False вместо ошибки, но тоже так себе)? Т.е. все валидно и даже положительный результат сравнения!
Что в итоге: абы как составленный инструмент, где -то возвращающий False, вместо ошибки, где-то True!!!, где-то считает в одном контексте, где то в другом при одинаковой маске или одинаковых строках.
Мое почтение, джентльмены. Есть интерес послушать специалистов, почему Like в варианте 3 выдает True, а в последнем варианте ошибку?
Код
Sub TestLikeERR()
Debug.Print "-" Like "[1-4-6]" 'True
Debug.Print "5" Like "[1-4-6]" 'False
Debug.Print "5" Like "*[1-4-6]" 'почему True?
Debug.Print "F" Like "[F-F]" 'True
Debug.Print "F" Like "*[F-F]" 'почему Error?
End Sub
Настолько впечатлен этим инструментом, что разместил вопрос и здесь.
romaro, мне тоже интересна эта тема. Поиск ответа по этому вопросу привел меня к тому, что в России сейчас нельзя для физ. лиц купить Code Signing сертификат. Самоподписанный сертификат - сейчас это больше минус, чем плюс. Не советую. Я делал самоподписанные сертификаты, итоги отрицательные, если использовать не только в своей компании, где вы можете поместить его в доверенные на каждом ПК, а распространять свой продукт во внешний мир. Самоподписанный сертификат, просто не даст Excel открыть вашу надстройку или dll без добавления его в доверенные. А добавлять на его на свой ПК будет не каждый пользователь.
Chernyshov, что у вас конкретно не получается? В моем ответе ссылка на инструмент, на странице этого инструмента есть описание и видео. Если вам это подходит, там же по ссылке можно перейти и скачать настройку для Excel. Установить ее и пользоватся этим инструментом. На каком этапе у вас возникли проблемы? Все ссылки рабочие
artemkau88 написал: Файл весит больше 2,5гБ. Железо: 4 гБ оперативки и 2-х ядерный процессор (виртуалка). Время работы - 15 минут. Но это без учета операций записи в файл с результатом.
При документированной скорости чтения SSD - 450 Мб/с, 10 ГБ читается за 22,2 сек, что близко к скорости поиска (25,45 сек. с отключенным кешированием - 40 млн.строк, ищем последнюю).
bastepa написал: Может есть способ обновить в win7 "алгоритмы компрессии compressapi.h " ?
Это Win Api. Там же, по ссылке, написано Minimum supported client Windows 8.
Т.е. это вопрос не ко мне, а к Microsoft, почему они не завезли в win7 данные api
Таким образом версия для win7 не сможет открывать упакованные файлы сохранений или зашифрованные данные листа Excel, если в них было сжатие. Штатная версия может читать и сжатые данные и не сжатые, в т.ч. созданные в версии для win7. Т.е. совместимость в одну сторону (штатной версии). Файл пользовательских сохранений можно явно сохранить без сжатия, тогда он откроется и версии win7 и в штатной. Зашифровка ячеек Excel сложнее, здесь алгоритмы сжатия включаются, если сжатый текст меньше не сжатого, т.е. после какого-то количества символов в ячейке. Другими словами короткий текст и формулы скорее всего не будут сжиматься, т.е. смогут расшифровываться в обеих версиях. На длинных текстах, скорее всего версия win7 не сможет расшифровать данные. Длинна данного текста или формулы не тестировалось, нужно смотреть на практике (при какой длине включается сжатие).
На этой конфигурации должны работать две версии (и специальная для win7 и обычная). Лучше использовать обычную, там есть алгоримы компрессии/сжатия данных (меньше размер сохраняемых и зашифрованных данных).
testuser написал: Да уж это просто та штука, которой выстрелили в ногу бейсику, тупой сборщик мусора, но бейсик, видимо на это и не рассчитывался будучи "бейсиком", даже учитывая гениальность его архитекторов..
Бейсик здесь не причем. В любом ЯП есть штатные механизмы выделения и освобождения памяти. Если вы идете своим путем - будьте добры сами контролировать этот функционал (в Си/С+ в такой парадигме получите битые или висячие указатели, утечку памяти и в Шарпе сборщик мусора не поможет). Но за пробы пера плюсую, главное в прод не выводить, здесь полностью согласен с Владимиром (ZVI).
ZVI, Владимир, а если убрать зануление массивов в деструктор класса (VBA) (Class_Terminate())? что быстрее вызывается деструктор класса или очистка всех переменных модуля тестового кода? Будет ли в таком случае ошибка