Доступ к 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)


arrow_upward
1
arrow_downward

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

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

arrow_upward
3
arrow_downward

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

arrow_upward
0
arrow_downward

Я думаю, вы должны использовать 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

arrow_upward
0
arrow_downward

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

If (Not (<string> = vbNullString) Then

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

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

person Community    schedule 17.08.2009

arrow_upward
0
arrow_downward

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

Это самый лаконичный способ проверить значение 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