Ошибка выполнения 438 в For L oop проверке значений контроля пользовательской формы - PullRequest
3 голосов
/ 17 января 2020

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

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

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. Во время выполнения я не получаю сообщение об ошибке, если я ставлю только флажки из верхней группы или если я устанавливаю флажки как из верхней, так и из нижней групп, но только если я отмечаю только флажки снизу group.

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

1 Ответ

2 голосов
/ 17 января 2020
If TypeName(cCont) = "CheckBox" And cCont.Value = True Then

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

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

If TypeName(cCont) = "CheckBox" Then
    'we're looking at a CheckBox control
    If cCont.Value Then
        '...
    End If
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...