1

もう一度私。このコードは、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"

サブ終了

4

1 に答える 1

0

...複数の項目を選択すると、次のコード行に「クエリ式の構文エラー(カンマ)」というエラーが表示されます。intCountNull = DCount("*", "Scrubbed", strCriteria & " Is Null")

それは理にかなっている。リストボックスの選択が「field1」、「field3」、および「field4」の場合、DCount()エラー#3075「クエリ式'field1、field3、field4 Is Null'の構文エラー(コンマ)」がスローされます。

式は次のDCount()SELECTステートメントのように評価されます。

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

そして、dbエンジンは間違いなくWHEREその節について文句を言うでしょう。フィールド名のリストを指定して、リストかどうかを尋ねることはできませんIs Null。各フィールドかどうかを個別に確認する必要がありますIs Null

これが、そのエラーが発生する理由の説明です。ただし、アプローチを変える必要があると思います。

選択したアイテムを反復処理しながら、のRowSource値リスト文字列を作成します。(の行ソースタイププロパティとして値リストがあることを確認してください。)これは、私が望むことを実行するテスト済みのサンプルです。 Fields_ValuesList101Fields_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。意味のある名前は、数十のコントロールを扱う場合に特に役立ちます。また、数か月後にフォームのデザインを再検討する必要がある場合にも役立ちます。将来引き継ぐ必要がある他の人はあなたの礼儀に感謝します。

于 2012-08-07T20:03:34.387 に答える