OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • すぐに回答を!
  • 質問No.158729
  • 閲覧数183
  • ありがとう数1
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 32% (51/157)

こんにちは

Access2000VBA初心者です。
現在開いているデーターベースで、フォーム上から抽出条件を入力してそれをSQLに渡し、定義させているテーブルから抽出して新しいテーブルを作成する記述がわかりません。
DAOでできそうなのですが、VBA教本を読んでいるとDebug.printで抽出結果を表示して終わっているのでそれ以上のことが書いてありません。

やりたいことは、SQLでテーブルから必要な条件をセットしてそれをrecordsetにいれるのだと思いますが、
そのrecordsetをなんとか新しいテーブルに作成して入れることはできないのでしょうか。

AccessVBAに明るい方よろしくお願いいたします。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル13

ベストアンサー率 46% (643/1383)

補足拝見しました。

やりたいことは、「テーブル作成クエリ」を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の終了を示すためのマークなのです。
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル13

ベストアンサー率 46% (643/1383)

つまり、入力フォームを作成して、それを参照して、SQLを組み立て、 set RS = currentdb.OpenRecordset(SQL) などとして、レコードセットを作成するところまでは出来ている、と解釈してもよろしいですか? で、それを新規テーブルにコピーするのですが、 現在、 SELECT ○○ FROM △△ WHERE □□; ってなSQLが出来ていると思います。 ...続きを読む
つまり、入力フォームを作成して、それを参照して、SQLを組み立て、
set RS = currentdb.OpenRecordset(SQL)
などとして、レコードセットを作成するところまでは出来ている、と解釈してもよろしいですか?

で、それを新規テーブルにコピーするのですが、

現在、
SELECT ○○
FROM △△
WHERE □□;
ってなSQLが出来ていると思います。

これに少し加工をしまして、
SELECT ○○ INTO 新規テーブル名
FROM △△
WHERE □□;

ってなSQLを作成してください。

んで、

Currentdb.Execute SQL
などとして、このSQL を実行してください。

尚、既に同名のテーブルがある場合は、そのテーブルを一旦削除した後、新たにテーブルが作成されます。

これで分かりますでしょうか?
も少し具体的な回答も書きたかったのですが、どういう風にSQLを組み立ててらっしゃるのかがちと不明でしたので…

より詳しい回答をご所望でしたら、SQLを組み立てている部分のコードを、補足にでも書いていただければ幸いです。
補足コメント
hooma

お礼率 32% (51/157)

こんにちは

アドバイス感謝いたします。。

やりたいことは下記のような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"));"

などのように" "でくくってあげればよろしいでしょうか。
またセミコロンをどこでつければいいのかはっきり理解していないレベルなものでして。
いろいろご面倒おかけしますが、よろしくお願いいたします。
投稿日時 - 2001-10-28 22:33:19
  • 回答No.3
レベル13

ベストアンサー率 46% (643/1383)

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

Currentdb.Execute SQL
となっている行を全て、
Currentdb.Execute 変数

と置き換えてお読みください。

でわでわ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