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

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

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

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

Access

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

Q&A

解決済

1回答

1545閲覧

【MSACCESS】SQLで作成したクエリが実行できない

teddy1121

総合スコア44

VBA

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

Access

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

0グッド

0クリップ

投稿2023/04/04 06:19

編集2023/04/05 06:30

実現したいこと

SQLでクエリを作成したい。

前提

よろしくお願いします。
MSACCESSで開発しています。
VBAのSQLでクエリを作成したのですが、開こうとすると「クエリを実行できませんでした」となり実行できません。
調べても「クエリを実行できませんでした」というエラーの解説が見つからなかったため質問させて頂きます。

発生している問題・エラーメッセージ

「クエリを実行できませんでした」

該当のソースコード

VBA

1Eclass = rs!英語クラス←(30) 2Eage = rs!学年ID←("33") 3eQueryName = "英語欠席者" 4EmySQL = "SELECT 欠席用生徒情報.顧客ID, 欠席用生徒情報.学年ID, 欠席用生徒情報.英語クラス, 欠席用生徒情報.日付 FROM 欠席用生徒情報 LEFT JOIN 英語 ON (欠席用生徒情報.日付 = 英語.日付) AND (欠席用生徒情報.顧客ID = 英語.顧客ID) WHERE (((欠席用生徒情報.学年ID)='" & Eage & "') AND ((英語.顧客ID) Is Null))AND (欠席用生徒情報.英語クラス)=" & Eclass & "" 5db.CreateQueryDef eQueryName, EmySQL

試したこと

該当のクエリをSQLビューで開き、コピーしてそのまま貼り付け(上書き状態)をすると動くようになります。
もちろん、新規にクエリをSQLビューで開いてペーストしても動きます。
db.CreateQueryDef eQueryName, EmySQLの部分を
CurrentDb.CreateQueryDef(eQueryName, SQL)などに変更してもクエリはできますが同じく開けません。

###該当のテーブルとクエリ
イメージ説明
イメージ説明
イメージ説明
イメージ説明
こちらがイメージとなります。
アドバイスを頂けたら幸いです。
よろしくお願い致します。

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

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

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

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

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

sazi

2023/04/04 10:40

> VBAのSQLでクエリを作成したのですが、開こうとすると「クエリを実行できませんでした」 それはクエリーの定義の話では無く、そのクエリーを実行している部分でのエラーでは無いですか? そもそも作成しているクエリーは選択クエリーですから、「クエリを実行できませんでした」となるのは、クエリーを実行する命令で記述しているのではないですか? エラーとなるコードの部分も質問に追記した方がいいでしょう。
logres_Fan

2023/04/04 10:44

> db.CreateQueryDef eQueryName, EmySQLの部分を この場合、変数を定義した上で、変数=上記コードは試しましたか? > CurrentDb.CreateQueryDef(eQueryName, SQL) この場合、CurrentDb.CreateQueryDef(eQueryName, SQL).OpenRecordsetに、上記コードを書き換えるとどうなりますか?続けてエラーの場合、変数を定義した上で代入するとどうなるでしょうか。
teddy1121

2023/04/05 01:18

saziさん、logres_Fanさんご回答ありがとうございます。 返信が遅くなり申し訳ありません。 logres_Fanさんに教えて頂いたように書き換えましたがダメでした。 Dim qrDef As QueryDef EmySQL="SELECT~~~(記載と同じ) Set qrDef = db.CreateQueryDef(eQueryName, EmySQL) ※書き方が違ったら教えて頂けたら幸いです。 このコードに変更しても「クエリを実行できませんでした」となります。 saziさんのご指摘ですが、私の説明不足で申し訳ありません。 クエリはコードでの実行ではなく、できたクエリをダブルクリックで開いた場合のものです。 logres_Fanさんに教えて頂いたOpenRecordsetでコードから開こうとしても実行できません。 大きな勘違いがあったら申し訳ありませんが引き続きお願い致します。
sazi

2023/04/05 02:54

作成しているクエリー中で参照しているテーブルの状況などが分かりませんのでなんとも言えませんが、CreateQueryDef()を繰り返している事で破損しているのかもしれません。 ※CreateQueryDef()を繰り返すなら事前に削除を行うべきなので。 「新しいファイルを作成して、すべてのオブジェクトをインポート」を試してみて下さい。 https://hamachan.info/win7/access/error.html
teddy1121

2023/04/05 04:05

