Microsoft Access 掲示板

非連結のテキストボックスデータを連結したい / 9

10 コメント
views
4 フォロー
9
hiroton 2020/09/17 (木) 15:37:19 58418@f966d

知識が幅広く必要なためか、あまりうまいこと解説しているところはないですね。

VBAとSQL

VBAはプログラミング言語です。
SQLは構造化照会言語(データベースを扱うための所定の書式)です。

VBAにはSQLを実行する機能がありますが、実行そのものはデータベースエンジンに丸投げします。なので、「SQL構文を文字列で指示する」までがVBAで出来ることです。そして、この文字列がSQLの文法として正しいかどうかすらチェックしません。ダメだったらダメだったときにエラーだと返ってくるだけです

SQL構文の例

UPDATE T名簿 SET 小遣い = 小遣い + 1000 WHERE 氏 & ' ' & 名 = '鈴木 イチロー' AND 契約年 >= #2000/1/1#;

VBAでSQLを実行する例

CurrentDb.Execute "UPDATE T名簿 SET 小遣い = 小遣い + 1000 WHERE 氏 & ' ' & 名 = '鈴木 イチロー' AND 契約年 >= #2000/1/1#;"

入力ミスをしてみましょう
VBAでSQLを実行する例(入力ミス)

CurrentDb.Execute "UPDATE T名簿 SET 小遣い = 小遣い + 1000 WHERE 氏 & ' ' & 名 = 鈴木 イチロー' AND 契約年 >= #2000/1/1#;"

実行しようとするSQL構文

UPDATE T名簿 SET 小遣い = 小遣い + 1000 WHERE 氏 & ' ' & 名 = 鈴木 イチロー' AND 契約年 >= #2000/1/1#;

単独の文字列としか見ないVBAではわかりにくいですが、SQL構文を色を付けてくれるエディタでみると間違っていることが分かりやすいですね。

実際には様々な部分を変数にしたいとなると思うので、ワンステップ置いて内容を確認するようにするといいです

Dim strSQL As String

strSQL = "UPDATE T名簿 SET 小遣い = 小遣い + " & Me!小遣い増減 & " WHERE 氏 & ' ' & 名 = '" & Me!氏名 & "' AND 契約年 >= #" & Me!適用日 & "#"
Debug.Print strSQL '//SQL構文確認用
CurrentDb.Execute strSQL

&もあちこちに出ていますが、VBAでもSQLでも前後の文字列を連結するという役割をします。SQL構文を作るためのVBAの&なのか、SQLとして処理されるときの&(VBA上ではただの文字)なのか、これもコードの色分けがあるとわかりやすいと思います。

もちろん、SQLで処理するときでもただの文字として見たいということもあり得ます。

'//VBA
strWhere = "社名='P&G'"
--SQL
WHERE 社名='P&G'

#'

リテラルのデータ型を表す文字です。
リテラルとはコード内に直打ちされた値のことです。

Dim a
a = 9 / 3
'// a は変数
'// = / は演算子
'// 9 3 はリテラル

VBAではリテラルのデータ型によって
数値型 => 数値をそのまま
文字型 => 「"」で囲む ※「'」は使えない
日付型 => 「#」で囲む

(ACCESS)SQLではリテラルのデータ型によって
数値型 => 数値をそのまま
文字型 => 「"」または「'」で囲む
日付型 => 「#」で囲む

というように決まっています。

そしてこの(ACCESS)SQLでの「#」はかなりローカルな仕様です。
SQLとは単にそういった場合、本来、国際規格で決まっているモノで、それには日付型に「#」を使うルールはありません。そのため、SQLを勉強しようとしてもこの「#」についての解説はACCESSに言及しているようなところでしか見ることができません。

SQL構文を確認する

VBAならDebug.Printで実行直前の文字列を取得できます。フォームのテキストボックスなんかの場合はとりあえず「="購入日=#" & [最新購入日] & "#"」のように確認したい部分だけの式にするといいでしょう

後はそれで表示された文字列をコピーして色分け表示すればいいです。
この掲示板ならコードブロックを使うと色分け表示できます。(上の誤りなSQLの表示を見ると今一歩な感じ)
Webサービスを探してもいいでしょう(SQL Fiddle(sqlfiddle.com)とか)
※ローカルルールな「#」にどのように対応しているのかは気に掛ける必要があります

そもそものもとになるSQL構文はクエリデザインから作成するのも手です。
適当な抽出条件を設定したクエリを作って、表示できることを確認したあとSQLビューを確認すればもとになるSQLが作れます。あとは「適当な抽出条件」としたところを変数に置き換えていけば動的に変化するSQL文が作れます。
デザインビューからの表示を通すことによって、データ型による囲み文字の補完、型不一致のエラーのチェックなんかができます

通報 ...