Access2000VBAでテーブルの内容を抽出して新しいテーブルを作成する方法

このQ&Aのポイント
  • Access2000VBAで、開いているデーターベースのテーブルから抽出条件を指定してSQLを使用してデータを抽出し、新しいテーブルを作成する方法を知りたいです。
  • DAOを使用して、SQLでテーブルから必要な条件をセットし、レコードセットに格納することはできますが、そのまま新しいテーブルに作成してデータを格納する方法はありません。
  • AccesVBAに詳しい方に助言を求めています。
回答を見る
  • ベストアンサー

Access2000VBAにてDAOでカレントにあるテーブルの内容をSQLで抽出して別のテーブルを作成する方法

こんにちは Access2000VBA初心者です。 現在開いているデーターベースで、フォーム上から抽出条件を入力してそれをSQLに渡し、定義させているテーブルから抽出して新しいテーブルを作成する記述がわかりません。 DAOでできそうなのですが、VBA教本を読んでいるとDebug.printで抽出結果を表示して終わっているのでそれ以上のことが書いてありません。 やりたいことは、SQLでテーブルから必要な条件をセットしてそれをrecordsetにいれるのだと思いますが、 そのrecordsetをなんとか新しいテーブルに作成して入れることはできないのでしょうか。 AccessVBAに明るい方よろしくお願いいたします。

  • hooma
  • お礼率32% (51/157)

質問者が選んだベストアンサー

  • ベストアンサー
  • ARC
  • ベストアンサー率46% (643/1383)
回答No.2

補足拝見しました。 やりたいことは、「テーブル作成クエリ」をVBA中で実行したいんですよね。 試しに、実際にテーブル作成クエリを作ってみまして、それをSQLビューにすると、以下のようになるはずです。 SELECT [0111ITMZ].* INTO 作成するテーブル名 FROM 0111ITMZ WHERE ((([0111ITMZ].M_HBCOD2)>="5000" And ([0111ITMZ].M_HBCOD2)<"6000")); -+-+-+-+-+-+ ちょっと見難いので簡略化して、こんな感じ。 SELECT * INTO 作成するテーブル名 FROM 0111ITMZ WHERE M_HBCOD2 >= '5000' And M_HBCOD2 < '6000'; 試しに上記をクエリのSQLビューにコピー,貼り付けして、実行してみて下さい。([!]のアイコン) 正常にテーブルが作成されることが確認できたと思います。 -+-+-+-+-+-+ これをVBAで書くとすると、以下のようになります。 変数 = "SELECT * INTO 作成するテーブル名" _   & " FROM 0111ITMZ" _   & " WHERE M_HBCOD2 >= '5000'" _   & " And M_HBCOD2 < '6000';" -+-+-+-+-+-+ で、このVBA中の、「5000」と「6000」をフォームに入力した値で置き換えたいわけです。 フォーム[条件フォーム]上に、二つのテキストボックス[コード開始]と[コード終了]があるとします。 この場合、以下のように書きます。 変数 = "SELECT * INTO 作成するテーブル名" _   & " FROM 0111ITMZ" _   & " WHERE M_HBCOD2 >= '" & Forms("条件フォーム")![コード開始] & "'" _   & " And M_HBCOD2 < '" & Forms("条件フォーム")![コード終了] & "';" これで、変数の中にフォームを参照したSQLが入る筈です。 -+-+-+-+-+ あとはこのSQLを実行すればいいだけですので、Currentdb.Executeで、実行します。こんな感じ。 変数 = "SELECT * INTO 作成するテーブル名" _   & " FROM 0111ITMZ" _   & " WHERE M_HBCOD2 >= '" & Forms("条件フォーム")![コード開始] & "'" _   & " And M_HBCOD2 < '" & Forms("条件フォーム")![コード終了] & "';" Currentdb.Execute SQL -+-+-+-+ 残るは誤入力対策ですね。テキストボックスに数値以外を入れればエラーになるようにするのでしたら、 If IsNumeric(Forms("条件フォーム")![コード開始]) = False Then   MsgBox "[コード開始]には数値を入力してちょ☆"   Exit Sub End If If IsNumeric(Forms("条件フォーム")![コード終了]) = False Then   MsgBox "[コード終了]には数値を入力してちょ☆"   Exit Sub End If 変数 = "SELECT * INTO 作成するテーブル名" _   & " FROM 0111ITMZ" _   & " WHERE M_HBCOD2 >= '" & Forms("条件フォーム")![コード開始] & "'" _   & " And M_HBCOD2 < '" & Forms("条件フォーム")![コード終了] & "';" Currentdb.Execute SQL ってな感じにします。(実際に作成するときには、こんなふざけたメッセージを表示させてはいけません(笑)) -+-+-+-+ 尚、このVBAを条件フォームに配置したボタンなどから実行させるのでしたら、「Forms("条件フォーム")!」の部分を、「Me.」に置き換えても構いません。 If IsNumeric(Me.コード開始) = False Then   MsgBox "[コード開始]には数値を入力してちょ☆"   Exit Sub End If If IsNumeric(Me.コード終了) = False Then   MsgBox "[コード終了]には数値を入力してちょ☆"   Exit Sub End If 変数 = "SELECT * INTO 作成するテーブル名" _   & " FROM 0111ITMZ" _   & " WHERE M_HBCOD2 >= '" & Me.コード開始 & "'" _   & " And M_HBCOD2 < '" & Me.コード終了 & "';" Currentdb.Execute SQL -+-+-+-+-+ 尚、ここまで書いといて何ですが、実際にAccessを使わずに頭の中だけで作っています。(横着モード) コード自体には問題はないはずですが、スペルミスや、括弧の閉じ忘れ等あるかもしれません。 何か問題があるようでしたら、補足欄にその旨お書きください。 でわ! P.S. セミコロンは、SQLの一番最後につけます。SQLの終了を示すためのマークなのです。

