Приветствую всех планетян.
Возникла задача сделать выпадающий список в ячейках столбца. В списке около сотни позиций и он не сортирован. Для удобства поиска нужной позиции нужно чтобы исходный список изменялся (уменьшался) оставляя только те позиции в которых содержится вводимое значение, т.е. при вводе "вокз" в списке останутся только позиции со словом "вокзал" и т.п.
В UserForm подобные задачи делал, но на листе не приходилось. Не смог придумать ничего другого как использовать ActiveX ComboBox прорисовывая его в границах выбранной ячейки. Пришлось немного помучаться с объединёнными ячейками - если они объединены в пределах столбца, то выпадающий список нужен, есь объединение затрагивает другие столбцы, то нет.
В принципе всё получилось. При вводе символа в ComboBox в списке остаются только допустимые значения. При нажатии Enter если в исходном списке нет введённого значения появляется запрос на добавление этого значения в список. При нажатии Delete - запрос на удаление значения из списка.
Но есть несколько неприятных моментов.
1. В процедуре ComboBox1_Change если убрать On Error Resume Next бывает возникает ошибка в строке Range(SelCel).Rows.AutoFit, при этом значение переменной SelCel правильное. И не смотря на ошибку AutoFit отрабатывает. Мне так и не удалось понять почему возникает ошибка, вот и добавил On Error... У
2. Если ввести значение, но не выбрать позицию из оставшегося списка, а просто выделить другую ячейку, то остаётся введённое значение.
3. Если ввести значение у которого нет совпадения в списке и выделить другую ячейку, то введённое значение поменяется на первую позицию списка.
Если первая проблема в принципе не напрягает, мне просто интересно почему возникает ошибка - никакой системы я не обнаружил. Бывало десяток раз щёлкал по соседним ячейкам и ничего, а при следующем переключении ячеек ошибка выскакивала.
То вот вторая и третья проблемы просто неприятны. Была мысль при срабатывании Worksheet_SelectionChange делать Undo, анализировать оставшееся значение, при необходимости очищать и возвращаться в выбранную перед Undo ячейку, но как-то такой вариант не нравится.
Будут ли у кого-нибудь какие-нибудь идеи по решению вышеназванных проблем?
И ещё - т.к. задача была не срочной, то занимался урывками, бывало по несколько дней не открывал файл, то код получился какой-то корявый и я буду рад советам по оптимизации.
P.S. Была мысль формировать динамический список не на листе, а в массиве, но т.к. исходный список если и превысит сотню позиций, то не намного и вряд ли будет заметная разница в скорости обработки массива и листа, поэтому решил незаморачиваться.
Возникла задача сделать выпадающий список в ячейках столбца. В списке около сотни позиций и он не сортирован. Для удобства поиска нужной позиции нужно чтобы исходный список изменялся (уменьшался) оставляя только те позиции в которых содержится вводимое значение, т.е. при вводе "вокз" в списке останутся только позиции со словом "вокзал" и т.п.
В UserForm подобные задачи делал, но на листе не приходилось. Не смог придумать ничего другого как использовать ActiveX ComboBox прорисовывая его в границах выбранной ячейки. Пришлось немного помучаться с объединёнными ячейками - если они объединены в пределах столбца, то выпадающий список нужен, есь объединение затрагивает другие столбцы, то нет.
В принципе всё получилось. При вводе символа в ComboBox в списке остаются только допустимые значения. При нажатии Enter если в исходном списке нет введённого значения появляется запрос на добавление этого значения в список. При нажатии Delete - запрос на удаление значения из списка.
Но есть несколько неприятных моментов.
1. В процедуре ComboBox1_Change если убрать On Error Resume Next бывает возникает ошибка в строке Range(SelCel).Rows.AutoFit, при этом значение переменной SelCel правильное. И не смотря на ошибку AutoFit отрабатывает. Мне так и не удалось понять почему возникает ошибка, вот и добавил On Error... У
2. Если ввести значение, но не выбрать позицию из оставшегося списка, а просто выделить другую ячейку, то остаётся введённое значение.
3. Если ввести значение у которого нет совпадения в списке и выделить другую ячейку, то введённое значение поменяется на первую позицию списка.
Если первая проблема в принципе не напрягает, мне просто интересно почему возникает ошибка - никакой системы я не обнаружил. Бывало десяток раз щёлкал по соседним ячейкам и ничего, а при следующем переключении ячеек ошибка выскакивала.
То вот вторая и третья проблемы просто неприятны. Была мысль при срабатывании Worksheet_SelectionChange делать Undo, анализировать оставшееся значение, при необходимости очищать и возвращаться в выбранную перед Undo ячейку, но как-то такой вариант не нравится.
Будут ли у кого-нибудь какие-нибудь идеи по решению вышеназванных проблем?
И ещё - т.к. задача была не срочной, то занимался урывками, бывало по несколько дней не открывал файл, то код получился какой-то корявый и я буду рад советам по оптимизации.
P.S. Была мысль формировать динамический список не на листе, а в массиве, но т.к. исходный список если и превысит сотню позиций, то не намного и вряд ли будет заметная разница в скорости обработки массива и листа, поэтому решил незаморачиваться.
Не стреляйте в тапера - он играет как может.