Я пытаюсь найти пустые значения и нулевые значения в таблице. Я использую Asc для присвоения значений таблицы переменной, а затем на основе их значений ASCII, различающих нуль и пустое значение. Но я получаю "runtime error 94: Invalid use of null", когда код пытается прочитать значение ASCII пустого поля.
Доступ к Vba - найти нулевые и пустые значения
Ответы (5)
1
Вы можете попробовать следующую пользовательскую функцию для проверки значения таблицы:
Public Function text_test(str_in as Variant) As Long
' given input str_in, return -2 if input is Null,
' -1 if input is zero-length string; otherwise return 0
' use function Nz to test if input is Null and return -2,
' otherwise check non-null value with Len
' and return -1 if it is a 0-length string,
' otherwise return 0 for anything else
text_test = IIf(Nz([str_in], "null") = "null", -2, _
IIf(Len(str_in) = 0, -1, 0))
End Function
В ближайшем окне запустите тест с разными входными данными: ?text_test("fred");text_test("");text_test(Null);text_test(9);text_test(False)
Должно вернуться: 0 -1 -2 0 0
Обратите внимание, что вы не можете использовать str_in как строку в объявлении функции, так как это вызовет ту же ошибку, на которую вы ссылаетесь в своем вопросе.
3
Когда мне приходится иметь дело с возвращаемыми значениями, которые могут быть либо Null, либо строкой нулевой длины, я использую функцию, которая преобразует ZLS в Null:
Public Function varZLStoNull(varInput As Variant) As Variant
If Len(varInput) = 0 Then
varZLStoNull = Null
Else
varZLStoNull = varInput
End If
End Function
Это использует тот факт, что функция VBA Len() обрабатывает Null и ZLS точно так же, поэтому вам не нужно обрабатывать каждый случай отдельно.
Однако помните, что если вы используете это в предложении WHERE, вы потеряете производительность, потому что он не может использовать индексы. Таким образом, в предложении WHERE вы должны проверить IS NULL или =""
SELECT MyField
FROM MyTable
WHERE MyField Is Null Or MyField = ""
Это будет намного эффективнее. Функция varZLSToNull наиболее полезна, когда вы добавляете обработанные данные в поле, для которого ZLS Allowed имеет значение NO (как и должно быть).
Еще одна вещь, которую вы должны рассмотреть, - это изменить свое поле, чтобы оно запрещало ZLS, а затем выполнить запрос (используя предложение WHERE выше без Is Null), чтобы заменить все ZLS на Nulls.
Конечно, это предполагает, что ваши данные не различают Null и ZLS, поскольку это означает две разные вещи (Null означает «мы не записали здесь никакого значения», а ZLS означает «мы записали здесь пустое значение»).
0
Я думаю, вы должны использовать IsNull(), чтобы решить, является ли значение нулевым.
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5034252.html
0
инкапсулируйте свой код в оператор if и сравните строковое значение с vbNullString следующим образом:
If (Not (<string> = vbNullString) Then
если строка НЕ равна нулю, выполните исходный код
если оно равно null, добавьте блок Else для выполнения того, что вам нужно сделать, если значение равно null
0
Да, это старая нить, большое дело...
Это самый лаконичный способ проверить значение Null и нулевой длины, который я видел:
FinalValue = IIf(Not Len(Nz(Value, "")) = 0, Value, Null)
Как это может работать по сравнению с превосходной функцией Дэвида Фентона выше, я не знаю. Я знаю, что однострочник, который я здесь представляю, и функция Дэвида делают почти одно и то же. Я подозреваю, что однострочник может работать немного лучше, чем вызов функции. С другой стороны, он использует включающее If, поэтому на самом деле он может быть медленнее. Кто знает?
Я использую его в основном в модулях класса. Например, при создании записи с набором записей DAO:
With rst
.AddNew
!JobCardID = IIf(Not m_JobCardID = 0, m_JobCardID, Null)
!ConstructionProjectID = IIf(Not m_ConstructionProjectID = 0, m_ConstructionProjectID, Null)
!MajorDisciplineID = IIf(Not m_MajorDisciplineID = 0, m_MajorDisciplineID, Null)
!ActivityDescriptorID = IIf(Not m_ActivityDescriptorID = 0, m_ActivityDescriptorID, Null)
!ActivityStatus = IIf(Not Len(Nz(m_ActivityStatus, "")) = 0, m_ActivityStatus, Null
'etc...
End With
В приведенном выше коде ActivityStatus является соответствующей строкой. Примечание. Я никогда не разрабатываю базы данных с полями, допускающими строки нулевой длины. Повторяю: НИКОГДА.