Почему условный тест для значения ComboBox игнорируется? (Доступ к VBA) - PullRequest
1 голос
/ 28 мая 2019

У меня есть предложение If, которое полностью игнорировалось до тех пор, пока я не обнаружил обходной путь, но теперь я хотел бы лучше понять, что происходит внутри.

У нас есть формас ComboBox, который заполняется, но значение по умолчанию не установлено на нем.Когда я иду, чтобы сохранить форму, нам нужно проверить, выбрал ли пользователь значение.Код был:

If (Me.Combo78.Value = "") Then
    mb "Please select a value"
End If

Код никогда не сработал бы, пока я не изменил условие на:

If ("" & Me.Combo78.Value = "") Then
    mb "Please select a value"
End If

Я предполагаю, что "" & заставляет сравнение бытьтекстовое сравнение, и, следовательно, может правильно проверять пустую строку "", но что на самом деле делало предыдущее сравнение, и есть ли лучший, более интуитивный способ справиться с этим?Решение, которое я только что почувствовал, грубое.

- 30-летний опыт работы с кодированием на Pascal, HTML, Javascript, но <1 год кодирования на VBA после того, как ему передали устаревшее приложение, которое требует отладки. </p>

1 Ответ

1 голос
/ 28 мая 2019

Если ComboBox не имеет значения, то Me.Combo78.Value будет нулевым и, следовательно, Me.Combo78.Value = "" будет нулевым и не будет проверять тестовое выражение для оператора if.

Во втором коде конкатенацияпустая строка с нулевым значением будет возвращать пустую строку, и поэтому "" & Me.Combo78.Value возвращает пустую строку, тем самым проверяя тестовое выражение.

Если вы хотите, вы можете убедиться в этом сами в окне VBE Immediate.(доступно с помощью Ctrl + G ):

?Null = ""
Null
?Null & "" = ""
True

Более читаемое решение может быть:

If IsNull(Me.Combo78) Or Me.Combo78 = "" Then
    mb "Please select a value"
End If

В качестве альтернативы вы можете использоватьфункция Nz:

If Nz(Me.Combo78, "") = "" Then
    mb "Please select a value"
End If

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

...