Страницы: 1 2 След.
RSS
Форма с поиском по маске. Как найти и получить одно или несколько значений
 
Доброго времени суток, Планетяне!

==================================================
Изначально эта была тема об альтернативе инструменту "Выпадающий список с автопоиском" из версии PLEX 2019.1 от 10 августа 2019 г., но после было решено обобщить тему до принципа работы формы (передача, поиск и возврат данных).

Спасибо всем, кто помогал и продолжает это делать на нашем любимом форуме!  :idea:
Отдельная благодарность за постоянные улучшения и объяснения Alemox  ;)

Изменение, адаптация и усовершенствования формы под конкретные задачи - в личку

Последняя версия: 1.7: «All-In-One» от 04/09/2019
==================================================

Инструменты, работающие на основе такой формы (начаты по ссылкам, но впоследствии объединены тут в ОДНУ надстройку):
Фильтр по активному столбцу
Поиск и вставка значений активного столбца

Ссылки:
Альтернатива выпадающему списку (форма с поиском)_2 [GIG_ant] из Копилки
nerv_DropDownList (описание + открытый код)
Форма с поиском. Как наполнить форму, искать по ней и вставлять данные
Формы. Как заполнять одну и ту же форму (ListBox) разными данными в зависимости от выделения
Пользовательские формы. Создание прокрутки по-горизонтали (ScrollBar Left/Right)
Формы. Как исправить "обрезанное" отображение данных в ListBox
==================================================
Выставляю на общий суд и для активного использования форму для поиска по активному столбцу. Форма очень шустрая.

ОБЩИЙ ПРИНЦИП ДЕЙСТВИЯ
    1. при запуске макроса, берутся все ячейки столбца кроме пустых (длина строки = 0) и ячеек-прочерков (значение ячейки = СИМВОЛ(151))
    2. Формируется одномерный массив (LBound=0) уникальных значений
    3. Массив сортируется и выводится в форму
    4. В строке поиска (маска) из служебных символов работает только "*" (любое количество любых символов). Остальные («arrSym()») будут удалены.
    5. Маска по-умолчанию ищет БЕЗ учёта регистра и по всей строке: маска = "*" & маска & "*"
    6. Наличие ведущей "*" можно регулировать кнопкой "искать по всей строке"
    7. В активную ячейку можно вставить одно или несколько (будут сцеплены через "; ") значений
    8. Выделить несколько значений можно, зажав ЛКМ или через Ctrl. Работает отмена выделения.
    9. Можно ничего не выделить, тогда будет предложено вставить ВСЁ, что отсеяно маской (видно в окне) на текущий момент

ЧТО НУЖНО ДЛЯ РАБОТЫ: скопировать модуль и форму (перетащить мышью в редакторе) из файла-примера у свой

ПРИМЕР ВЫЗОВА: "ФормаПоискаПоАктивномуСтолбцу". В данном файле срабатывает по даблклику (событие листа)
Модуль
Форма
Вдохновлён автором сайта (обновление PLEX), обучен на данном форуме  :D
Изменено: Jack Famous - 21.06.2020 14:19:40
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Обновление или просто ещё вариант
1. форма переделана для выбора ОДНОГО значения из списка даблкликом
2. ускорен цикл сбора данных за счёт For Each
3. убрана проверка на прочерк (=СИМВОЛ(160)). Кажется, только я их использую  :D
4. Value2 заменён на Value, чтобы более корректно отображалась дата (со временем сложнее)
5. запуск макроса по даблклику теперь "повешен" на всю книгу и сработает в любом месте
Модуль
Форма
Изменено: Jack Famous - 19.08.2019 22:56:00
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, круто.
Заметил небольшой неудобный или удобный (кому как) нюанс.
- Вызываем форму пишем например "тру"
- Выбираем любую строку щёлкаем по ней она вставляется
- Опять вызываем фору
- там уже написано "тру"
- пишу вместо тру "хол"
- нажимаю Esc
- Вместо выхода из формы появляется "тру"
- нажимаю ещё раз Esc и уже выхожу

