Access中如何调整DCount函数不统计Null值并判断字段重复?
Access DCount空值排除及重复值校验方案
1. DCount排除Null值的用法
- DCount函数的第一个参数如果传入
*,会统计所有符合条件的行,不判断字段是否为Null;如果传入具体字段名,就会自动跳过该字段为Null的行,示例:
错误写法(统计所有行,包含Null行):DCount("*", "[qry_DataEntry]", 条件)
正确写法(自动排除Number_1为Null的行):DCount("[Number_1]", "[qry_DataEntry]", 条件)
2. 现有VBA代码调整方案
你当前的代码有两个问题:一是用*计数会包含Null行,二是没有处理输入框为空的场景,调整后的代码如下:
Private Sub Form_Current() ' 输入框为空时直接不触发重复提示 If Nz(Me.txt_Number_1, "") = "" Then Me.txt_Duplicate.Visible = False Exit Sub End If ' 条件追加Number_1不为Null的判断,同时DCount指定字段排除空值 Dim matchCount As Long matchCount = Nz(DCount("[Number_1]", "[qry_DataEntry]", _ "[Number_1] = '" & Replace(Me.txt_Number_1, "'", "''") & "' And [Number_1] Is Not Null"), 0) ' 注:原逻辑为计数等于1时隐藏重复提示,适配“仅1条为正常、超过1条为重复”的场景;如果只要存在匹配就提示重复,把判断条件改为matchCount > 0即可 If matchCount = 1 Then Me.txt_Duplicate.Visible = False Else Me.txt_Duplicate.Visible = True End If End Sub
额外优化:新增
Replace(Me.txt_Number_1, "'", "''")处理输入内容带单引号的场景,避免SQL语法报错。
3. 改用DLookup实现校验的方案
完全可以用DLookup实现,逻辑更简洁:只要找到匹配的非Null值就判定为已存在,示例代码:
Private Sub Form_Current() Me.txt_Duplicate.Visible = False If Nz(Me.txt_Number_1, "") = "" Then Exit Sub Dim matchVal As Variant matchVal = DLookup("[Number_1]", "[qry_DataEntry]", _ "[Number_1] = '" & Replace(Me.txt_Number_1, "'", "''") & "' And [Number_1] Is Not Null") ' 查到非空值说明已存在,显示重复提示 If Not IsNull(matchVal) Then Me.txt_Duplicate.Visible = True End If End Sub
内容的提问来源于stack exchange,提问作者Mark Bakker
相关产品推荐
相关产品推荐

