И / или комбинация в VBA

Я запутался в том, как "и" или "заявления" работают вместе. Я пытаюсь заставить оператор (что-то или что-то) работать как часть оператора 'и', но не могу понять логику. Проблема иллюстрируется следующими двумя блоками кода. Первый работает нормально.. второй завершается с ошибкой времени выполнения 438: "Объект не поддерживает это свойство или метод". Ошибка относится к строке "If j.Enabled...". На мой взгляд, оба должны работать.. Кто-нибудь может уточнить, почему это не так?

Кодовый блок 1 (работает)

Private Sub Fini_cbn_Click()
Dim j As Control
For Each j In Controls
    If j.Enabled = True And j.Tag = "4" Then
        If j.Value = "<NA>" Or j.Value = "" Then
            j.BackColor = &HFFFF&
            Else
            j.BackColor = &H80000005
        End If
    End If
Next j
End Sub

Блок кода 2 (не работает)

Private Sub Fini_cbn_Click()
Dim j As Control
For Each j In Controls
    If j.Enabled = True And j.Tag = "4" And (j.Value = "<NA>" Or j.Value = "") Then
        j.BackColor = &HFFFF&
        Else
        j.BackColor = &H80000005
    End If
Next j
End Sub

2 ответа

Решение

VBA не закорачивает. Это означает, что все выражение оценивается каждый раз.

Так вот

If j.Enabled = True And j.Tag = "4" Then
    If j.Value = "<NA>" Or j.Value = "" Then

j.Value оценивается только если j.Enabled And j.Tag = "4" и все хорошо.

Но здесь

If j.Enabled = True And j.Tag = "4" And (j.Value = "<NA>" Or j.Value = "") Then

Весь оператор оценивается "сразу". Итак, в вашей коллекции должен быть элемент управления, который не имеет Value имущество. Поскольку свойство не существует, оно не может оценить утверждение.

Во второй версии полный оператор if выполняется для каждого элемента управления. Таким образом, если есть какие-либо элементы управления, которые не имеют свойства value, то часть "j.value" оператора if оценивается, но элемент управления не имеет свойства.

В первой версии, я предполагаю, что вы только установили тег и включили противоречия, которые имеют свойство "значение". Таким образом, свойство j.value никогда не пытается найти.

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