Если так задумано, то ладно, коли нет, то можно решить эту проблему запихав Esc в другую процедуру
Код
Private Sub tb_mask_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 27 Then Unload Me
End Sub


Ещё для удобства сделать Форму, чтобы мошой растягивать на нужный размер за уголок или за край. (в примере реализовал в приложении). Тем самым исчезает проблема с горизантальной прокруткой которую обрезает.
В примере Esc перекинул тоже.

Ещё когда набираешь в строке поиска, до результатов приходится рукой тянуться. Удобнее нажать стрелку вниз и ты сразу по Listbox перемещаешься. (В примере реализовал).
Ну и коли мыша мешает когда выбрал охото нажать Enter, а не два раза клацать по дохляку. (тоже в примере реализовал).
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Jack Famous, PaRADoX - это о чем?
 
vikttur, я думаю это что-то типа такого
P - (Paste) вставка
a - (Active) в активную
R - (Row) строку
A - (alternative) альтернативных
D - (data) данных
o - (overnight) внезапно
X - Либо версия 10, либо от слова Xerox - скопировано из базы данных
:)
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
"Сформировать список из всего видимого?" - но на экране может быть видима только часть отфильтрованных строк.
 
Цитата
Alemox: неудобный или удобный (кому как) нюанс
это был баг, а не фича  :D
благодарю за отзыв, поправки и "допиленную" версию — если не все, то большинство точно приму в работу  :idea:
P.S.: расшифровка никнейма - бомба  :D
UPD: отловил ошибку при при растягивании формы (слишком сильно сужение; см. скрин). Поправлю не раньше завтра/послезавтра (не сталкивался, но, думаю, ничего сложного)…

Цитата
vikttur: PaRADoX
это мой никнейм ващет)) как-то хотел и тут сменить, но сошлись (с вами или с Юрием) на том, что не стоит. В названии темы фигурирует, потому что это не просто моя тема, а вроде готового решения. По нему будет всегда просто их найти
Цитата
vikttur: на экране может быть видима только часть
справедливо, благодарю. Заменю на что-то типа "сформировать список из всех отфильтрованных"…
Изменено: Jack Famous - 17.08.2019 13:03:09
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
слишком сильно сужение
. Да, слишком увлекаться не надо. Обычно ставлю ограничение. Тут просто как пример не стал. Добавить надо ограничение на минимальный размер UsrForm.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Jack Famous написал:
это мой никнейм ващет
И зачем его в название темы?
 
Юрий М, я же написал)))
Цитата
Jack Famous: В названии темы фигурирует, потому что это не просто моя тема, а вроде готового решения. По нему будет всегда просто их найти
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Джек, другие пользователи будут искать по нику, который никому ничего не говорит или по задаче?
Если Вы про свой поиск - добавьте тему в своё избранное.
Удивляюсь, что нужно Вам это объяснять...
 
Доброго времени суток. Макрос не плохой, работает быстро и только... Для чего он предназначен - не понятно.  Вот если он фильтровал по выбору сразу данные на активном листе - вот тогда да, БОМБА!!!  Как правило приходится изгаляться в больших таблицах это сделать. А так вставить отфильтрованное... это можно и простым копированием... И еще.... в Вашу таблицу вставил 50 000 строк с текстом, так вот макрос по двойному клику не работает на вставленных строках, а только на изначальных, хотя  уже в окне макроса вставленные строки видны и поиск работает. Как вставить больше одной позиции так и не понял: ЛКМ не удалось выделить, через CTRL не работает....
 
Jack Famous, Алексей, а почему не запросом SQL? В одном флаконе и фильтр и сортировка и  уникальность в результирующем recordset.
По вопросам из тем форума, личку не читаю.
 
