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

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

ただいまの
回答率

90.48%

  • VBA

    1859questions

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

  • Access

    456questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,399

nekomura

score 124

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

下記コードで、更新クエリ(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文をかいているのですが…。
任意のテーブルにアクションクエリの結果データを出すにはどのようにすればよいでしょうか。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

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

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


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

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

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

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

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

ご確認ください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/18 15:23 編集

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

    重ね重ねのお伺いで申し訳ないのですが、今一度ご教示を頂ければ幸いです。

    キャンセル

  • 2016/05/18 16:28

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

    キャンセル

  • 2016/05/18 16:49

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

    キャンセル

  • 2016/05/18 16:57

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

    この点も、ご教示いただけると幸いです。
    低次元な質問ばかりですがどうぞよろしくお願いいたします。

    キャンセル

  • 2016/05/18 17:19

    クエリテーブルのデータを元に戻したり、結果テーブルのデータを消したりしながらテストを繰り返されていると思いますので、単純に結果テーブル削除漏れなども考えられますが(^-^;

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

    キャンセル

  • 2016/05/18 17:27

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

    いつも解決に導いてくださり感謝です!
    先ほど頂きましたサンプルコードで、無事解決いたしました。

    キャンセル

+1

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

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

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

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/18 14:45

    ttyp03様
    いつもありがとうございます!ご回答に感謝いたします。

    >シンプルに書けるところは利用した方が間違いを発見しやすいですよ。
    accessで作ったアクションクエリのSQLビューに自動生成されているSQLをそのままコピペしています…自動生成でなく、accessのクエリは自分でもきちんと理解しなければいけませんね。
    この文では、確かにご指摘の通り間違いがあっても我ながらわかりづらいです。

    >アクションクエリテーブルの抽出条件に、結果=Trueというのがありますが、
    毎度ながら説明不足ですみません。
    データ元のアクションクエリテーブルの結果フィールドが、Yes/No型になっており、データシートビューではチェックボックスになっており、チェックを入れた部分がTrueとなります。

    >いつも的外れな回答をしてしまうので控えようと思っていたのですが…。
    とんでもないです。
    いつもとても勉強になっていて本当に助かっています。

    キャンセル

  • 2016/05/18 14:53

    >accessで作ったアクションクエリのSQLビューに自動生成されているSQLをそのままコピペしています
    なるほど。

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

    キャンセル

  • 2016/05/18 17:28

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

    キャンセル

  • 2016/05/18 18:05

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

    キャンセル

関連した質問

同じタグがついた質問を見る

  • VBA

    1859questions

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

  • Access

    456questions

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