Почему событие изменения (со списком Excel VBA) срабатывает при каждом обращении к одному из его свойств?
Я впервые на этом форуме. Вот мой сценарий: на форме пользователя у меня есть поле со списком, два текстовых поля и кнопка "ОК". Когда пользователь делает выбор из выпадающего списка в выпадающем списке, запускается событие изменения в выпадающем списке, и код обработки события заполняет текстовые поля информацией из рабочего листа на основе выбора пользователя. Затем пользователь может редактировать информацию в одном или обоих текстовых полях. Затем пользователь нажимает "ОК". Событие нажатия кнопки ОК затем записывает измененную информацию из текстовых полей обратно в ячейки на рабочем листе. Кажется довольно прямым. Вот моя проблема: событие изменения комбобокса срабатывает каждый раз, когда на его свойства ссылаются. В частности, три экземпляра в подпрограмме cb_CustomersUpdateOK_Click() ниже, на которую ссылается свойство ListIndex комбинированного списка. Я поместил Msgbox в код события Change, чтобы указать, когда событие сработало. Используя точки останова в каждом из трех операторов присваивания в коде события щелчка ОК, комбинированный список срабатывает (отображается Msgbox) для каждого из трех операторов. Когда срабатывает триггер, он перезаписывает отредактированную информацию в текстовых полях начальными данными из списка выпадающих списков. (1) Почему событие изменения в выпадающем списке вызывает то, что происходит? (2) Что я должен делать, чтобы этого не случилось?
Я исследовал это в течение последних нескольких часов, и я не нашел ничего ужасно полезного. Любая помощь будет принята с благодарностью. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Private Sub combo_CustomersUpdateLastName_Change()
MsgBox "combobox changed" 'For debug purposes
With Sheets("Customers")
tb_CustomersUpdateFirstName.Value = .Cells(combo_CustomersUpdateLastName.ListIndex + 2, 2).Value
tb_CustomersUpdatePhone.Value = .Cells(combo_CustomersUpdateLastName.ListIndex + 2, 3).Value
End With
End Sub
...
Private Sub cb_CustomersUpdateOK_Click()
'Copy the updated customer data from the controls to the Customers sheet
With Sheets("Customers")
.Cells(combo_CustomersUpdateLastName.ListIndex + 2, 1).Value = combo_CustomersUpdateLastName.Value
.Cells(combo_CustomersUpdateLastName.ListIndex + 2, 2).Value = tb_CustomersUpdateFirstName.Value
.Cells(combo_CustomersUpdateLastName.ListIndex + 2, 3).Value = tb_CustomersUpdatePhone.Value
'Sort the customer data in case the last name or first name was updated
Range("CustomerInfo").Sort Key1:=.Columns("A"), Key2:=.Columns("B")
End With
MsgBox "Customer data updated."
Unload form_CustomersUpdate
End Sub
1 ответ
Что является источником для элементов комбинированного списка? Если он связан с диапазоном, то событие изменения инициируется, потому что запись на лист изменяет связанный источник, что, в свою очередь, означает, что выпадающий список обновляется сам.
Если вы не хотите, чтобы это произошло, вам нужно будет "кэшировать" значения из диапазона в массив и заполнить их полями.