プロが教える店舗&オフィスのセキュリティ対策術

Access2016 のVBAについて教えてください。
例えば以下のようなテーブルがあるとします

Tテーブル(各フィールドは全てテキスト型)
│ 伝票 │  日付  │ 商品 │ 備考 │
  D001  2017/06/15  商品A  備考A
  D002  2017/07/02  商品B  備考B
  D003  2017/05/30  商品C  備考C
  D004  2017/07/19  商品D  備考D
  D005  2017/07/10  商品E  備考E

Tテーブルの日付フィールドから年月を取り出して(例 D002 ならば ”201707”)、
年月が201707のレコードを抽出するようなSQL構文を記述してみました。
-------------------
mySQL = "SELECT 伝票, 日付, 商品, (Left(日付,4) & Mid(日付,6,2)) AS 年月 FROM Tテーブル "
mySQL = mySQL & "WHERE 年月='201707';"

Set DB = CurrentDb
Set RS = DB.OpenRecordset(mySQL, dbOpenSnapshot)

RS.MoveFirst
Do Until RS.EOF
Debug.Print RS!伝票 & " " & RS!日付 & " " & RS!商品 & " " & RS!年月
RS.MoveNext
Loop
-----------------

ここで1行目のSQL構文までではうまくレコードセットができたのですが、
2行目の WHERE ~ を追記すると以下のエラーとなってしまいます。

実行時エラー ’3061’
パラメーターが少なすぎます。1を指定してください

このエラーを無くすためには、どのようにすればよいのでしょうか?
よろしくお願いいたします。

A 回答 (3件)

WHERE句では列別名が使用できません。

決まり事です。
シコシコ書いてください。
    • good
    • 2
この回答へのお礼

ありがとうございました。
WHERE句に、そのような決まりがあったのですね!
「年月」は抽出のために作っていたので、ならばと思いSQL文を
mySQL = "SELECT 伝票, 日付, 商品 FROM Tテーブル "
mySQL = mySQL & "WHERE (Left(日付,4) & Mid(日付,6,2))='201707';"
に変えても無事に抽出することが出来ました。

お礼日時:2017/07/28 19:57

WHERE 年月='201707';



WHERE Left(日付,4) & Mid(日付,6,2) = '201707';

にして見てはどうでしょうか
    • good
    • 0
この回答へのお礼

ありがとうございました。
ご指摘のように修正したら思った通りに抽出ができました!

お礼日時:2017/07/28 19:53

変数MySQLの内容をダンプする(標準出力する)命令を追加して実行してみましょう。


そこに表示されるのが実行されているSQL文です。それを見れば「パラメーターが少なすぎます」の意味がわかるかと思います。
追加部分にスペースなどちゃんと入っていますか?

参考まで。
    • good
    • 0
この回答へのお礼

ありがとうございました。
mySQLの中身は SELECT 伝票, 日付, 商品, (Left(日付,4) & Mid(日付,6,2)) AS 年月 FROM Tテーブル WHERE 年月='201707';
だったので、WHERE句 の「年月」に原因が有ったようです。

お礼日時:2017/07/28 19:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A