多选列表框上的Dcount?

时间:2012-08-07 16:18:09

标签: ms-access ms-access-2003

我再次。当只选择了1个项目时,此代码可以正常工作,但是当选择了多个项目时,我会在以下代码行中收到错误“查询表达式中的语法错误(逗号)”:     intCountNull = DCount(“*”,“Scrubbed”,strCriteria&“Is Null”)

这是我的代码:

Private Sub Command29_Click()
Dim strCriteria As String
Dim intCountNull As Integer
Dim varItem As Variant

'On Error GoTo Err_Command29_Click

Me.Fields_Values.RowSource = ""

For Each varItem In Me!List101.ItemsSelected
strCriteria = strCriteria & "," & Me!List101.ItemData(varItem)
Next varItem

strCriteria = Right(strCriteria, Len(strCriteria) - 1)

intCountNull = DCount("*", "Scrubbed", strCriteria & " Is Null")
Fields_Values.RowSource = intCountNull & " null values found in " & strCriteria

Exit_Command29_Click:
    Exit Sub
'Err_Command29_Click:
    'MsgBox "Please select a field"

End Sub

1 个答案:

答案 0 :(得分:0)

...当选择了多个项目时,我在以下代码行中收到错误“查询表达式中的语法错误(逗号)”:intCountNull = DCount("*", "Scrubbed", strCriteria & " Is Null")

这是有道理的。如果列表框选择为“field1”,“field3”和“field4”,则DCount()会在查询表达式'field1,field3,field4中输出错误#3075,“语法错误(逗号)空”。

DCount()表达式将像SELECT语句一样进行求值:

SELECT Count(*)
FROM Scrubbed
WHERE field1,field3,field4 Is Null

db引擎肯定会抱怨WHERE子句。您无法为其指定字段名称列表,并询问列表是否为Is Null。您必须单独询问每个字段Is Null

这就是为什么你得到那个错误的解释。但是,我认为你需要改变你的方法。

在迭代RowSource个所选项目时,为Fields_Values构建List101值列表字符串。 (确保将值列表作为Fields_Values的行源类型属性。)这是一个经过测试的样本,可以执行我认为您想要的内容。

Private Sub Command29_Click()
    Dim strCriteria As String
    Dim intCountNull As Integer
    Dim varItem As Variant
    Dim strRowSource As String

    Me.Fields_Values.RowSource = ""
    For Each varItem In Me!List101.ItemsSelected
        strCriteria = "[" & Me!List101.ItemData(varItem) & _
            "] Is Null"
        intCountNull = DCount("*", "Scrubbed", strCriteria)
        'Debug.Print strCriteria, intCountNull '
        strRowSource = strRowSource & ";" & intCountNull & _
            " null values found in " & _
            Me!List101.ItemData(varItem)
    Next varItem

    'Debug.Print strRowSource '
    If Len(strRowSource) > 0 Then
        strRowSource = Mid(strRowSource, 2)
        Me.Fields_Values.RowSource = strRowSource
    End If
    'Debug.Print strRowSource '
End Sub

此外,我不明白为什么甚至允许用户点击Command29,除非List101包含所选项目。因此,请考虑在选择完成之前禁用Command29

Private Sub Form_Load()
    Me.Command29.Enabled = False
End Sub

Private Sub List101_AfterUpdate()
    Me.Command29.Enabled = (Me.List101.ItemsSelected.Count > 0)
End Sub

最后,我建议您通过为控件提供有意义的名称来帮助自己:Command29可以是cmdShowNullCountsList101可以是lstFieldNames。当你处理几十个控件时,有意义的名字特别有用。当您需要在几个月后重新访问表单设计时,您还应该发现它们很有用。其他任何将来接管的人都会感激你的礼貌。