Я занимаюсь разработкой инструмента редактирования данных в Excel VBA.На одной из рабочих таблиц есть комбинированный список ActiveX, который используется для выбора строки данных.Событие изменения в выпадающем списке обновляет серию флажков ActiveX на основе данных в выбранной строке.
Кажется, это работает правильно, за исключением одного аспекта.Иногда, когда книга Excel закрывается, акт закрытия вызывает событие checkbox_change.На этом этапе компилятор проверяет, что все переменные в методе определены, и обнаруживает, что флажки больше не существуют, выдавая сообщение «Ошибка компиляции: переменная не определена».
Изменение рабочих таблиц, которое вызывает событие worksheet_activate (котороеобновляет некоторые свойства пользовательской формы), по-видимому, контролирует возникновение ошибки.
Использование обозревателя объектов во время отладки Я вижу, что флажки не перечислены, тогда как при нормальном выполнении.Стек вызовов в точке, где возникает ошибка, включает в себя только событие checkbox_change.
Я пробовал (несколько излишнее) решение включить 'Exit Sub' в начале обработчика события, но это не имеет никакого эффекта- VBA по-прежнему хочет знать о неопределенной в настоящее время переменной.
Любой совет о том, как перехватить эту проблему или предотвратить ее, будет принята с благодарностью.
Это пример с нуля, который, я считаю,содержит все элементы рабочей книги, где я получаю сообщение об ошибке, но в этом примере ошибка не возникает - я не знаю, какой аспект проблемы отсутствует.Надеюсь, это полезно.
Option Explicit
Private Sub CheckBox1_Click()
' apply the checkbox value to the spreadsheet
Dim rows As Range
Set rows = Sheet1.Range("RowIDs")
Dim cell As Range
For Each cell In rows
If cell.Value = ComboBox1.Value Then
cell.Offset(0, 1).Value = CheckBox1.Value
Exit For
End If
Next cell
End Sub
Private Sub ComboBox1_Change()
' get the value from the spreadsheet
' apply it to the checkbox
Dim rows As Range
Set rows = Sheet1.Range("RowIDs")
Dim cell As Range
For Each cell In rows
If cell.Value = ComboBox1.Value Then
CheckBox1.Value = cell.Offset(0, 1).Value '<<< This would be the line that causes the error
Exit For
End If
Next cell
End Sub
Private Sub CommandButton1_Click()
populateCombo
End Sub
Private Sub populateCombo()
Dim rows As Range
Set rows = Sheet1.Range("RowIDs")
ComboBox1.Clear
ComboBox1.Text = "--- Select row to activate ---"
Dim cell As Range
For Each cell In rows
ComboBox1.AddItem cell.Value
Next cell
End Sub
Private Sub Worksheet_Activate()
UserForm1.Label1.Caption = Sheet1.Name
UserForm1.Show
End Sub
Это скриншот рабочего листа с элементами управления