Страницы: 1
RSS
Выпадающий список в ячейках столбца изменяющийся в зависимости от вводимого значения.
 
Приветствую всех планетян.

Возникла задача сделать выпадающий список в ячейках столбца. В списке около сотни позиций и он не сортирован. Для удобства поиска нужной позиции нужно чтобы исходный список изменялся (уменьшался) оставляя только те позиции в которых содержится вводимое значение, т.е. при вводе "вокз" в списке останутся только позиции со словом "вокзал" и т.п.

В 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. Была мысль формировать динамический список не на листе, а в массиве, но т.к. исходный список если и превысит сотню позиций, то не намного и вряд ли будет заметная разница в скорости обработки массива и листа, поэтому решил незаморачиваться.
 
Не стреляйте в тапера - он играет как может.
 
Ts.Soft,  здравствуйте! Можно выскажу мнение дилетанта в программировании?  :)
Если уже было
Цитата
Ts.Soft написал:
в UserForm подобные задачи делал
и оно работало, зачем самому себе проблемы создавать? Ну и пусть - при клике на ячейку сначала маленькая форма со списком выскочит, пользователь выберет нужное, из формы выбранное скинуть в ячейку и форма сразу же закроется, и проблема снята. Другой вопрос - почему все эти "неприятные моменты" именно на листе вылазят (хотя через форму все нормально работает) - стоит ли тратить свое время на поиски способов обхода подобных багов? Ну не доработали в MS кое-что, исправят позже (а может и так оставят, а в следующей версии еще что-то вылезет, а это исправят)  :)  Ну и с другой стороны: UserForm - хорошая "защита от дураков": зачем пользователю давать возможность щелкать по разным ячейкам, и вводить в поле ввода то, чего не нужно? ИМХО  
Страницы: 1
Наверх