Примечание: это не обычная публикация "Как работает проверка данных", так что терпите меня.
Я пытаюсь заставить динамическую каскадную проверку данных работать для столбцов в таблице - т.е.пусть каждая ячейка, например, в столбце D, имеет диапазон (раскрывающийся список данных) параметров, пользователь выбирает один из них, а затем ячейка рядом с ним в столбце E показывает все возможные зависимые параметры (поиск из некоторой таблицы поиска с использованием выборав столбце D в качестве ключа поиска) пользователь также выбирает один из них и т. д.
Я знаю, как настроить такую проверку каскадных данных с именованными диапазонами и тому подобное, используя формулы для создания списков параметров каскадирования,Однако они полагаются на предварительно сконфигурированные известные именованные диапазоны или таблицы для каждой входной ячейки, которые используются для предоставления доступных параметров, и, таким образом, работают только для одной (или нескольких) входных ячеек, а не для всех входных ячеек в столбце всей таблицы.который должен иметь возможность расширяться (добавлять строки и т. д.).
Я уже экспериментировал с предшествующим выпадающим списком столбцом, показывающим применимые параметры в этой строке (с помощью формул - работает нормально, за исключением большого размера, когда большечем x вариантов нужно показать), но единственное реальное удобное решение - просто отфильтровать параметры в самом фактическом выпадающем списке.
Я мог бы зарезервировать x вспомогательных столбцов для каждого выпадающего столбца, чтобы сохранить все доступные параметры.для этих списков (x - это максимальное число опций, которые я когда-либо ожидал быть доступными для всех списков вместе), и заполните каждый из них некоторой формулой RANK для извлечения всех возможных опций в непрерывном диапазоне, а затем используйтеформула, чтобы определить, сколько из этих столбцов использовать вформула выпадающего списка.Некоторые из этих списков, тем не менее, довольно длинные, и у меня есть несколько таких конструкций для добавления в мою таблицу, так что это быстро станет большим скачком производительности и беспорядком.Я уже использую до столбца 400 в этой таблице (с множеством сложных формул в них), и Excel уже начинает стонать об этом;добавление дополнительных нескольких сотен для этих столбцов поиска помощников монстров просто не вариант.
Так что я уже отказался от использования чистых формул и перешел к верному старому VBA.У меня уже есть хорошо работающая система, в которой:
- Я перехватываю OnChange листа и отфильтровываю изменения в ячейках таблицы,
- проверяет, является ли измененная ячейка основой для одного израскрывающиеся списки, и если да, то
- просто соберите все параметры для каждого зависимого раскрывающегося списка в самом VBA, а
- замените существующие списки проверки данных всех последующих раскрывающихся списков на жестко закодированный список, который я только что собрал.
И когда все было хорошо и готово, и я был весьма доволен результатом, я заменил тестовые данные в конфигурации всеми возможными опциями, и документ просто был поврежден при сохранении.После восстановления при открытии некоторые выпадающие списки теперь имеют «N / A» в качестве конфигурации выпадающего списка.После некоторых копаний в XML-листе (вам нужно любить эту структуру .xlsm zip-файлов вместо .xls), я обнаружил, что эти жестко запрограммированные выпадающие списки ограничены максимум 255 символами ... что делает эту опцию мгновенно бесполезной для меня.
Я мог бы использовать скрытые вспомогательные столбцы опций 2.0;Теперь я не нуждаюсь в сложных формулах поиска в них, но могу позволить VBA перечислить там все доступные опции, а затем позволить формуле выпадающего списка использовать диапазон используемых столбцов.Но, как я уже сказал, я уже достаточно подчеркиваю Excel размером таблицы, поэтому добавить несколько сотен дополнительных столбцов действительно невозможно, какими бы простыми они ни были.Я мог бы также иметь отдельный лист «блокнота» для каждого выпадающего столбца, и позволить VBA записать там параметры (лист X для выпадающего столбца X, параметры записи для ячейки X2 в строке 2 листа X в столбцах), но это простослишком уродливый хак для меня, чтобы принять его прямо сейчас.
Другой вариант заключается в отбрасывании выпадающих списков проверки Excel и их динамическом наложении с помощью элементов управления Forms или ActiveX (событие выбора ячейки = VBA накладывает на него элемент управления списком, настраивает его доступные параметры, устанавливает его связанную ячейку с ячейкой исходной таблицы,и устанавливает фокус на это).В любом случае они намного превосходят удобство использования и кажутся идеальными, но я уже использовал такую систему в другом обширном приложении Excel, которое я сделал в прошлые годы, и это вызывало только странные прерывистые зависания Excel, сбои и повреждения файлов, после чего мне пришлось отказатьсясистему и снова вернитесь к обычной проверке данных.
Последний вариант - добавить пользовательскую форму ввода данных VBA, которая появляется, если пользователь, например, пытается изменить значения, но тогда зачем в первой таблице Excelместо ... тогда я мог бы лучше просто сделать для него обычное приложение для Windows в .Net или чем-то подобном.
Любое понимание других готовых вариантов высоко ценится!(Сиддхарт, ты здесь? :))
Обновление
Кажется, что не существует какой-либо удовлетворительной опции, поэтому я создал вместо этого замысловатое решение VBA.На случай, если кому-то еще понадобится добавить такое решение, я добавил общий дизайн ниже (без кода, так как его было бы слишком много, чтобы перечислять здесь);
- Есть одна основная таблица, содержащая(на данный момент) 9 выпадающих столбцов, разделенных на 3 многоуровневых каскадных ветви.
- Есть 3 таблицы поиска, которые отражают эти 3 пути и которые содержат конфигурацию доступных комбинаций параметров (для теперь ненормализованных таблиц поиска,но это мой следующий вызов).
- Я добавил одну таблицу конфигурации, которая описывает эти три пути;
- В столбце 1 перечислены раскрывающиеся столбцы основной таблицы, в
- столбце 2 перечислены таблицы поиска, которые будут использоваться для этого пути, а в
- столбце 3 перечислены соответствующие столбцы таблицы поиска.
- Я добавил блокнот «Dropdown cache» для динамического хранения доступных вариантов раскрывающегося списка.
- Я обработал OnChange для ячеек основной таблицы, проверяя, есть ли раскрывающиеся ячейкиизменения, которые перечислены в одном из каскадных путей.Если это так, он:
- Оценивает, какие значения вводятся в выпадающие столбцы, предшествующие (и включая) этот измененный выпадающий столбец,
- Просматривает все строки в соответствующих справочных таблицах, находя уникальные соответствияучитывая эти предварительно выбранные значения с использованием алгоритма сопоставления (все еще WIP),
- Изменяет все последующие раскрывающиеся списки, чтобы использовать эти доступные параметры.
- Все доступные параметры для одногораскрывающиеся ячейки перечислены в одной строке, назначенной этому раскрывающемуся списку в раскрывающемся кэше.Они выдаются по принципу «первым пришел - первым обслужен».
- Когда необходимо изменить список параметров раскрывающегося списка:
- Если проверка данных в раскрывающемся меню уже установлена, я нахожу его строку кэшасмотреть на формулу проверки данных;если нет, я беру следующую доступную строку кэша (в основном UsedRange.Row + 1).Глядя на формулу проверки данных, я могу удалить строки из таблицы кэша, поскольку Excel исправит выпадающие формулы проверки данных, чтобы теперь указывать на правильные строки.
- Первая ячейка в этой строкеформула индикатора «используется», ссылающаяся на саму выпадающую ячейку.Если исходная выпадающая ячейка (строка таблицы) удаляется, формула автоматически преобразуется в #REF !, указывая, что строка кэша теперь устарела.
- Все параметры перечислены в столбце 2 и далее, отбрасывая все лишние старыеопций, если сейчас меньше опций, чем ранее.
- Формула проверки данных в раскрывающемся списке настроена на использование вновь установленного диапазона опций.
- Если в списке есть только одна опция, этаТакже в раскрывающемся списке (так как мы в любом случае используем VBA, давайте добавим немного дружественности к пользователю).
- Я обработал OnSave, чтобы я мог привести в порядок выпадающий кешпростынь;
- Я предварительно сканирую каждую ячейку в первом столбце (столбце обратной ссылки) листа кэша и проверяю, не стал ли он #REF!ошибка, которая возникает, если строка таблицы этого выпадающего списка была удалена.
- Все строки кэша, подлежащие удалению, объединяются в максимально возможные диапазоны строк, которые я удаляю в пакетах.
В целом это хорошо работающее решение, но жаль, что оно дошло до этого, и мне интересно, как оно будет работать, когда файл будет использоваться по-настоящему с большим количеством строк, добавленных в таблицу....
И затем я обнаружил, что при сортировке строк таблицы данные сортируются хорошо, но теперь уникальные формулы проверки данных не следуют за данными ... и событие Change также не вызывается длябыть в состоянии исправить что-либо ... и ссылки на ячейки из таблицы кэша обратно в таблицу также не следуют за ячейками, которые они представляют ... спасибо Microsoft !!!
Итак, дизайн теперь обновленto:
- Диапазон, используемый для каждого раскрывающегося списка, теперь указан в ячейке перед раскрывающимся списком, а не в собственной формуле проверки раскрывающегося списка.Это сортирует вместе с данными.
- Формула проверки выпадающих данных теперь установлена на
=INDIRECT(<cell before this column>)
. - Ячейка обратной ссылки, используемая на листе кэша ... Я не знаю, какчтобы исправить это ...
И, используя эту изменчивую формулу, это приводит к тому, что Excel запрашивает сохранение изменений всякий раз, когда кто-то даже намекает на прикосновение к этим раскрывающимся спискам ...
люблю это Excel.