Я заметил, что получаю всевозможные досадные ошибки, когда:
- У меня есть поля со списком ActiveX на листе (не в форме Excel)
- Комбинированные списки имеют связанный с ними код события (например, события onchange).
- Я использую их свойства listfillrange или connectedcell (очистка этих свойств, похоже, решает множество проблем)
- (Не уверен, что это связано), но есть проверка данных на целевой связанной ячейке.
Я программирую довольно сложное приложение Excel, которое выполняет множество операций по обработке событий и использует множество элементов управления. В течение нескольких месяцев я пытался исправить множество ошибок, связанных с этими полями со списком. Я не могу вспомнить все детали каждого экземпляра сейчас, но эти ошибки, как правило, связаны с указанием свойств listfillrange и connectedcell в именованных диапазонах и часто связаны с событиями поля со списком, запускаемыми в неподходящее время (например, когда application.enableevents = ложь). Эти проблемы, казалось, стали еще больше в Excel 2007, поэтому мне пришлось полностью отказаться от этих полей со списком (теперь я использую поля со списком, содержащиеся в пользовательских формах, а не непосредственно на листах).
Кто-нибудь еще видел подобные проблемы? Если да, то было ли изящное решение? Я поискал в Google и до сих пор не нашел никого с подобными проблемами.
Вот некоторые из симптомов, которые я вижу:
- Сбой Excel при запуске (включает combobox_onchange, listfillrange-> именованный диапазон на другом листе и взаимодействия workbook_open). (обратите внимание, у меня также была некоторая проверка данных в связанных ячейках на случай, если пользователь отредактировал их напрямую.)
- Ошибки рендеринга в Excel (обычно при изменении поля со списком некоторые ячейки из другого листа случайным образом отображаются поверх текущего листа) Иногда это связано с тем, что экран полностью мигает на другой лист на мгновение.
- Excel теряет рассудок (точнее, стек вызовов) (относящийся к первому пункту маркера). Иногда, когда функция изменяет свойство полей со списком, возникает событие onchange со списком, но оно никогда не возвращает управление функции, которая изначально вызвала изменение. События combobox_onchange запускаются, даже если application.enableevents = false.
- События срабатывают, когда они не должны (я опубликовал еще один вопрос о переполнении стека, связанный с этим).
На данный момент я совершенно убежден, что выпадающие списки ActiveX являются воплощением зла и не стоят усилий. Вместо этого я переключился на включение этих комбинированных списков в модуль пользовательской формы. Я бы предпочел неудобства пользователей всплывающими формами, чем случайными визуальными артефактами и сбоями (с потерей данных).