Цитата
Юрий М: другие пользователи будут искать по нику, который никому ничего не говорит или по задаче?
по нику мной создано немало тем, а тех, что с "готовым решением" пока только одна. Таким образом, указание моего основного никнейма, используемого в том числе при разработке, даёт очень важный тэг для поиска. Считаю это важным для порядка. Абсолютно не против, если вы перенесёте PaRADoX из названия темы в описание (вторая строка при создании темы), но как по мне и так неплохо
Цитата
Юрий М: добавьте тему в своё избранное
обычно я добавляю свои темы в закладки, так что это вопрос решён, а вот организация подписок (про избранное не скажу) тут как-то не очень…

Цитата
voxik-24: Для чего он предназначен - не понятно
достаточно прочитать название темы "Поиск и вставка значений в активном столбце"  ;)
Цитата
voxik-24: Вот если он фильтровал по выбору сразу данные на активном листе - вот тогда да, БОМБА
см. пункт 1 - название темы. К слову, его очень легко можно "прикрутить" для фильтрации - у меня как раз одна из таблиц имеет такой инструмент на основе этой формы
Цитата
voxik-24: в Вашу таблицу вставил 50 000 строк с текстом…
всё нормально работает, если использовать по назначению. Потрудитесь прочитать 2 первых поста и поймёте, что есть 2 версии, немало отличающиеся друг от друга. Подозреваю, что вы используете 2ю версию для ОДИНОЧНОГО выбора, ожидая функционала первой версии…

Цитата
БМВ: почему не запросом SQL?
просто потому, что он мне неизвестен  :D предлагаю вам прикрутить его к этой форме, а я с удовольствием заценю  ;)
Изменено: Jack Famous - 19.08.2019 09:09:57
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
предлагаю вам прикрутить его к этой форме
там будет больше 10 строк, а это превысит мой лимит :-)
По вопросам из тем форума, личку не читаю.
 
БМВ,  :D тогда скиньте в личку, а я позволю себе сей рисковый шаг
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Alemox, решил пока не лезть в API. Саму возможность подметил - спасибо, но в эту форму включать не буду. Кто захочет, поставит.

По остальному (форма с одиночным выбором):
    • изменил имя сортировки (в модуле) для однообразного вызова
    • использовал все ваши рекомендации и добавил выход с ввода на список не только по стрелке вниз, но и по стрелке вверх
    • изменил TabIndex элементов формы на "ввод-список-кнопка-количество найденных"
    • не зная, как побороть коварный Enter в окне ввода. Хотел провесить на него очистку, но при любом событии он перескакивает на следующий Tab-index. В принципе, достаточно просто его не использовать, но будет круто, если подскажете)))
Модуль
Форма
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
2 формы в одном файле:
    • 2 формы с индивидуальными кодами внутри
    • универсальный вызов любой с помощью необязательного параметра для формы с мультивыбором. Один модуль для обработки обеих форм.
    • выбор разделителя вызове формы с мультивыбором. В примере выбран " | " вместо "; " — по-умолчанию
    • в обеих формах учтены все плюшки от Alemox (кроме растягивания). Подробнее в предыдущем пункте + дублирование Enter'ом клавиши "ГОТОВО" — для формы с мультивыбором
Модуль книги (вызов любой формы)
Форма с мультивыбором
Форма для одиночного выбора
Модуль для обработки
Изменено: Jack Famous - 19.08.2019 11:31:03
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
v 1.0

Одна форма с возможностью единичного или множественного выделения (контроль при вызове, как и в предыдущей версии):
    • вызов формы такой же, как в предыдущей версии
    • выбрать множественные позиции теперь можно и кнопкой, и Enter'ом, а единичные (при обоих типах форм) — ещё и даблкликом
    • Enter в окне ввода перекидывает в список, то есть вызвав форму (с мультивыбором) и нажав 2 раза, можно сразу получить список всего отфильтрованного
