質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

20255閲覧

Access vba アクションクエリの結果をテーブルに出したい

nekomura

総合スコア132

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2016/05/18 04:42

よろしくお願いいたします。

下記コードで、更新クエリ(upSQL)→追加クエリ(addSQL)→削除クエリ(delSQL)を順に実行しています。
それぞれの○○SQLは変数で、以下のSQL文を代入しています。

upSQL = UPDATE アクションクエリテーブル SET アクションクエリテーブル.売上 = アクションクエリテーブル.[売上]*2 addSQL = INSERT INTO アクションクエリ結果テーブル ( 番号, 名前, 売上 ) SELECT アクションクエリテーブル.番号, アクションクエリテーブル.名前, アクションクエリテーブル.売上 FROM アクションクエリテーブル WHERE (((アクションクエリテーブル.結果)=True))" delSQL = DELETE DISTINCTROW アクションクエリテーブル.結果 FROM アクションクエリテーブル WHERE (((アクションクエリテーブル.結果)=True))

コードは以下です。

Private Sub 更新追加削除_Click() DoCmd.RunSQL upSQL MsgBox "hoge" DoCmd.RunSQL addSQL MsgBox "hogehoge" DoCmd.RunSQL delSQL MsgBox "hogehogehoge" DoCmd.OpenTable "アクションクエリ結果テーブル", , acAdd End Sub

この中の追加クエリ(addSQL)の結果を、「アクションクエリ結果テーブル」と名づけた
テーブルに出力させたいのですが、実行後の当該テーブルは空のままです。
ちなみにエラーもありません。

追加クエリ(addSQL)のSQLは、テーブルに出力するINSERT文をかいているのですが…。
任意のテーブルにアクションクエリの結果データを出すにはどのようにすればよいでしょうか。

有職者の皆様方、お知恵をお貸しください。
コーディングの仕方のサンプルもお教え頂ければ勉強になり幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まず変数にSQL文を代入する時点で""で囲まれていないという指摘があるのですが、これはコピペ誤りと信じて話を進めます。

実行後の当該テーブルは空のまま

とのことですが、
①コード内で更新・追加・削除後に結果テーブルを表示しているけど結果データが表示されない
②言葉の通り、処理実行後に自分で結果テーブルを開いて中を確認してもINSERTされたはずのデータがINSERTされていない
のいずれかでしょうか?

まず①の場合ですが、これは単純にコードの問題で、

'DoCmd.OpenTable "アクションクエリ結果テーブル", , acAdd DoCmd.OpenTable "アクションクエリ結果テーブル", , acEdit

とすることで結果表示されるものと思います。
(おそらくこちらの問題ではないかと推測します)

次に②の場合ですが、
実際、こちらで類似のテーブルを使って似たようなSQLを順に動作させましたが、INSERTも正しく行われました。

となるとコードの問題ではなく、SQLまたはデータの問題が考えられます。

とりあえずINSERTの対象となる抽出文
SELECT アクションクエリテーブル.番号, アクションクエリテーブル.名前, アクションクエリテーブル.売上 FROM アクションクエリテーブル WHERE (((アクションクエリテーブル.結果)=True))
を単独で実行してみて、対象データが取得できるか確認してみてください。

これで正しくデータ取得できているようであれば、(権限の問題で)INSERTに失敗しているか、または処理後に(提示されたコード外で)ロールバックされている等が考えられます。

ご確認ください。

投稿2016/05/18 05:50

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekomura

2016/05/18 07:36 編集

jawa様 ご回答ありがとうございます。 ご教示の通り、 ---DoCmd.OpenTable "アクションクエリ結果テーブル", , acAdd--- のacAdd部分をacEditへ変更いたしましたところ、内容が結果テーブルに出力されました。 ただ、結果テーブルに追加する内容として、更新クエリ(upSQL)で売上を二倍にするSQL文を書いているのですが、 ---アクションクエリテーブル.[売上]*2--- なぜか売上価格ではなく、売上フィールドの数が二倍となって出力されてしまいました。 そこで、括弧を消して下記の様に試したところ、 ---アクションクエリテーブル.売上*2--- 再び結果テーブルには何も出なくなってしまいました。 重ね重ねのお伺いで申し訳ないのですが、今一度ご教示を頂ければ幸いです。
kaz.Suenaga

2016/05/18 07:28

横槍ですが「売上価格」ってどこから出てきました? というのが回答への道っぽいですね。
nekomura

2016/05/18 07:49

Suenaga様 いつもお世話になっております。 「売上価格」というフィールドは存在せず、「売上」フィールドに格納されている値が売上の価格(数値型)になっています。 更新クエリによって売上フィールドの中の値を二倍にして(100円なら倍の200円)にして、追加クエリによってその結果を”アクションクエリ結果テーブル”に出したいのですが、売上フィールドのレコード数自体が二倍(100レコード→200レコード)となって出力されてしまいました…。
nekomura

2016/05/18 07:57

