回答受付終了まであと7日

リストボックス複数選択に基づき、クエリー抽出のVBAについて質問です。 抽出元クエリーの ”000組立発見不良” のレコードからフォームに配置した リストボックスの名前が、”全体責任部署条件” のリストホックスにて複数 選択した責任部署のレコードを抽出(抽出クエリ名:315全体_標準化項目別_条件検索)したく、下記VBA作成しましたが思うように動かなく、どちら様かご助言ください。 ************検討中 VBA************** Dim lst As ListBox Dim selectedValues As String Dim i As Integer Dim sqlQuery As String ' リストボックスを取得 Set lst = Me.全体責任部署条件 ' 選択された値をカンマ区切りで取得 selectedValues = "" For i = 0 To lst.ListCount - 1 If lst.Selected(i) Then ' 選択された値を文字列に追加(シングルクォートで囲む) selectedValues = selectedValues & "'" & lst.ItemData(i) & "'," End If Next i ' 選択がない場合の処理 If selectedValues = "" Then MsgBox "リストボックスから値を選択してください。", vbExclamation Exit Sub End If ' 最後のカンマを削除 selectedValues = Left(selectedValues, Len(selectedValues) - 1) ' SQLクエリを作成 sqlQuery = "SELECT * FROM 000組立発見不良 WHERE 工程名 IN (" & selectedValues & ");" ' クエリを実行(例: フォームに結果を表示) Me.RecordSource = sqlQuery Me.Requery ' メッセージ表示 MsgBox "クエリが実行されました。", vbInformation DoCmd.OpenQuery "315全体_標準化項目別_条件検索" ************************************

Visual Basic40閲覧

回答(3件)

>思うように動かなく ぱっと見では問題はありません。 どこで引っかかって、どのような状況なのですか? エラーが出るのですか? フォームが問題なのですか? 最後のクエリの状況が問題なのですか?

この回答はいかがでしたか? リアクションしてみよう

> 思うように動かなく どう動けばよいのかは貴方以外は知りませんから、具体的に何がおかしいのか、エラーが出るならどこでどういうメッセージが出るのか等を書いてください。 とりあえず以下は変更しないとエラーになります。 Dim lst As ListBox ↓ Dim lst As MSForms.ListBox

AIアイコン

AIからのお助け回答

AIアイコンClaude(Anthropic)

VBAコードに問題がいくつか見られます。修正案を以下に示します: 1. `lst.ItemData(i)` の部分が問題です。リストボックスの値を取得するには通常 `lst.ItemData(i)` ではなく `lst.Column(0, i)` または `lst.List(i)` を使用します。 2. フォームのRecordSourceを直接変更した後に、DoCmd.OpenQueryでクエリを開いていますが、これは矛盾する操作です。 3. 選択された値をIN句で使用する際の構文に問題があります。 修正したコードは以下の通りです: ```vba Dim lst As ListBox Dim selectedValues As String Dim i As Integer Dim sqlQuery As String Dim db As DAO.Database ' リストボックスを取得 Set lst = Me.全体責任部署条件 ' 選択された値をカンマ区切りで取得 selectedValues = "" For i = 0 To lst.ListCount - 1 If lst.Selected(i) Then ' 選択された値を文字列に追加(シングルクォートで囲む) selectedValues = selectedValues & "'" & lst.Column(0, i) & "'," End If Next i ' 選択がない場合の処理 If selectedValues = "" Then MsgBox "リストボックスから値を選択してください。", vbExclamation Exit Sub End If ' 最後のカンマを削除 selectedValues = Left(selectedValues, Len(selectedValues) - 1) ' データベース参照を設定 Set db = CurrentDb() ' クエリの条件を更新 sqlQuery = "PARAMETERS [責任部署条件] Text; " & _ "SELECT * FROM [000組立発見不良] " & _ "WHERE [工程名] IN (" & selectedValues & ");" ' 既存のクエリを更新する場合 Dim qdf As DAO.QueryDef Set qdf = db.QueryDefs("315全体_標準化項目別_条件検索") qdf.SQL = sqlQuery qdf.Close ' クエリを実行 DoCmd.OpenQuery "315全体_標準化項目別_条件検索" ' メッセージ表示 MsgBox "クエリが実行されました。", vbInformation ``` または、既存のクエリを使用して条件を設定する別の方法: ```vba Dim lst As ListBox Dim selectedValues As String Dim i As Integer ' リストボックスを取得 Set lst = Me.全体責任部署条件 ' 選択された値をカンマ区切りで取得 selectedValues = "" For i = 0 To lst.ListCount - 1 If lst.Selected(i) Then ' 選択された値を文字列に追加(シングルクォートで囲む) selectedValues = selectedValues & "'" & lst.Column(0, i) & "'," End If Next i ' 選択がない場合の処理 If selectedValues = "" Then MsgBox "リストボックスから値を選択してください。", vbExclamation Exit Sub End If ' 最後のカンマを削除 selectedValues = Left(selectedValues, Len(selectedValues) - 1) ' クエリのパラメータに値を設定 With CurrentDb.QueryDefs("315全体_標準化項目別_条件検索") .Parameters("責任部署条件") = selectedValues End With ' クエリを実行 DoCmd.OpenQuery "315全体_標準化項目別_条件検索" ' メッセージ表示 MsgBox "クエリが実行されました。", vbInformation ``` この場合、クエリ「315全体_標準化項目別_条件検索」は以下のようなSQL文を持っている必要があります: ```sql PARAMETERS [責任部署条件] Text; SELECT * FROM [000組立発見不良] WHERE [工程名] IN ([責任部署条件]); ``` 注意点: ・リストボックスの値を取得する方法は、リストボックスの設定によって異なります ・クエリのフィールド名(工程名)が正しいか確認してください ・パラメータクエリを使用する場合は、クエリデザイナーでパラメータを正しく設定してください

この回答は生成AIで作成したものであり、最新性や正確性等を保証するものではありません。その他注意事項はこちら