その他の回答 (2)

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.3

訂正です(^^; Currentdb.Execute SQL となっている行を全て、 Currentdb.Execute 変数 と置き換えてお読みください。 でわでわ

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.1

つまり、入力フォームを作成して、それを参照して、SQLを組み立て、 set RS = currentdb.OpenRecordset(SQL) などとして、レコードセットを作成するところまでは出来ている、と解釈してもよろしいですか? で、それを新規テーブルにコピーするのですが、 現在、 SELECT ○○ FROM △△ WHERE □□; ってなSQLが出来ていると思います。 これに少し加工をしまして、 SELECT ○○ INTO 新規テーブル名 FROM △△ WHERE □□; ってなSQLを作成してください。 んで、 Currentdb.Execute SQL などとして、このSQL を実行してください。 尚、既に同名のテーブルがある場合は、そのテーブルを一旦削除した後、新たにテーブルが作成されます。 これで分かりますでしょうか? も少し具体的な回答も書きたかったのですが、どういう風にSQLを組み立ててらっしゃるのかがちと不明でしたので… より詳しい回答をご所望でしたら、SQLを組み立てている部分のコードを、補足にでも書いていただければ幸いです。

hooma
質問者

補足

こんにちは アドバイス感謝いたします。。 やりたいことは下記のようなSQL記述です。 SELECT [0111ITMZ].* FROM 0111ITMZ WHERE ((([0111ITMZ].M_HBCOD2)>="5000" And ([0111ITMZ].M_HBCOD2)<"6000")); そしてフォームから入力する内容はWHERE句の"5000"と"6000"の部分です。 この部分を変数にしてデータ抽出したいのですが。 また上記のSQL記述はAccessのSQLビューから持ってきた記述ですが、 VBAでこの内容を記述する時には 変数="SELECT [0111ITMZ].*"_ & "FROM 0111ITMZ;"_ & "WHERE ((([0111ITMZ].M_HBCOD2)>="5000" And ([0111ITMZ].M_HBCOD2)<"6000"));" などのように" "でくくってあげればよろしいでしょうか。 またセミコロンをどこでつければいいのかはっきり理解していないレベルなものでして。 いろいろご面倒おかけしますが、よろしくお願いいたします。

関連するQ&A

  • ACCESS VBA 2つのテーブルから抽出

    ACCESS VBA初心者です 見よう見まねで作成してみたのですが、デバックになってしまい先に進めません どなたか、どこがどう違うのか教えてください テーブル1とテーブル2の15項目ほどをぶつけて 一致しないレコードを抽出し、その抽出したレコードを既存のテーブル3にコピーをしたいのですが、その方法がわかりません Sub QQ() Dim DB As DAO.Database Set DB = CurrentDb() DB.Execute "DELETE * FROM テーブル3;" Dim strSQL As String strSQL = "INSERT INTO テーブル3 ( AAA, BBB, CCC, DDD, EEE, FFF, GGG, HHH, III, JJJ ) " strSQL = strSQL & " SELECT テーブル1.AAA, テーブル1.BBB, テーブル1.CCC, テーブル1.DDD, テーブル1.EEE, テーブル1.FFF, テーブル1.GGG, テーブル1.HHH, テーブル1.III, テーブル1.JJJ, FROM AAA;" DB.Execute strSQL Dim TB_テーブル2 As DAO.Recordset Dim TB_テーブル3 As DAO.Recordset Set TB_テーブル2 = DB.OpenRecordset("Select * from テーブル2;") While TB_テーブル2.EOF = False Debug.Print TB_テーブル2![AAA] Debug.Print TB_テーブル2![BBB] Debug.Print TB_テーブル2![CCC] Debug.Print TB_テーブル2![DDD] Debug.Print TB_テーブル2![EEE] Debug.Print TB_テーブル2![FFF] Debug.Print TB_テーブル2![GGG] Debug.Print TB_テーブル2![HHH] Debug.Print TB_テーブル2![III] Debug.Print TB_テーブル2![JJJ] strSQL = "SELECT テープ3.* FROM テーブル3 " strSQL = strSQL & "WHERE (((テーブル3.AAA)='" & TB_テーブル2![AAA] & "') " ←デバックヵ所 strSQL = strSQL & " AND ((テーブル3.BBB)='" & TB_テーブル2![BBB] & "') " strSQL = strSQL & " AND ((テーブル3.CCC)='" & TB_テーブル2![CCC] & "') " strSQL = strSQL & " AND ((テーブル3.DDD)='" & TB_テーブル2![DDD] & "') " strSQL = strSQL & " AND ((テーブル3.EEE)='" & TB_テーブル2![EEE] & "') " strSQL = strSQL & " AND ((テーブル3.FFF)='" & TB_テーブル2![FFF] & "') " strSQL = strSQL & " AND ((テーブル3.GGG)='" & TB_テーブル2![GGG] & "') " strSQL = strSQL & " AND ((テーブル3.HHH)='" & TB_テーブル2![HHH] & "') " strSQL = strSQL & " AND ((テーブル3.III)='" & TB_テーブル2![III] & "') " strSQL = strSQL & " AND ((テーブル3.JJJ)=" & TB_テーブル2![JJJ] & "));" Set TB_テーブル3 = DB.OpenRecordset(strSQL) Debug.Print "COUNT=" & TB_テーブル3.RecordCount If TB_CCC.RecordCount > 0 Then Debug.Print "削除" TB_テーブル3.Delete Else Debug.Print "追加" TB_テーブル3.AddNew TB_テーブル3![AAA] = TB_テーブル2![AAA] TB_テーブル3![BBB] = TB_テーブル2![BBB] TB_テーブル3.Update End If TB_テーブル3.Close TB_テーブル2.MoveNext Wend TB_テーブル2.Close DB.Close End Sub

  • access SQLを基にしてフォームは作成できるか

    access で、VBAにSQLを記述し、 その抽出結果を基にしてフォームは作成できるのでしょうか? また、SQLを基にテーブルを作成し、テーブルを基にフォームを作成できるのでしょうか? いわゆる「検索」に利用できればと考えています。 よろしくお願いします。

  • ExcelVBAにて外部データ(*.csv)をSQL文を使って抽出する方法

    こんにちは VBAインポート問題で日々悩んでいるものです。 CSV形式のデータをODBCのシステムDSNに登録し、それをDAOでSQL要求しデータを抽出する方法がよくわかりません。 (1)データベースの定義記述内容 (2)レコードセットにSQL命令をかける記述 (3)抽出された内容をワークシートに貼る記述 等がよくわかりません。 DAOの場合、レコードセットを定義するのに set DB=DBEngine.OpenDatabase("******")があったり、なかったりする理由がわかりません。 突然、set rs = CurrentDb.OpenRecordset("*****") しているのはなぜでしょうか。

  • Access VBA 日付で抽出できない?

    次の質問にお答えいただけませんか。 フォームで抽出条件を入力しテーブルから抽出をするとき Dim db As DAO.Database Dim rs As DAO.Recordset Dim mySQL As String Set db = CurrentDb() mySQL = "SELECT * FROM T_明細 " _ & "WHERE 顧客ID = " & CStr(Me!txtKey) & ";" Set rs = db.OpenRecordset(mySQL, dbOpenDynaset) 上記のような記述をしました。 テーブル名:T_明細   フィールド:顧客ID  日付 金額  フォームの抽出条件入力テキストボックス:txtKey このとき顧客IDでの抽出は問題なく出来ましたが "WHERE 顧客ID = を "WHERE 日付 = に変更して日付で抽出をしたいのですがうまくいきません。 テーブルの日付フィールドは 書式をgee-mm-dd 定型入力を>L99\-99\-99;0;# で書き込みました。 フォームのtxtKeyテキストボックスのプロパティも書式をgee-mm-dd 定型入力を>L99\-99\-99;0;#に設定してあります。 このようなときは mySQL = "SELECT * FROM T_明細 " _ & "WHERE 日付 = " & CStr(Me!txtKey) & ";" の、記述を何か変更しないといけないような気もしますが 対処の方法を教えていただけませんか。

  • DAOでODBC経由のRDBに接続し、SQLでアクセスしたい。

    Dim ws As DAO.Workspace, db As DAO.Database Dim rs As DAO.Recordset ' デフォルトのワークスペースを定義する Set ws = DBEngine.Workspaces(0) ' ODBC接続文字列を指定してデータベースを開く Set db = ws.OpenDatabase("", False, False, _ "DSN=SQL_K;ODBC;Driver={SQK_K};" & _ "SERVER=(local);DATABASE=pubs;" & _ "UID=*****;PWD=*****;" ' SQLステートメントを指定してレコードセットを作成する Set rs = db.OpenRecordset("select * from TWSQLK1",dbOpenDynaset, dbSeeChanges)   このレコードセットは正常に行きますが   直接SQLを記述する方法が、わかりません   

  • VBAでアクセスのクリエの抽出条件を変更

    エクセルで、契約管理表を作っています。 仕様としては、エクセルとアクセルを使用し、 エクセルからアクセスのデータベースを操作 するようにしています。 (複数拠点で仕様する為。) アクセスでは「T_契約メイン」というテーブルと 「T_契約今月」というクエリがあって、今月分の データのみ抽出できるようになっています。 これを、エクセルのVBAのフォームでADOとSQL等を 利用してデータ取得、編集、新規契約の登録などを 行うように考えています。 ここまでの内容は無事、作成する事が出来ています。 ここからが質問なのですが、クエリ「T_契約今月」の抽出 条件をエクセルVBAから変更するにはどのようにコードを 書けばいいのでしょうか? 毎月毎月、アクセルを開いてクエリのデザインビューで 抽出条件を変更すればいいのでしょうが、あんまりスマート では無いですよね。 出来れば、エクセル側からVBAで設定変更等のフォームや ボタンを作って、処理したいのですが…。 とりあえずアクセスに繋げるところまでは分かるので、 クエリの抽出条件変更の部分のコードの記載方法を 教えて頂けないでしょうか? どうぞよろしくお願いいたします。

  • ACCESS VBA DAOからSQLに変更

    ACCESS DAOのシステムをSQL版に修正しています。 修正元でDMAX等を使っているところの修正で、カレントデータベースで ないデータベースの参照があります。どのように修正したら良いか教えて ください。 (1)Me.行 = Nz(DMax("[行]", "W_売上伝票"), 0) + 1              ↓ (2)Me.行 = Nz(DMax("[行]", "WORK..W_売上伝票"), 0) + 1  もともと、(1)をW_売上伝票(テーブル)はWORKと言うデータベースに存在 するので(2)のように修正しましたが、エラーになります。 とは言え、下のように修正するには、面倒なので(2)をどのように修正したら 良いか教えて下さい。 Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset sql = "SELECT MAX(行) as M_行 FROM WORK..W_売上伝票"" rs.Open sql, cn if not rs.EOF me.行=rs!M_行+1 end if rs.Close 宜しくお願いします

  • ACCESS2003クエリの抽出方法

    例えば、ある病院の受診者データのデータベーステーブルから、ある特定の300人の患者さんの抽出方法を教えてください。検索条件は、3つ。市町村名、被保険者番号、員番です。 抽出条件は、クエリで出すと最大9人分しかできません。何か具体的なやり方、VBA等がありましたら教えてください。 例えば、こんなことも可能なのでしょうか? 上記、300人分の検索条件テーブルを作成しておいて、そのテーブルの項目と、合致するデータを取り出して、テーブルに結果を表示させる。  とか? 以上2点、具体的に教えてください。お願いします。

  • ACCESSの複数抽出方法を教えてください!

    いつもお世話になっております。 あるテーブルに対して、フォームを作成しまし、県名(txtbox_県名1)で絞込み抽出を行いたいと思い、以下のVBAで抽出はOKでした。 Me.Filter = "[県名] Like '*" & txtbox_県名1 & "*'" しかし、県名に対して1つの条件の場合うまくいくのですが、2つの条件の場合、どうやるのかが分かりません。(同じ県名に対して、2つの条件) 教えてください。よろしくお願いします。

  • 抽出条件に応じてテーブルを作り分ける方法

    抽出条件テーブル(a)があり、抽出条件が参照するテーブル(b)がある。(a)には複数の抽出条件が登録され、(a)を参照しつつ、(b)から抽出されるテーブル(c)を抽出条件に応じて複数作成したい。つまり、(a)に登録された抽出条件の数だけテーブル(c)が作成される。 これをクエリで実行できる方法をご教示願いたい。 なお、(b)からデータを抽出する場合、上記の抽出条件テーブル(a)に代えて、クエリ内に抽出条件を20~30個記述する方法でも可。 Access2010を使用しています。VBAは使用しません。

専門家に質問してみよう