Почему событие изменения (со списком 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 ответ

Решение

Что является источником для элементов комбинированного списка? Если он связан с диапазоном, то событие изменения инициируется, потому что запись на лист изменяет связанный источник, что, в свою очередь, означает, что выпадающий список обновляется сам.

Если вы не хотите, чтобы это произошло, вам нужно будет "кэшировать" значения из диапазона в массив и заполнить их полями.

Другие вопросы по тегам