当表中字段为Null时,DLookup与Nz()的正确使用格式是什么?
解决DLookup返回Null导致的运行时错误94问题
这个问题很常见——当DLookup找不到匹配值或者目标字段是Null时,它会直接返回Null,而你把Null赋值给String类型的变量other就会触发错误94(因为String变量不能存储Null值)。Nz()函数确实是解决这个问题的最佳方案,我来帮你理清正确的用法,搞定那些烦人的引号!
方案1:用Nz()直接包裹DLookup(最简洁)
直接把整个DLookup表达式作为Nz()的第一个参数,第二个参数指定当结果为Null时要返回的默认值(比如"NA")。这样other变量永远会拿到一个有效的字符串,不会出现Null:
Dim other As String ' 核心变化:把DLookup整体放入Nz()中,指定Null时返回"NA" other = Nz(DLookup("[Model]", "[Part Number & Part Name]", "[Part Number]='" & Forms![Press 2]![Containment - Press 2 subform].Form![Part Number] & "'"), "NA") ' 现在直接赋值就行,不用再判断空字符串 Me.[Model].Value = other
为什么这样有效?
Nz()函数的作用就是检查第一个参数是否为Null:如果是,就返回第二个参数的默认值;如果不是,就返回参数本身的值。这样就彻底避免了Null值进入String变量的问题,也省去了后续的判断逻辑。
额外提醒:处理Part Number中的单引号
如果你的Part Number字段值可能包含单引号(比如O'Neil),当前的写法会导致SQL语法错误。这时候需要用Replace()函数把单引号替换成双引号(Access SQL里用两个单引号表示一个转义的单引号):
Dim partNumber As String Dim other As String ' 先获取Part Number并转义单引号 partNumber = Forms![Press 2]![Containment - Press 2 subform].Form![Part Number] partNumber = Replace(partNumber, "'", "''") ' 再用转义后的参数执行DLookup+Nz other = Nz(DLookup("[Model]", "[Part Number & Part Name]", "[Part Number]='" & partNumber & "'"), "NA") Me.[Model].Value = other
方案2:用Variant变量+IsNull判断(另一种思路)
如果你不想用Nz(),也可以把other定义为Variant类型(Variant可以存储Null值),然后用IsNull()函数判断结果:
Dim other As Variant other = DLookup("[Model]", "[Part Number & Part Name]", "[Part Number]='" & Forms![Press 2]![Containment - Press 2 subform].Form![Part Number] & "'") If IsNull(other) Then Me.[Model].Value = "NA" Else Me.[Model].Value = other End If
两种方案都能解决错误94的问题,但方案1更简洁,推荐优先使用~
内容的提问来源于stack exchange,提问作者SharonIsKaren
相关产品推荐
相关产品推荐

