我试图在表格中找到空白值和空值。我使用Asc
将表的值分配给变量,然后根据它们的ASCII值区分null和blank。但是当代码尝试读取空字段的ASCII值时,我得到"runtime error 94: Invalid use of null"
。
答案 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。 注意:我从未设计过包含允许零长度字符串的字段的数据库。重复:永远。