Модуль книги
Модуль
Форма
как можно увидеть, форма очень универсальна и, чтобы передать в неё данные, достаточно сформировать из них одномерный массив, заменив процедуру GetColumnData на другую (или передать иным способом). Диапазон применения такой формы очень обширен — достаточно вспомнить, как часто нам приходится выбирать что-то из списка, особенно, если список составляет больше десятка позиций. Для разных задач можно видоизменять форму в угоду узкой специализации — здесь же я постарался показать её возможности на интересном примере из последнего обновления PLEX.
Старался не свалить всё в кучу, но и рассмотреть оба варианта - для одинарного и множественного выбора.

Замечания и предложения, как всегда, приветствуются  :idea:
Изменено: Jack Famous - 21.08.2019 10:01:48
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Enter в окне ввода перекидывает в список, то есть вызвав форму (с мультивыбором) и нажав 2 раза, можно сразу получить список всего отфильтрованного
Уважаемый, Jack Famous. Ну не фильтрует по выбранному в столбце "А", а вставляет все выбранное в активную строку в столбце "А". Ни по нажатию на кнопку "ГОТОВО", ни по ENTER... Если я правильно понимаю написанное пояснение, то должно быть так: вызвал форму, в поле ввода ввел текст, макрос отработал, отсортировав искомое, я поставил галочки в позициях которые меня интересуют, нажал ENTER и на вкладке со списком макрос должен отфильтровать по столбцу "А" выбранные позиции, остальные скрыть, а он просто выбранные позиции вставляет в одну строку по очереди. Или что-то я делаю не так? Поясните, пожалуйста, очень нужна Ваша форма.
 
Цитата
voxik-24: Ну не фильтрует по выбранному в столбце "А", а вставляет все выбранное в активную строку
всё верно. Отфильтрованные — это в списке формы, а не на листе
Смотрите #19 - добавил возможность фильтрации данных на листе, но это уход от темы (исключение - в качестве примера демонстрации универсальности…)
Изменено: Jack Famous - 19.08.2019 15:12:57
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Уважаемый, Jack Famous, все фильтрует, просто супер, но... в окне формы (скрин) последняя строка не влазит  в пределы видимости. И еще вопрос: как я понял макрос не работает в "умных" таблицах?
 
Цитата
voxik-24 написал: последняя строка не влазит  в пределы видимости
Это проблема самого ListBox. Можно решить добавлением пустой строки  в конце. Но это усложняет обработку, при выводе или просмотре данных нужно это учитывать.
 
