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

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

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

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

Access

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

2066閲覧

access vba でのSQL文について

uokaokabebe

総合スコア1

VBA

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

Access

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/12/07 14:09

前提・実現したいこと

現在access vbaでsql文の勉強を教科書に沿って行っております。
その中で3点わからない記述があります。
⓵3行目は
"WHERE fld_販売ID = '" & Me.txb_販売ID.Value & "';"
だと認識しているのですが抽出条件でデータ型が一致しませんと出てしまいます。


4行目以降が分かりません。
字下げ部分を除いたら
「" & "#" & Me.txb_販売日.Value & "#」
「" & "'" & Me.cmb_社員ID.Value & "'」
ということですか?最初の&はどこから出てきたのか分かりません。#の意味は分かっています。
日付型のデータをくくっていると理解しています。


6行目から分かりません。
何冊か教科書の問題などを解いたのですが「"」「'」でくくる意味が根本的にわかっていないように思うのですが何から手を付けていいかわかりません。
大変抽象的で申し訳ございませんがご教授のほどよろしくお願いいたします。

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

エラーメッセージ

該当のソースコード

ソースコード ⓵ strSQL = _ 1 "SELECT fld_詳細ID, fld_商品ID, fld_売価, fld_数量 " & _ 2 "FROM T_販売データ詳細 " & _ 3 "WHERE fld_販売ID = " & Me.txb_販売ID.Value & ";" '子レコードのSELECT文 ⓶ 1 Dim strSQL As String 2 strSQL = _ 3 "INSERT INTO T_販売データ (fld_販売日, fld_社員ID) " & _ 4 "VALUES(" & _ 5 "#" & Me.txb_販売日.Value & "#, " & _ 6 "'" & Me.cmb_社員ID.Value & "');" ⓷ 1 Dim i As Long 2 For i = 1 To 10 'コントロールの数だけ繰り返す 3 If Not IsNull(Me("cmb_商品ID" & i).Value) Then 'cmb_商品IDが空じゃなかったら 4 strSQL = _ 5 "INSERT INTO T_販売データ詳細 (fld_販売ID, fld_商品ID, fld_売価, fld_数量) " & _ 6 "VALUES(" & _ 7 Me.txb_販売ID.Value & ", " & _ 8 "'" & Me("cmb_商品ID" & i).Value & "', " & _ 9 Me("txb_売価" & i).Value & ", " & _ 10 Me("txb_数量" & i).Value & ");" '子レコードのINSERT文を作成 11 sqlList.Add strSQL 'コレクションへ追加 12 End If 13 Next i

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

cx20

2021/12/07 15:38

SQL 文がどのように組み立てられているのか、イミディエイト ウィンドウに出力して確認してみて下さい。 strSQL に SQL 文を代入した後に、 Debug.Print strSQL を実行することで、SQL 文の中身が確認できるかと思います。
uokaokabebe

2021/12/09 03:51 編集

