質問: Access VBAで選択クエリと同等の操作をさせる方法について 閲覧ありがとうございます。 【教えてほしいこと】 以下のやりたいことを実施するにあたり、どういう検索でやり方がヒットするのか、関数などのキーワードなどだけでも結構ですので、ヒントを教えていただきたいです。 【やりたいこと】 選択クエリをAccess VBAで作成、実行したいです。 あらかじめクエリを作成しクエリを実行するというコードではなく、 AccessVBAで全て完結させたいです。(クエリ一覧にクエリが増えていくのを避けるため、クエリを作らずクエリと同等の内容をvbaでできるようにしたいです。) 【具体的にやりたいこと】 テーブルAである条件での選択クエリを実行する。 出てきたレコードで、left関数によりフィールドAの先頭3文字を抜き出した文字だけのフィールドBを作る。 テーブルCのフィールドDと、テーブルAのフィールドAで同じ文字のレコードのみを出す。
回答: accessのSQLビューを使えばテーブルの結合や副問い合わせのSQLが簡単に作れます。 私は「簡単テーブル結合」「簡単副問い合わせ」または「楽々テーブル結合」「楽々副問い合わせ」と呼んでます。 テーブルの結合は複数テーブルの結合したクエリをSQLビューで見ればそれが求めるSQLそのものです。 問い合わせは少し作業が必要ですが、機械的な作業なので難しくは無いと思います。 質問の「具体的」があまり具体的でないので下の場合です。 ある商品の在庫のテーブル「テーブル1」があるとします。 [品名]の先頭3文字が[型式]で、最終製品の製品名と型式のテーブルが「テーブル2」と「テーブル3」だとします。 この時、在庫が1個の型式の製品名を表示する場合です。 【 テーブル1 】 品名 個数 AAA123 1 BBB456 1 CCC789 2 DDD123 3 【 テーブル2 】 製品名 型式 A2 AAA A22 AAA B2 BBB C2 CCC 【 テーブル3 】 製品名 型式 A3 AAA B3 BBB C3 CCC D3 DDD Accessのクエリデザインを使ってクエリを作ります。 在庫が1個の型番(品名の先頭3文字)のクエリを「クエリ1」とします。 【 クエリ1 】 [sqlビュー] SELECT Left([品名],3) AS 型式 FROM テーブル1 WHERE ((([テーブル1].個数)=1)); 型式 AAA BBB 「テーブル2」と「テーブル3」の中で在庫が1個の型番の製品名のクエリを各々「クエリ2」と「クエリ3」とします。 【 クエリ2 】 [sqlビュー] SELECT [テーブル2].* FROM テーブル2 INNER JOIN クエリ1 ON [テーブル2].型式 = [クエリ1].型式; 製品名 型式 A22 AAA A2 AAA B2 BBB 【 クエリ3 】 [sqlビュー] SELECT [テーブル3].* FROM テーブル3 INNER JOIN クエリ1 ON [テーブル3].型式 = [クエリ1].型式; 製品名 型式 A3 AAA B3 BBB 「クエリ2」と「クエリ3」を同時に表示するクエリを「クエリ4」とします。 [sqlビュー] SELECT * FROM クエリ2 UNION ALL SELECT * FROM クエリ3; 製品名 型式 A22 AAA A2 AAA B2 BBB A3 AAA B3 BBB このクエリ1からクエリ4を使って、VBAからSQLのみで在庫1個の型式の製品名一覧(クエリ4の結果)を作ります。 まず4つのクエリの最後の;を取って文字列にします。 クエリ1 = "SELECT Left([品名],3) AS 型式 FROM テーブル1 WHERE ((([テーブル1].個数)=1))" クエリ2 = "SELECT [テーブル2].* FROM テーブル2 INNER JOIN クエリ1 ON [テーブル2].型式 = [クエリ1].型式" クエリ3 = "SELECT [テーブル3].* FROM テーブル3 INNER JOIN クエリ1 ON [テーブル3].型式 = [クエリ1].型式" クエリ4 = "SELECT * FROM クエリ2 UNION ALL SELECT * FROM クエリ3" 次にクエリの内容を()で囲んで最後に「AS クエリ名」を付けます。 クエリ1 = "(SELECT Left([品名],3) AS 型式 FROM テーブル1 WHERE ((([テーブル1].個数)=1))) AS クエリ1" クエリ2 = "(SELECT [テーブル2].* FROM テーブル2 INNER JOIN クエリ1 ON [テーブル2].型式 = [クエリ1].型式) AS クエリ2" クエリ3 = "(SELECT [テーブル3].* FROM テーブル3 INNER JOIN クエリ1 ON [テーブル3].型式 = [クエリ1].型式) AS クエリ3 クエリ4 = "(SELECT * FROM クエリ2 UNION ALL SELECT * FROM クエリ3) AS クエリ4" 次にクエリ内のクエリ名を参照してる部分を変数の参照に変えます。(「FROM クエリ名」や「JOIN クエリ名」の「クエリ名」を「" & クエリ名 & "」に変更) クエリ1 = "(SELECT Left([品名],3) AS 型式 FROM テーブル1 WHERE ((([テーブル1].個数)=1))) AS クエリ1" クエリ2 = "(SELECT [テーブル2].* FROM テーブル2 INNER JOIN " & クエリ1 &" ON [テーブル2].型式 = [クエリ1].型式) AS クエリ2" クエリ3 = "(SELECT [テーブル3].* FROM テーブル3 INNER JOIN " & クエリ1 &" ON [テーブル3].型式 = [クエリ1].型式) AS クエリ3 クエリ4 = "(SELECT * FROM " & クエリ2 &" UNION ALL SELECT * FROM " & クエリ3 &") AS クエリ4" 4つのクエリから作ったSQLをプログラムに組み込みます。 型番ごとに製品名を表示します。 Sub sample() Dim クエリ1 As String Dim クエリ2 As String Dim クエリ3 As String Dim クエリ4 As String クエリ1 = "(SELECT Left([品名],3) AS 型式 FROM テーブル1 WHERE ((([テーブル1].個数)=1))) AS クエリ1" クエリ2 = "(SELECT [テーブル2].* FROM テーブル2 INNER JOIN " & クエリ1 & " ON [テーブル2].型式 = [クエリ1].型式) AS クエリ2" クエリ3 = "(SELECT [テーブル3].* FROM テーブル3 INNER JOIN " & クエリ1 & " ON [テーブル3].型式 = [クエリ1].型式) AS クエリ3" クエリ4 = "(SELECT * FROM " & クエリ2 & " UNION ALL SELECT * FROM " & クエリ3 & ") AS クエリ4" Dim sql As String Dim rs As Recordset Dim s As String sql = "select * from " & クエリ4 & " ORDER BY 型式" Set rs = CurrentDb.OpenRecordset(sql) s = "型式" & vbTab & "製品名" & vbCrLf Do While Not rs.EOF s = s & rs("型式") & vbTab & rs("製品名") & vbCrLf rs.MoveNext Loop MsgBox s End Sub [ 結果 ] 型式 製品名 AAA A3 AAA A2 AAA A22 BBB B3 BBB B2