Ошибка выполнения 438 в циклической проверке значений пользовательской формы управления

У меня есть пользовательская форма с 132 объектами управления на нем. Пользователь заполняет форму, затем нажимает кнопку «Подтвердить», чтобы запустить макрос, который использует предоставленную информацию для принятия решений. Изображение ниже. Я написал оператор If, который проверяет: если имя не было введено вверху, не запускайте макрос; Если флажки не установлены, не запускайте макрос. Я обнаружил, что оператор If выполняет свою работу практически во всех комбинациях отмеченных и непроверенных полей; если он находит какой-либо один флажок, то он завершается для цикла For и продолжается с макросом.

Вот ссылка на изображение моей пользовательской формы:

UserForm

Вот выражение качества, если утверждение, строка ** помечена звездочкой, когда я получаю сообщение об ошибке:

    Dim cCont As Control
    Dim datacheck As Boolean
    datacheck = False
    If ProductName.Value <> "" Then
        For Each cCont In AddNewPage.Controls
            **If TypeName(cCont) = "CheckBox" And cCont.Value = True Then**
                datacheck = True
                Exit For
            End If
        Next cCont
    End If

   If datacheck = True Then
     'very long, hopefully unrelated macro
    Else
        MsgBox ("Please name the part, then click at least one" & Chr(13) & "checkbox. These are _
           the parameters to be audited.")
   End If

Проблема заключается в том, что если я отмечаю только флажки из группы из трех в нижней части, я получаю ошибку времени выполнения 438. Я не получаю сообщение об ошибке, если я проверяю только флажки из верхней группы, или если я отмечаю флажки из обеих верхних и нижние группы, но не если я отмечу только флажки из нижней группы.

Я не могу определить разницу между флажками вверху и флажками внизу. Все свойства кажутся одинаковыми, поэтому я не знаю, почему один флажок выдает ошибку, а другой - нет.

Всего 1 ответ


If TypeName(cCont) = "CheckBox" And cCont.Value = True Then

Проблема в том, что оператор And VBA не имеет короткого замыкания , поэтому оба условия систематически оцениваются для каждого cCont , который предположительно включает элементы управления Label которые не имеют свойства Value .

Вы можете AndAlso условия для достижения AndAlso короткого замыкания, AndAlso оператор AndAlso будет иметь в VB.NET:

If TypeName(cCont) = "CheckBox" Then
    'we're looking at a CheckBox control
    If cCont.Value Then
        '...
    End If
End If

Есть идеи?

10000