访问Vba - 查找空值和空值

时间:2009-08-17 10:27:30

标签: ms-access vba

我试图在表格中找到空白值和空值。我使用Asc将表的值分配给变量,然后根据它们的ASCII值区分null和blank。但是当代码尝试读取空字段的ASCII值时,我得到"runtime error 94: Invalid use of null"

5 个答案:

答案 0 :(得分: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 = ""

这将更有效率。当您将处理过的数据附加到ZLS允许设置为NO(应该如此)的字段时,varZLSToNull函数最有用。

你应该考虑的另一件事是改变你的字段,以便它不允许ZLS,然后运行一个查询(使用上面的WHERE子句而没有Is Null)用Null替换所有的ZLS。

当然,假设你的数据没有区分Null和ZLS,意思是两个不同的东西(Null意思是“我们这里没有记录任何值”,而ZLS意味着“我们在这里记录了一个空值”)。

答案 1 :(得分: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(假)

应该返回:  0 -1 -2 0 0

请注意,您不能在函数声明中使用 str_in作为字符串,因为这会导致您在问题中引用相同的错误。

答案 2 :(得分:0)

我认为您应该使用IsNull()来判断某个值是否为空。

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

答案 3 :(得分:0)

将您的代码封装在if语句中,并将字符串值与vbNullString进行比较,如下所示:

If (Not (<string> = vbNullString) Then

如果字符串为非null,则执行原始代码

如果为null,则添加一个Else块,以便在值为null时执行您需要执行的操作

答案 4 :(得分:0)

是的,这是一个老线程,很重要......

这是测试Null和零长度值的最简洁方法,我见过:

FinalValue = IIf(Not Len(Nz(Value, "")) = 0, Value, Null)

与David Fenton的优秀功能相比,它的表现如何,我不知道。我知道我在这里出现的单行和David的功能几乎完全相同。我怀疑单行可能比调用函数更好一点。另一方面,它使用包含If,因此它实际上可能更慢。谁知道?

我主要在Class模块中使用它。例如,使用DAO Recordset创建记录时:

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是相关的String。 注意:我从未设计过包含允许零长度字符串的字段的数据库。重复:永远。