У меня есть пункт If
, который полностью игнорировался, пока я не нашел обходной путь, но теперь я хотел бы лучше понять, что происходит под капотом.
У нас есть форма с полем со списком, которое заполняется, но для него не установлено значение по умолчанию. Когда я собираюсь сохранить форму, нам нужно проверить, выбрал ли пользователь значение. Код был:
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 после того, как ему передали устаревшее приложение, требующее отладки.
Если ComboBox не имеет значения, то Me.Combo78.Value
будет нулевым, и, следовательно, Me.Combo78.Value = ""
будет нулевым и не будет проверять тестовое выражение для оператора if
.
Во втором коде объединение пустой строки с нулевым значением вернет пустую строку, поэтому "" & Me.Combo78.Value
возвращает пустую строку, тем самым проверяя тестовое выражение.
При желании вы можете убедиться в этом сами в окне Immediate Window VBE (доступно с помощью 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
является членом по умолчанию для этого класса, его можно безопасно опустить.
Спасибо за очень понятное объяснение. Я пропустил, что поле Value было Variant, и поэтому undefined равно Null. Только начинаю привыкать к VBA и к тому, как он делает самые простые вещи.