Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 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
Форма.png (30.92 КБ)
Изменено: Jack Famous - 12 Сен 2019 16:05:10
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Обновление или просто ещё вариант
1. форма переделана для выбора ОДНОГО значения из списка даблкликом
2. ускорен цикл сбора данных за счёт For Each
3. убрана проверка на прочерк (=СИМВОЛ(160)). Кажется, только я их использую  :D
4. Value2 заменён на Value, чтобы более корректно отображалась дата (со временем сложнее)
5. запуск макроса по даблклику теперь "повешен" на всю книгу и сработает в любом месте
Модуль
Форма
Форма.png (13.81 КБ)
Изменено: Jack Famous - 19 Авг 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: на экране может быть видима только часть
справедливо, благодарю. Заменю на что-то типа "сформировать список из всех отфильтрованных"…
Form Error.png (6.43 КБ)
Изменено: Jack Famous - 17 Авг 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 Авг 2019 09:09:57
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
Jack Famous написал:
предлагаю вам прикрутить его к этой форме
там будет больше 10 строк, а это превысит мой лимит :-)
 
БМВ,  :D тогда скиньте в личку, а я позволю себе сей рисковый шаг
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Alemox, решил пока не лезть в API. Саму возможность подметил - спасибо, но в эту форму включать не буду. Кто захочет, поставит.

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

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

Замечания и предложения, как всегда, приветствуются  :idea:
Изменено: Jack Famous - 21 Авг 2019 10:01:48
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
Jack Famous написал:
Enter в окне ввода перекидывает в список, то есть вызвав форму (с мультивыбором) и нажав 2 раза, можно сразу получить список всего отфильтрованного
Уважаемый, Jack Famous. Ну не фильтрует по выбранному в столбце "А", а вставляет все выбранное в активную строку в столбце "А". Ни по нажатию на кнопку "ГОТОВО", ни по ENTER... Если я правильно понимаю написанное пояснение, то должно быть так: вызвал форму, в поле ввода ввел текст, макрос отработал, отсортировав искомое, я поставил галочки в позициях которые меня интересуют, нажал ENTER и на вкладке со списком макрос должен отфильтровать по столбцу "А" выбранные позиции, остальные скрыть, а он просто выбранные позиции вставляет в одну строку по очереди. Или что-то я делаю не так? Поясните, пожалуйста, очень нужна Ваша форма.
 
Цитата
voxik-24: Ну не фильтрует по выбранному в столбце "А", а вставляет все выбранное в активную строку
всё верно. Отфильтрованные — это в списке формы, а не на листе
Смотрите #19 - добавил возможность фильтрации данных на листе, но это уход от темы (исключение - в качестве примера демонстрации универсальности…)
Изменено: Jack Famous - 19 Авг 2019 15:12:57
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Уважаемый, Jack Famous, все фильтрует, просто супер, но... в окне формы (скрин) последняя строка не влазит  в пределы видимости. И еще вопрос: как я понял макрос не работает в "умных" таблицах?
f.png (46.84 КБ)
 
Цитата
voxik-24 написал: последняя строка не влазит  в пределы видимости
Это проблема самого ListBox. Можно решить добавлением пустой строки  в конце. Но это усложняет обработку, при выводе или просмотре данных нужно это учитывать.
 
Цитата
voxik-24: последняя строка не влазит
завтра поправлю
Цитата
voxik-24: макрос не работает в "умных" таблицах?
должен работать. Вы пробовали?
Цитата
vikttur: Это проблема самого ListBox
я с ней сталкивался и решал путём IntegralHeight плюс поиграться с изначальными параметрами
Изменено: Jack Famous - 19 Авг 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 Авг 2019 13:53:59
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
v 1.2
ИЗМЕНЕНИЯ:
    • добавлена проверка на выполнение фильтрации (взял отсюда)
    • улучшен сброс фильтра (взял отсюда)
    • преобразование данных массива в текстовые теперь обязательное, без проверок и находится внутри функции фильтрации, а не в отдельной процедуре, т.к. выполняется очень быстро
    • вспомогательные макросы вынесены из основного модуля в отдельный (логика компоновки)
Так как для работы формы нужна только форма и её модуль, то решил всё остальное вынести в отдельный модуль Example. Он на непосредственную работу формы не влияет и присутствует только для обеспечения примера (фильтровать активный столбец)
    • мелкие несущественные дополнения и улучшения
Код из формы «FormSearch»
Модуль «FormSearch_macro»
Модуль «Example»
Изменено: Jack Famous - 21 Авг 2019 12:40:37
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Jack Famous, я попробовал сохранить файл с расширением .xlam и установить как надстройку (для исключения привязки к отдельным файлам), но желаемого результата не получил...
как это сделать?
Изменено: DNC - 21 Авг 2019 12:52:20
 
DNC, читаем это. Если не помогает, то это
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Понял.
Пошел читать.

Спасибо за труд Вам и всем причастным
 
DNC, от меня — пожалуйста  ;)
Изменено: Jack Famous - 21 Авг 2019 15:00:44
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
Страницы: 1 2 След.
Читают тему (гостей: 2)
Наверх