Главная » Статьи » Excel » Пользовательский интерфейс |
Я собираюсь вам рассказать о фантастически полезном и эффектном приёме. Это одна из самых интересных вещей, которую мне доводилось видеть в Excel. Кроме того, она достаточно легко реализуется. Если вы разберётесь, как она работает, то вы сразу узнаете об Excel необычно много. Я постараюсь рассказать всё максимально подробно, последовательно и внятно. Выпадающий список с контекстным поискомИтак, речь пойдёт о выпадающем списке (так называемый combo box), в который встроена возможность динамического поиска по подстроке, которую пользователь вводит с клавиатуры. Посмотрите пример, в котором мы имеем топ 300 крупнейших городов России. На анимированной иллюстрации видно, как мы динамически сужаем список выбора, вводя подстроку "кр" или "ниж", экономя огромное количество времени. Более того, список меняется после ввода каждого нового символа! Выглядит чрезвычайно привлекательно и профессионально, не так ли? Давайте разбираться, как это устроено. Файл примераСкачатьПошаговая инструкцияПредварительные замечанияВ файле примера выпадающий список с поиском реализован сразу в двух вариантах: для обычного диапазона (лист Range) и для умной таблицы (лист Table). Мы будим эти варианты обсуждать одновременно, отмечая их различия. Шаг 1. Готовим таблицу для спискаПодготовьте таблицу с четырьмя колонками: Город (или то, что вам нужно), Статус, Индекс, Фильтр. Заполните столбец Город значениями. В остальных трёх колонках будут формулы, которые мы обсудим ниже. Я всем рекомендую использовать умную таблицу, так как это значительно проще. Шаг 2. Формулы для столбца СтатусНа примере ячейки F2 рассмотрим формулу, аналогичную для всего столбца Статус (столбец F). Из F2 формулу можно протягивать вниз до конца, а в случае умной таблицы Excel это сделает за вас. Это также относится ко всем формулам, которые мы будем обсуждать в этой статье. $B$2 - ячейка, с которой будет связан выпадающий список (добавляется на шаге 6). Что значит связано? Всё, что вы введёте в выпадающий список, тут же отразится в ячейке B2. Формула ПОИСК вернёт ошибку, если содержимое B2 не найдено в $E2. ЕОШИБКА перехватит ошибку и вернёт ИСТИНА, если действительно была ошибка, и - ЛОЖЬ, если строка таки была найдена. Функция НЕ делает из истины ложь и наоборот (инверсирует результат). Таким образом, мы получим в этом столбце ИСТИНА, если подстрока найдена в текущем городе, и наоборот. Обратите внимание, что пустая подстрока содержится в любой строке, поэтому все ячейки столбца Статус имеют значения ИСТИНА, когда мы не ввели ещё ничего в B2.
Шаг 3. Формула для столбца ИндексЕсли B2 содержит подстроку поиска, то в столбце Статус не все ячейки примут значение ИСТИНА. Статус ИСТИНА будет только там, в чьи названия городов входит соответствующая подстрока. А в столбце Индекс мы рассчитываем номер по порядку для всех строк, которые содержат искомую подстроку. Например, на рисунке ниже B2 содержит "ни", что заставляет столбец Статус быть истинным у строк с городами Нижний Новгород, Калининград, Магнитогорск и т.д., а в столбце Индекс мы начинаем считать факты срабатываний в F: Нижний Новгород - первое срабатывание, Калининград - второе и так далее. Функция ЕСЛИ отсекает все значения в F, которые не равны ИСТИНА. Функция СЧЁТЕСЛИ подсчитывает количество значений ИСТИНА в F.
Обратите внимание, что диапазон условия в СЧЁТЕСЛИ введен скользящий - вторая координата не закреплена - и во время протягивания она растёт пропорционально таблице. За счёт этого трюка мы получаем механизм подсчёта значения ИСТИНА. Например, 6-я строка будет подсчитывать ИСТИНУ по диапазону $F$2:$F6 (там одно значение - от Нижнего Новгорода), а 41-я строка будет подсчитывать ИСТИНУ уже по диапазону $F$2:$F41 (а там уже 2 значения - от Нижнего Новгорода и от Калининграда). Вот суть механизма. Это полезный приём, который стоит запомнить. Шаг 4. Формула для столбца ФильтрТеперь наша задача, опираясь на столбец Индекс, сформировать в столбце H отфильтрованный список городов, который необходимо показывать в выпадающем списке.
Формула ЧСТРОК($G$2:$G2) используется для генерации последовательных номеров от 1 (для второй строки) до N (в строке N+1), равному количеству найденных подстрок. Просто генерируется диапазон соответствующего размера, а формула ЧСТРОК возвращает его высоту в строках. Формула ПОИСКПОЗ ищет номер реальной строки, содержащий соответствующий индекс. Например, в столбце Фильтр мы видим Магнитогорск на третьей позиции, но в реальности он взят из E45, так как в G45 стоит цифра 3, которую мы и нашли через ПОИСКПОЗ. То есть ПОИСКПОЗ сказал нам, что Магнитогорск находится в 45-й строке, а извлекли мы его оттуда уже при помощи формулы ИНДЕКС. Если же при извлечении возникает ошибка (текущая строка находится ниже строки N+1), то формула возвращает пустую строку. За это отвечает ЕСЛИОШИБКА. Шаг 5. Создание именованных диапазонов
DDL_Range и DDL_Table это диапазоны, которые формируются на базе значений столбца Фильтр без пустых строк. Эти ИД указываются в свойствах ListFillRange выпадающих списков (DDL_Table - через DDL_Fake). Шаг 6. Вставляем Combo box на листНа ленте Разработчик в группе Элементы управления через кнопку Вставить выберите элемент управления ActiveX Поле со списком и вставьте его на лист. Далее:
Шаг 7. Модификация события Change для элементов Поле со спискомНу и изюминка нашего приёма, то, что заставляет Поле со списком показывать нам обновленный список выбора после каждого изменения строки ввода, - событие Change этого элемента управления, которое переприсваивает свойство ListFillRange и вызывает событие раскрытия списка DropDown. Вот и всё!P.S. К сожалению, не я придумал такую крутую штуку. Это сделал индийский товарищ Sumit Bansal, решение которого я лишь немного оптимизировал (исправил VBA событие - у него оно почему-то было привязано к GotFocus, что всё портило, и сократил формулы). Читайте также: | |||||||||||||||||
Просмотров: 75114 | Комментарии: 6 | | |
Всего комментариев: 6 | |||||||
| |||||||