cx20様へ ご回答ありがとうございます。 またお返事が遅くなって申し訳ありません。 イミディエイトウィンドウを確認すると INSERT INTO T_販売データ (fld_販売日, fld_社員ID) VALUES(#2021/12/04#, 'E002'); INSERT INTO T_販売データ詳細 (fld_販売ID, fld_商品ID, fld_売価, fld_数量) VALUES(301, 'BK03-01', 120, 1); と教科書で見たようなきれいな形が表現されました。 まだ完全には理解できてないのですが自身の記述がどのように出力されているのかが分かりました。 ありがとうございました。
guest

回答2

0

Access SQL: 基本的な概念、用語、および構文

AccessでのSQL文法はよそ(MySQLとかPostgreSQLとか)とかなり変わってくるため、
一般的なSQLの本があまり当てにならない印象があります。

文字列リテラルを与えるときは、('ではなくVBと同様に)「"」で括ること。
数字リテラルを与えるときは、当然くくりません。
テーブル名やカラム名を与えるときは、「[]」で括ること。

踏まえると、

strSQL = _ "SELECT [fld_詳細ID], [fld_商品ID], [fld_売価], [fld_数量] " & _ "FROM [T_販売データ詳細] " & _ "WHERE [fld_販売ID] = " & Me.txb_販売ID.Value & ";" '子レコードのSELECT文
strSQL = _ "INSERT INTO [T_販売データ] ([fld_販売日], [fld_社員ID]) " & _ "VALUES (" & _ "#" & Format(CDate(Me.txb_販売日.Value), "yyyy-mm-dd") & "#, " & _ """" & Me.cmb_社員ID.Value & """);"

みたいな感じでしょうかね。
ナントカIDの類が文字列として扱うのか数値として扱うのか次第だと思われます。

cx20さんの指摘にもあるように、Debug.Print文で生成したSQL文字列をチェックすると良いです。
実行直前にブレークポイントを設定するのを忘れずに。

投稿2021/12/08 00:27

編集2021/12/08 00:29
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hatena19

2021/12/08 00:53

Access SQL で、文字列リテラルは「"」でも「'」でも、どちらで括ってもOKです。 VBAコード内で、SQLコードを記述するときは、「'」で括った方が読みやすいコードになると思います(好みもあると思いますが)。
hatena19

2021/12/08 00:58

テーブル名やカラム名に、空白や記号や予約語が含まれている場合は「[]」で括る必要がありますが、そうでないないら括る必要はないですね。括っておいても問題ないので、常に括っておくというスタイルもありですが。 オブジェクト名に空白、記号、予約語を含まないようにした方がいいとも思います。
退会済みユーザー

退会済みユーザー

2021/12/08 04:30

触ったAccessのバージョンが古いもので学んだので、その経験を元に無難な書き方を示しました。 空白、記号、予約語を含まない命名ができるに越したことはありません。[]を足すのも面倒でしょうし。
uokaokabebe

2021/12/09 04:01

php-gres様へ ご回答ありがとうございます。 またお返事が遅くなって申し訳ありません。 >>文字列リテラルを与えるときは、('ではなくVBと同様に)「"」で括ること。 数字リテラルを与えるときは、当然くくりません。 完全に理解の外でした。その点についてまったく目が行っておらずなぜ同じコントロールなのに「"」、「'」の数が違うの混乱しておりました。 ご指摘の通り「" & Me.txb_販売ID.Value & "」の販売IDは数値型で、「""" & Me.cmb_社員ID.Value & """」の社員IDは短いテキスト型でした。 販売IDはSQL文に則ってコントロール、変数は「"」または「'」の外に出して&で結合している。 社員IDはVBAで記述されているから「""」で「"」扱いということですね。つまり「" "& 文字列& " "」ということだと認識しております。 私の説明は下手なので伝わりますでしょうか。 申し訳ございません。 ご回答ありがとうございました。
uokaokabebe

2021/12/09 04:06 編集

hatena19様へ ご回答ありがとうございます。 またお返事が遅くなって申し訳ありません。 >>テーブル名やカラム名に、空白や記号や予約語が含まれている場合は「[]」で括る必要がありますが、そうでないないら括る必要はないですね。括っておいても問題ないので、常に括っておくというスタイルもありですが。 >>オブジェクト名に空白、記号、予約語を含まないようにした方がいいとも思います。 空白や記号、予約語については考えがありませんでした。 今後自分で名前を付けるときに大変役立つ知識をありがとうございました。 記憶して今後に役立てさせていただきます。 ご回答ありがとうございました。
guest

0

ベストアンサー

⓵3行目は

"WHERE fld_販売ID = '" & Me.txb_販売ID.Value & "';"
だと認識しているのですが抽出条件でデータ型が一致しませんと出てしまいます。

fld_販売ID のデータ型がテキスト型ならそれでいいです。数値型なら、

"WHERE fld_販売ID = " & Me.txb_販売ID.Value & ";"

コードブロック内のコードはこれになってますね。

4行目以降が分かりません。

3行目以降を改行せずに1行にすると、下記になります。

"VALUES(" & "#" & Me.txb_販売日.Value & "#, " & "'" & Me.cmb_社員ID.Value & "');"

& で文字列を連結しています。
どの部分が分からないのでしょうか。

6行目から分かりません。
何冊か教科書の問題などを解いたのですが「"」「'」でくくる意味が根本的にわかっていないように思うのですが何から手を付けていいかわかりません。

まず、VBAコードとSQLコードは別物ということを意識しましょう。

VBAコードでは、文字列は " で囲みます。
SQLコードでは、文字列は"'のどちらで囲んでもOKです。
(SQLコードは、クエリのSQLビューやフォーム、レポートのレコードソースなどに記述するときに使います。)

VBAはSQLコードを解釈できません。VBA上ではSQLコードは文字列として扱います。

あとは、下記で詳細に解説してますので、参照ください。

Access上のコード内で引用符(")と単引用符(')の使い分けについて - hatena chips

投稿2021/12/08 00:19

hatena19

総合スコア33795

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

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

uokaokabebe

2021/12/09 04:21

hatena19様 たくさんのご回答ありがとうございます。 またお返事が遅くなって申し訳ありません。 参考URL非常に助かりました。VBA内で「""」が「"」の扱いとするなどのルールに対して私は無頓着でした。ありがとうございます。 ご回答をいただいておいて恐縮ではございますが新たに一つご教授のほどよろしくお願いいたします。 >>3行目以降を改行せずに1行にすると、下記になります。 >>"VALUES(" & "#" & Me.txb_販売日.Value & "#, " & "'" & Me.cmb_社員ID.Value & "');" こちらで一部理解が出来ていないところがございます。 「VALUES(」以降で最初に「"&"」が出てくる意味が分かっておりません。 「Me.txb_販売日.Value」は日付型の値なので「#」でくくり外に出したコントロールを「&」で連結するのは理解できました。 また「 Me.cmb_社員ID.Value 」は短いテキスト型なので上記同様「'」でくくり外に出したコントロールを「&」で連結するのは理解できました。 しかしなぜVALUESの()の中で連結を行っているのでしょうか? 教科書では「INSERT INTO T_販売データ詳細 (fld_販売ID, fld_商品ID, fld_売価, fld_数量) VALUES(301, 'BK03-01', 120, 1);」のような形で記載することとありました。 「"&"」は何に連結しているのでしょうか?何の意味を果たしているのでしょうか? 大変お手数でございますがご教授のほどよろしくお願いいたします。 また他のご回答ありがとうございました。
hatena19

2021/12/09 05:28

"VALUES(" & "#" & Me.txb_販売日.Value & "#, " & "'" & Me.cmb_社員ID.Value & "');" "VALUES(" と "#" と txb_販売日の値 と "#, " と "'" と cmb_社員ID の値 と "');" を結合するという意味になります。 1行で記述するなら、下記でもいいのですが、改行するために、分割して & で結合しているのだと思います。 "VALUES(#" & Me.txb_販売日.Value & "#, '" & Me.cmb_社員ID.Value & "');" このぐらいなら、上記のように1行で記述した方か読みやすいと個人的には思います。このへんは好みでしょうね。
uokaokabebe

2021/12/09 09:47

hatena19様 度々のご回答ありがとうございます。 >>1行で記述するなら、下記でもいいのですが、改行するために、分割して & で結合しているのだと思います。 >>"VALUES(#" & Me.txb_販売日.Value & "#, '" & Me.cmb_社員ID.Value & "');" こちらいただいたコメントとURLの記載のおかげで理解をすることが出来ました。 ありがとうございます。 また確認ですが、 私の中で「"」や「'」はペアとして使うと認識があります。 >>"VALUES(" と "#" と txb_販売日の値 と "#, " と "'" と cmb_社員ID の値 と "');" を結合するという意味になります。 こちらの文章は ⓵"VALUES(" ⓶ "#" (「#」をくくっている) ⓷txb_販売日の値 ④"#, " ⑤"'"(「'」をくくっている) ⑥cmb_社員ID の値 ⑦ "');" このように分解されて 「&」で結合されているという認識なのでしょうか? イメージとしては⓵+⓶+⓷+④+⑤+⑥+⑦のような感じでしょうか? 理解力が低く申し訳ございません。 何卒ご教授のほどよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問