Цитата
voxik-24: последняя строка не влазит
завтра поправлю
Цитата
voxik-24: макрос не работает в "умных" таблицах?
должен работать. Вы пробовали?
Цитата
vikttur: Это проблема самого ListBox
я с ней сталкивался и решал путём IntegralHeight плюс поиграться с изначальными параметрами
Изменено: Jack Famous - 19.08.2019 17:53:00
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
v 1.1
==================================================
Пример фильтрации текущего столбца с помощью данной формы
Модуль книги (пример вызова)
Код формы (не изменился с #19)
Модуль отдельный (нафарширован)
===================================================
ОПИСАНИЕ:

БАЗА
    • 2 основных макроса: функция FS_Start и процедура FS_Sort

ЧТО ПЕРЕДАТЬ В ФУНКЦИЮ
    • в функцию нужно передать одномерный массив (LBound=0). Как вы его получите - не важно (далее есть пример)
    • можно выбрать, сортировать (по-умолчанию) или нет массив перед передачей в форму
    • для сортировки используется рекурсивная процедура FS_Sort отсюда (как по мне — лучшее сочетание скорости и универсальности)

ТИП ФОРМЫ
    • можно выбрать только одного значение
    • можно выбрать одно и более значений (по-умолчанию)

ПОИСК В ФОРМЕ
    • поиск осуществляется по маске, но из служебных символов доступна только "звёздочка" «*»
    • при поиске видимая в окне маска ввода отличается от реальной: в реальной заменены служебные символы "[]?#", кроме "*", а также присутствует хвостовая "*" справа (маска = маска & "*")
    • наличие ведущей "*" спереди контролируется кнопкой "по всей строке/с начала строки"
    • при запуске формы фокус будет на поле ввода маски, а в качестве маски будет использована последняя введённая (запоминается)
    • при нажатии клавиш "Ввод" и "Стрелка вниз/вверх" фокус сместится на список

ВЫБОР ЗНАЧЕНИЙ
    • перемещение по списку осуществляется с помощью клавиш "Стрелка вниз/вверх" или мышью (полосы прокрутки слева и снизу)
    • если строки слишком длинные, сдвигайте полосу прокрутки снизу, чтобы просмотреть всю строку
    • выбор осуществляется нажатием кнопки ГОТОВО - на форме, Ввод - на клавиатуре или даблклик - в списке (последнее - только, если выбран один элемент)
    • выйти из формы можно по крестику на форме или нажав Esc на клавиатуре (на любом этапе)
    • таким образом, всю работу с формой можно осуществлять без помощи мыши

ЧТО ВЕРНЁТ ФУНКЦИЯ
    • False — если в ней ничего не было выбрано
    • True — если в ней было выбрано хоть одно значение, а также изменит переданный ей массив, наполнив его только выбранными значениями

КАК ПЕРЕНЕСТИ В ДРУГОЙ ФАЙЛ
    • перенести из редактора 2 объекта: форму FormSearch и модуль FormSearch_macro
    • определиться с условиями вызова. Если нужно так, как в примере, то скопировать код из модуля книги примера в модуль книги своего файла

ИТОГО
    1. передаём одномерный массив для поиска
    2. ищем в нём
    3. если что-то отметили, то получили назад одномерный массив с выбранным

ПРИМЕР
    • в примере осуществлён процесс поиска и фильтрации по активному столбцу
Вставка рассмотрена в постах выше (ActiveCell.Value2 = Join(вернувшийся_массив_выбранных_значений,разделитель))
    • срабатывает по даблклику в любом месте файла (событие книги), если соблюдены условия
    • работает в умных таблицах и на простых диапазонах
    • условия:
         1. "попасть" в область данных
         2. наличие "шапки" (заголовки полей/столбцов)
         3. не менее 2 значений в столбце, кроме шапки (иначе какой смысл)
    • нюанс: для ускорения словарей используется раннее связывание (в файле-примере подключено). Если при переносе вы не уверены, сможете ли обеспечить раннее связывание на другом компьютере, то используйте позднее:
Код
Dim Dic As Object
Set Dic=CreateObject("Scripting.Dictionary")
    • ограничение: не фильтрует десятичные числа более 10 знаков (без запятой, включая целую и дробную часть) и всё в "индивидуальных" форматах типа числового ("общий" фильтрует), денежного, даты, времени и т.д.
Изменено: Jack Famous - 21.08.2019 13:53:59
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
v 1.2
ИЗМЕНЕНИЯ:
    • добавлена проверка на выполнение фильтрации (взял отсюда)
    • улучшен сброс фильтра (взял отсюда)
    • преобразование данных массива в текстовые теперь обязательное, без проверок и находится внутри функции фильтрации, а не в отдельной процедуре, т.к. выполняется очень быстро
    • вспомогательные макросы вынесены из основного модуля в отдельный (логика компоновки)
Так как для работы формы нужна только форма и её модуль, то решил всё остальное вынести в отдельный модуль Example. Он на непосредственную работу формы не влияет и присутствует только для обеспечения примера (фильтровать активный столбец)
    • мелкие несущественные дополнения и улучшения
Код из формы «FormSearch»
Модуль «FormSearch_macro»
Модуль «Example»
Изменено: Jack Famous - 21.08.2019 12:40:37
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, я попробовал сохранить файл с расширением .xlam и установить как надстройку (для исключения привязки к отдельным файлам), но желаемого результата не получил...
как это сделать?
Изменено: DNC - 21.08.2019 12:52:20
 
DNC, читаем это. Если не помогает, то это
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Понял.
Пошел читать.

Спасибо за труд Вам и всем причастным
 
DNC, от меня — пожалуйста  ;)
Изменено: Jack Famous - 21.08.2019 15:00:44
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1 2 След.
Наверх