Ошибка неопределенной переменной на флажке ActiveX при закрытии книги - PullRequest
0 голосов
/ 13 мая 2018

Я занимаюсь разработкой инструмента редактирования данных в 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

Это скриншот рабочего листа с элементами управления

...