Доступ к Vba - найти нулевые и пустые значения

Я пытаюсь найти пустые значения и нулевые значения в таблице. Я использую Asc для присвоения значений таблицы переменной, а затем на основе их значений ASCII, различающих нуль и пустое значение. Но я получаю "runtime error 94: Invalid use of null", когда код пытается прочитать значение ASCII пустого поля.


person tksy    schedule 17.08.2009    source источник
comment
Могу я спросить, для чего вы используете эту функцию? Если вы действительно пытаетесь найти их в таблице, почему бы просто не указать null или в условии запроса вместо вызова функции?   -  person JohnFx    schedule 19.08.2009


Ответы (5)


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

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 как строку в объявлении функции, так как это вызовет ту же ошибку, на которую вы ссылаетесь в своем вопросе.

person user25095    schedule 17.08.2009

Когда мне приходится иметь дело с возвращаемыми значениями, которые могут быть либо 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 означает «мы записали здесь пустое значение»).

person David-W-Fenton    schedule 17.08.2009

Я думаю, вы должны использовать IsNull(), чтобы решить, является ли значение нулевым.

https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5034252.html

person pjp    schedule 17.08.2009
comment
под пробелом я подразумеваю пробелы или backspace - person tksy; 17.08.2009
comment
Используйте комбинацию Trim() и Len(), т.е. empty = IsNull(thing) OR Len(Trim(thing))=0 - person pjp; 17.08.2009
comment
То, что вы используете, зависит от контекста. В операторе SQL использование IsNull() не имеет смысла — вместо этого вы должны использовать Is Null в критериях вместо проверки IsNull()=True. Для строк нулевой длины вы тестируете = вместо того, чтобы использовать кучу вложенных функций, чтобы избавиться от ZLS. - person David-W-Fenton; 18.08.2009
comment
То, что ядро ​​базы данных Access не поддерживает функции SQL-92 COALESCE и NULLIF в наши дни, не имеет смысла. - person onedaywhen; 19.08.2009

инкапсулируйте свой код в оператор if и сравните строковое значение с vbNullString следующим образом:

If (Not (<string> = vbNullString) Then

если строка НЕ ​​равна нулю, выполните исходный код

если оно равно null, добавьте блок Else для выполнения того, что вам нужно сделать, если значение равно null

person Community    schedule 17.08.2009

Да, это старая нить, большое дело...

Это самый лаконичный способ проверить значение 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 является соответствующей строкой. Примечание. Я никогда не разрабатываю базы данных с полями, допускающими строки нулевой длины. Повторяю: НИКОГДА.

person whistle britches    schedule 07.08.2014