StrSQL =
'" SELECT TOP 1 基4, 変位4, №" &
'" FROM T_01地耐力" &
'" WHERE T01地耐力.№ Between 1 And 9" &
'" ORDER BY T_01_地耐力.変位4 DESC , T_01_地耐力.№ DESC;"
上記のクエリで表示された値と一致する、更新クエリを作成したいです。通常クエリですと、上記の選択クエリを名前を付けて保存し、一致するフィールドを[No.]をつなぎますよね。SQLではどのように表現するのですか?
やりたいことは、一致した[No.]のレコードの[基4]フィールドに”※”マークを付けたいです。お願いいたします
提示のコードは構文エラーで実行できないものですが、実際のものは、前回の質問で正しいものに修正はできているということでよろしいですか。
更新クエリ一発でやりたいということですか。
VBAでSQLを記述しているということは、VBAを使ってもいいということですか。
説明不足ですみません。更新クエリ一発で解決できてしまうのでしたら、ぜひともお願いいたします。本当にやりたいことはVBAで基4, 変位4, の「4」を変数にして、for next 1~4 で実行したいのです。通常のクエリ処理しか行ったことがないので、選択クエリを作成し、その結果で更新クエリを実行する。という流れしか知らなかったです。変数に置き換える前に、固定の名前ままでSQLを見たほうが理解できると思いまして、今回と前回に質問を分けました。お願いいたします
更新したいテーブルは、T_01地耐力 ですか。
T_01地耐力 を特定の抽出条件で抽出して指定のフィールドで並べ替えて、先頭のレコードの[基4]フィールドを更新したいということですか。
だとしたら、VBAを使うなら、更新クエリではなく、VBAで更新した方が簡単そうです。
とりあえず考え方だけのコード例。
ありがとうございます。VBAで直接更新ができるのですね。勉強不足ですみません。
では変数にしたいのなら以下のように変更すれば良いのでしょうか?
for A1=1 to 4
StrSQL1 =
" SELECT TOP 1 基" & A1 & ", 変位" & A1 & ", №" &
" FROM T_01地耐力" &
" WHERE T01地耐力.№ Between 1 And 9" &
" ORDER BY T_01_地耐力.変位" & A1 & "DESC , T_01_地耐力.№ DESC;"
Set rs = CurrentDB.OpenRecordSet(StrSQL)
rs.Edit
rs!"[基" & A1 &"] = '※'"
rs.UpDa[te
rs.Close
next
考え方はそれであってますが、そのコードではコンパイルエラーで実行できませんね。
前回の質問の内容を理解して書き直す必要があります。
あと、フィールドを文字列で参照する場合は、下記のような感じでFieldsプロパティを使います。
上のコードを実行してみたのですが
rs. "[基" & A1 & "]='※'"
のところで 構文エラー になってしまいました。 お願いいたします
すみません。各構文に &_ に追加してコピーして、こちらに張り付けたのですが消えてしまっているようです。
実際のVBAには付いています。理解できているでしょうか?
フィールドを文字列で参照する方法、ありがとうございました。早速変更いたしました。
今度は Set rs = CurrentDb.OpenRecordset(StrSQL) のところで
実行時エラー3061 パラメータが少なすぎます。1をしてください になってしまいました。お願いたします
そうでしたか。
この掲示板はマークダウン記法が使えますので、コードを掲載する場合、コードブロック内に記述すると、いいでしょう。
下記で使い方はを解説してますので、ご参考に。
StrSQLのSQL文が間違っているということですね。そのSQL文をクエリにデザインビューに貼り付けて開くことができるか確認してみてください。
何度も申し訳ありません
記載方法のご説明、ありがとうございました。今度はちゃんと見えていますでしょうか?
クエリのデザインビューに変数に置き換える前の以下の分を張り付け、& _ と " を外して実行させてみました。
クエリの画面では、表示されました。もう一度VBAに戻って & _ と " を付け実行すると
今度は実行時エラー3075「WHERE № Between 1 And 9 ORDER BY T_01_地耐力.変位4 DESC , T_01_地耐力.№ DESC」
演算子がありません になってしまいました。
お願いいたします
前回の質問でも同じ補足をしましたが、VBAの文字列では改行をそのまま入力することはできません
「
_
」はVBAコードとしての改行を無視するのみですは、単に
として実行されます。この結果生成される文字列は
SELECT TOP 1 基4, 変位4, №FROM T_01_地耐力
となります。これでは、「
SELECT
句で№FROM
フィールドを指定」という記述になってしまいますねこの直後ですでに構文エラーとなるような気もしますが、エラーメッセージがそのように出力されるのはよくわかりません
hirotonが提示したちょっと楽をする記述をするなら次の通りです
StrSQL =
" SELECT TOP 1 基4, 変位4, №" &
" FROM T_01地耐力" &
" WHERE (T_01地耐力.№ Between 1 And 9)" &
" ORDER BY T_01_地耐力.変位4 DESC , T_01_地耐力.№ DESC"
実際のSQL構文部分の各行で先頭に半角スペースを追加する形で記述します
SQL構文は「改行」と「半角スペース」が同じ役割をするので、VBAでは直接入力できない改行の代わりに半角スペースを使います。さらに、改行を行の最後に入力するかわりに、行の先頭で記述します
こうすることにより、
面倒な改行の入力が半角スペース1つで済む
インデントがそろって見やすい
行末(文字列の最後)という気づきにくいところでの記述漏れを防げる
というメリットがあります
既にhirotonさんの回答で解決できると思いますが、
VBAで生成したSQL文の確認方法をアドバイスしておきます。
下記のようにデバッグ用コードを挿入します。
これを実行するとイミディエイトウィンドウに、StrSQLに格納されている文字列が出力されますので、
それをコピーしてクエリのSQLビューに貼り付けます。
そしてこのクエリを開くことができれば、正しいSQL文が生成できているということです。
上記の場合だと、開くことができないはずです。
SQL文をよく見れば、区切りが適切にできていないのが分かります。
hirotonさんの回答のコードなら問題なく実行できるでしょう。
動作確認後はデバッグ用コードは不要なので削除しておいてください。
お返事が遅くなり申し訳ありません。もう一度教えていただいた文章を読み直し、デバッグ用コードも使い書き直しまして無事に進めることができました。ありがとうございました。そのうえで追加質問をさせてください。
更新条件で[No]が1から9まで、[変位4]の値が一番大きいものに※マークを付けるだけではなく、でも一番大きい[変位4]の値が[No]が、9ではないものに限定したいです。通常のクエリなら2つ3つ重ねていけばできますがsqlでは、どのように追記すれば良いのでしょうか?おねがいいたします
'''" WHERE T_01地耐力.№ Between 1 And 9" &
" ORDER BY T_01_地耐力.変位" & A1 & " DESC , T_01_地耐力.№ DESC;"
'''
抽出条件が、「[No]が1から9まで」かつ「[No]が、9ではないもの」ということでしょうか。
だとしたら、「[No]が1から8まで」ということになりますが、そういうことではないのですか。
ではなくて、
「[No]が1から9まで」の範囲で[変位4]か一番大きいレコードの[No]が9の時は※マークをつけない(更新しない)ということでしょうか。
返信ありがとうございます。「[No]が1から9まで」の範囲で[変位4]か一番大きいレコードの[No]が9の時は※マークをつけない ということです。可能でしょうか?お願いいたします。
下記でどうでしょう。
そこに、IF式を入れるだけで、そんなに意味合いが変わるのですね!無事に出来上がりました。長々と本当に、本当にありがとうございました。