jawa様 Suenaga様 連投失礼いたします。 もう一度同じコード(jawa様のご回答①)を実行したところ、期待通りの実行結果となりました。 ???? フィールド数が2倍になり、今はならないのは謎のままですが、 Accessの学習教材で、「再クエリ」というものがあったのを思い出しました。 フォームなどを毎回消していないと更新が適用されない…といった内容です。 今回のような処理の場合は、再クエリのロジックを入れたほうが良いということになりますか? その際は、Me.Requery と書けばよいのでしょうか…。 記述場所はDoCmd.OpenTableの前…?になるのでしょうか。 この点も、ご教示いただけると幸いです。 低次元な質問ばかりですがどうぞよろしくお願いいたします。
jawa

2016/05/18 08:19

クエリテーブルのデータを元に戻したり、結果テーブルのデータを消したりしながらテストを繰り返されていると思いますので、単純に結果テーブル削除漏れなども考えられますが(^-^; 結果テーブルがAccess上で既に開かれている状態でDoCmd.ShowTableすると変な表示になったりしますので、これも可能性として考えられます。 これを回避するには、nekomuraさんのおっしゃる通りDoCmd.Requeryで更新してあげればいいと思います。 ShowTableした直後なら結果テーブルがアクティブになっていると思いますので、 ``` DoCmd.OpenTable "アクションクエリ結果テーブル", , acEdit DoCmd.Requery ``` で更新後の状態が表示されると思います。
nekomura

2016/05/18 08:27

jawa様 なるほど…。 ロジックが出来次第、Accessファイルをアクションクエリ実行用にコピーして 作業していますが、途中から焦りのせいか >クエリテーブルのデータを元に戻したり、結果テーブルのデータを消したりしながらテストを繰り返されていると思いますので、単純に結果テーブル削除漏れなども考えられますが(^-^; ↑と、なっていたのでしょうね。 いつも解決に導いてくださり感謝です! 先ほど頂きましたサンプルコードで、無事解決いたしました。
guest

0

こんにちは。
いつも的外れな回答をしてしまうので控えようと思っていたのですが…。

addSQLでは、アクションクエリテーブルからアクションクエリ結果テーブルにINSERTしてますよね。
そのアクションクエリテーブルの抽出条件に、結果=Trueというのがありますが、結果カラムをTrueにするのはこの一連の処理とは別で、あらかじめ設定されているということでよろしいでしょうか?
いずれにしても、まずはaddSQL内のSELECTがきちんと抽出できていることを確認したほうが良いかと思います。

余談ですが、クエリ内で扱うテーブルがひとつであるなら、各カラムの前にテーブル名を書く必要はありません。

SQL

1UPDATE アクションクエリテーブル SET 売上=売上*2 2INSERT INTO アクションクエリ結果テーブル ( 番号, 名前, 売上 ) SELECT 番号, 名前, 売上 FROM アクションクエリテーブル WHERE 結果=True 3DELETE DISTINCTROW 結果 FROM アクションクエリテーブル WHERE 結果=True

シンプルに書けるところは利用した方が間違いを発見しやすいですよ。

投稿2016/05/18 05:34

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekomura

2016/05/18 05:45

ttyp03様 いつもありがとうございます!ご回答に感謝いたします。 >シンプルに書けるところは利用した方が間違いを発見しやすいですよ。 accessで作ったアクションクエリのSQLビューに自動生成されているSQLをそのままコピペしています…自動生成でなく、accessのクエリは自分でもきちんと理解しなければいけませんね。 この文では、確かにご指摘の通り間違いがあっても我ながらわかりづらいです。 >アクションクエリテーブルの抽出条件に、結果=Trueというのがありますが、 毎度ながら説明不足ですみません。 データ元のアクションクエリテーブルの結果フィールドが、Yes/No型になっており、データシートビューではチェックボックスになっており、チェックを入れた部分がTrueとなります。 >いつも的外れな回答をしてしまうので控えようと思っていたのですが…。 とんでもないです。 いつもとても勉強になっていて本当に助かっています。
ttyp03

2016/05/18 05:53

>accessで作ったアクションクエリのSQLビューに自動生成されているSQLをそのままコピペしています なるほど。 >データシートビューではチェックボックスになっており~ では事前にTrue/Falseの設定がされているということで、addSQL内のSELECT文が機能しているか確認した方がよいでしょう。 もちろんTrueが設定されているレコードがあるのは必須です。 ここの部分↓ SELECT アクションクエリテーブル.番号, アクションクエリテーブル.名前, アクションクエリテーブル.売上 FROM アクションクエリテーブル WHERE (((アクションクエリテーブル.結果)=True))
nekomura

2016/05/18 08:28

ttyp03 様 一旦、本件解決いたしました。 いつもありがとうございます! どうぞまたご教示のほどお願いいたします。
ttyp03

2016/05/18 09:05

またお役に立てませんでしたが、解決されたようでよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問