AccessVBAでフォームのリストボックスとテキストボックスを使ったクエリ実行方法とエラー解決法

Microsoft Access

AccessVBAでフォームに配置したリストボックスやテキストボックスを使ってクエリを実行する方法について解説します。質問者様が遭遇した「プロシージャーの呼び出し、または引数が不正です」というエラーを解決するための手順もご紹介します。

1. エラーの原因と修正方法

エラー「プロシージャーの呼び出し、または引数が不正です」の原因として、VBAコード内での変数の扱いや引数の指定に誤りがあることが多いです。今回のコードでは、`strCategory` や `strRegion` などの変数が、リストボックスから選択された値で正しく構成されていない可能性があります。

特に以下の行に問題があります。

strCategory = Left(月度, Len(月度) - 1) ' 最後のカンマを削除

この行で「月度」という変数を使っていますが、実際には `strCategory` を使用すべきです。正しくは以下のように修正します。

strCategory = Left(strCategory, Len(strCategory) - 1) ' 最後のカンマを削除

2. 正しいVBAコードの構成

リストボックスの選択項目を取得し、それをSQLクエリに適切に組み込むために、コードは以下のように修正します。

Private Sub btnFilter_Click()
    Dim strSQL As String
    Dim strWhere As String
    Dim varItem As Variant
    Dim strCategory As String
    Dim strRegion As String
    Dim strKeyword As String

    ' 初期化
    strWhere = ""
    ' 月度リストボックスの選択項目を取得
    If Me.全体標準化月度.ItemsSelected.Count > 0 Then
        For Each varItem In Me.全体標準化月度.ItemsSelected
            strCategory = strCategory & "'" & Me.全体標準化月度.ItemData(varItem) & "',"
        Next varItem
        strCategory = Left(strCategory, Len(strCategory) - 1) ' 最後のカンマを削除
        strWhere = strWhere & "Category IN (" & strCategory & ") AND "
    End If

    ' 責任部署リストボックスの選択項目を取得
    If Me.全体責任部署条件.ItemsSelected.Count > 0 Then
        For Each varItem In Me.全体責任部署条件.ItemsSelected
            strRegion = strRegion & "'" & Me.全体責任部署条件.ItemData(varItem) & "',"
        Next varItem
        strRegion = Left(strRegion, Len(strRegion) - 1) ' 最後のカンマを削除
        strWhere = strWhere & "Region IN (" & strRegion & ") AND "
    End If

    ' 不良発生日テキストボックスの入力値を取得
    If Nz(Me.全体不良発生日1, "") <> "" Then
        strKeyword = Me.全体不良発生日1
        strWhere = strWhere & "不良発生日 LIKE '*' & strKeyword & '*' AND "
    End If

    ' 最後の 'AND' を削除
    If strWhere <> "" Then
        strWhere = Left(strWhere, Len(strWhere) - 5)
    End If

    ' クエリのSQLを構築
    strSQL = "SELECT * FROM 000組立発見不良"
    If strWhere <> "" Then
        strSQL = strSQL & " WHERE " & strWhere
    End If

    ' フォームのレコードソースを更新
    Me.RecordSource = strSQL
    Me.Requery
    DoCmd.OpenQuery "300全体(標準化)"
End Sub

3. クエリの最適化

SQL文を構築する際は、条件を正しく追加し、無駄な文字列が含まれないように注意しましょう。また、`Nz()` 関数を使ってNull値の処理を行い、ユーザーが入力しない場合でも適切な動作を保証します。

4. フォームのレコードソース更新後の動作確認

レコードソースを更新した後に、フォームの表示を再読み込みするために `Me.Requery` を使います。これにより、クエリの結果に基づいてフォームが最新の情報で更新されます。

まとめ

このエラーは、VBAコード内での変数の扱いやSQLクエリの構築に関連した問題です。コードを修正し、変数名を正しく使用することで、問題を解決できます。また、リストボックスでの選択内容を適切に処理することが重要です。上記の手順を参考に、問題を解決し、フォームでクエリを正しく実行しましょう。

コメント

タイトルとURLをコピーしました