saziさん、何度もご回答ありがとうございます! 指示して頂いたデータベースの作り直しですが、やってみてもやはり同じように開けませんでした。 ただ、SQLを以下のコードに変更した場合は開けました。 EmySQL = "SELECT 欠席用生徒情報.顧客ID, '英語' AS 科目, 欠席用生徒情報.日付, 欠席用生徒情報.学年ID, 欠席用生徒情報.英語クラス, 英語.顧客ID AS 欠席ID FROM 欠席用生徒情報 LEFT JOIN 英語 ON 欠席用生徒情報.顧客ID = 英語.顧客ID WHERE 欠席用生徒情報.学年ID='" & Eage & "' AND 欠席用生徒情報.英語クラス=" & Eclass & ";" どうやら日付のLeftJoinが悪さをしているようなのですが、これがないと正しく抽出できないためこのリンクは使えるようにしたいです。 お時間を取らせて恐縮ですが何卒よろしくお願い致します!
sazi

2023/04/05 05:30

現状の情報のみでは再現性がないので、クエリーで参照しているテーブルの定義とそのテーブルのサンプルデータを質問に追記されて下さい。
teddy1121

2023/04/05 05:45

saziさん、情報不足で申し訳ありません。 イメージを追加させて頂きました。 よろしくお願い致します。
sazi

2023/04/05 06:38 編集

「クエリを実行できませんでした」のキャプチャーも追加できますか?
teddy1121

2023/04/05 06:30

追加致しました。 よろしくお願い致します。
sazi

2023/04/05 06:50 編集

VBAで同じようにしてクエリー定義を作成してみましたがエラーにはなりません。 本当にそのサンプルデータで発生していますか? > 日付のLeftJoinが悪さをしているよう こういった場合はデータ起因によるものと思われるので
teddy1121

2023/04/05 07:02

すみません、元の「欠席用生徒情報」がクエリで複雑だったので中身をテーブルに移して提示しました。(フィールドは同じです) 確かにテーブルを元に動かすと動きました。 ちょっと気づいたのですが、元の「欠席用生徒情報」で日付を振るときに「日付: Format(Now(),"yyyymmdd")としているのですが、もしかしてこれが原因という可能性はありますか? 日付形式で取得したものを"yyyymmdd"で表す必要があったためformat関数を使用しました。 いかがでしょうか?
sazi

2023/04/05 07:12

>「欠席用生徒情報」がクエリで複雑 複雑なクエリーの場合、意図した動作にならないケースがあります。 例えば、「今回の日付で結合する部分を実行する際に、結合する項目の編集が完了していない」などです。 回避方法は実際に経験されているように、ネストしている部分を中間テーブルに結果を出力し、そのテーブルを元にしたクエリーに変更する事です。
teddy1121

2023/04/05 07:29

テーブル作成クエリを作り、そのテーブルを使ったところ実行できました! あまり複雑にするとダメなんですね。 動作も遅くなるしできるだけシンプルにしていきたいと思います。 本当に助かりました! 長々とありがとうございました! ※コメント欄でお答え頂いていたのでベストアンサーがつけられないのですが良かったら回答欄にコメントをお願いします!
sazi

2023/04/05 08:20

実際に対応された内容を回答として記述して「自己解決」として下さい。
sazi

2023/04/05 09:07

補足ですが、テーブル作成クエリの実行は、runsqlなどのコマンド系ではなく、executeメソッドとした方が安全です。 excuteメソッドは必ず実行が完了してから、次の処理が実行されますが、コマンド系は完了を待たずに次の処理が実行されますので。
teddy1121

2023/04/06 00:47

追加のアドバイスありがとうございます。 excuteメソッド使ってみます!
guest

回答1

0

自己解決

欠席用生徒情報がクエリを元にしており、そのクエリが複雑だったことから日付でのリンクでエラーが発生していた模様。
元となるクエリをテーブル作成クエリで欠席用生徒情報としてテーブル化し、そのテーブルでSQLを動かしたら正常に動きました。
saziさん、ありがとうございました!

投稿2023/04/06 00:47

teddy1121

総合スコア44

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

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

sazi

2023/04/06 00:53

#質問のコメント欄の抜粋をコメントしておきます。 複雑なクエリーの場合、意図した動作にならないケースがあります。 例えば、「今回の日付で結合する部分を実行する際に、結合する項目の編集が完了していない」などです。 回避方法は、ネストしている部分等を中間テーブルに結果を出力し、そのテーブルを元にしたクエリーに変更する事です。 尚、テーブル作成クエリの実行は、runsqlなどのコマンド系ではなく、executeメソッドとした方が安全です。 excuteメソッドは必ず実行が完了してから、次の処理が実行されますが、コマンド系は完了を待たずに次の処理が実行されますので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問