ACCESS初心者です。
VBAはEXCELで独学した程度の知識です。
フォームから受注納期を入力し、クエリを抽出。
クエリでレコード毎に製品票の印刷枚数を計算し
レポートで各レコード毎に求められた印刷枚数分を
印刷させたいのですが・・・
クエリを開く段階でつまずいており困っています。
Private Sub コマンド23_Click()
Dim db As DAO.database
Dim rs As DAO.Recordset
Dim qdf As DAO.QueryDef
Set db = CurrentDb()
Set qdf = db.QueryDefs("受注クエリ")
With qdf
.Parameters("納期") = Format(Forms![受注データ一覧]![納期], "yyyy/mm/dd")
Set rs = .OpenRecordset
.Close
End With
MsgBox rs![注文番号]
rs.Close
End Sub
パラメータクエリの開き方、上記コードで問題ないでしょうか?
そしてこのコードを実行した際
実行時エラー3421
データ型の変換エラーが発生しましたと表示されます。
ローカルウィンドウで 変数rs = nothingとなっており
クエリのレコードが読み込めていないようです。
(Msgbox rs!注文番号はデータが読み込めたかテストするために
コードを書いています。)
どうぞ宜しくお願いいたします。
No.8ベストアンサー
- 回答日時:
ですから、
>など設定がばらばらなのでQueryDefを使ってパラメータを
>VBAで設定するならば、他の方への補足の内容をもとにすると、
>SQL文を、
として、補足にあるパラメータの宣言、
>PARAMETERS 納期1 DateTime;
をはずしたクエリのSQL文を提案し、VBAでは、
>With qdf
>.Parameters("納期") = Format(Forms![受注データ一覧]![納期], "yyyy/mm/dd")
>Set rs = .OpenRecordset
>.Close
>End With
のところで、
With qdf
qdf.Parameters("XYZ") = CDate(Format(Forms![受注データ一覧]![納期], "@@@@/@@/@@"))
Set rs = .OpenRecordset
End With
のように、Parameters("納期") を Parameters("XYZ") のように
パラメータが「納期」というようなフィールド名と同じになるのを
避けるために「XYZ」としているのですが・・・。パラメータと
フィールド名を同じにするとエラーが出るのでこのようにしています。
補足にある、
>フォームからyyyy/mm/ddの書式で日付を指定し該当する
>レコードをクエリで抽出します。
ということは、フォームではテキストボックスの書式が
日付型に設定してあると、いうことだと解釈します。したがって、
VBAでは、
.Parameters("XYZ") = Forms![受注データ抽出]![date1]
とします。
>上記記述で
>実行時エラー3061
>パラメーターが少なすぎます。2を指定してください。
>エラーが発生します。
これは、補足にある書き変えたVBAの中で、
>With qdf
>.Parameters("納期1") = Forms![受注データ抽出]![date1]
>Set rs = db.OpenRecordset("確定クエリ", dbOpenDynaset)
>End With
のところで、
db.OpenRecordset
としているために、「確定クエリ」をパラメータを指定せずに
レコードセットとして接続しようとしているためにエラーが
エラーがでるのです。したがって、ここのところは、もともとの
設定のようにQueryDefを使って、
With qdf
.Parameters([XYZ]) = Forms![受注データ抽出]![date1]
Set rs = .OpenRecordset("確定クエリ")
End With
とします。ようするに、
Set rs = qdf.OpenRecordset("確定クエリ")
ということです。
以上より、クエリの「納期1」の抽出条件に「[XYZ]」 (XYZではなく、[XYZ]です)と記入し、
そのクエリのSQL文は、
SELECT 確定.注文番号, 確定.注文年月日, 確定.発注者品名コード, 確定.[品名(品名仕様)], 確定.[注文数量(受注数量)], 社内データ.SNP, 確定.単位, 確定.納期1, 確定.納入No1, 確定.納品キー番号1, 確定.受渡場所名, 確定.発注者用備考, 確定.発注者名, Int([納入指示数量1]/[SNP]+0.5) AS 印刷枚数
FROM 確定 LEFT JOIN 社内データ ON 確定.発注者品名コード = 社内データ.得意先品目コード
WHERE (((確定.納期1)=[XYZ]));
VBAは、
Private Sub コマンド23_Click()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim qdf As DAO.QueryDef
Set db = CurrentDb
Set qdf = db.QueryDefs("確定クエリ")
With qdf
.Parameters("XYZ") = Forms![受注データ抽出]![date1]
Set rs = .OpenRecordset
End With
MsgBox rs![注文番号]
qdf.Close: Set qdf = Nothing
rs.Close: Set rs = Nothing
db.Close: Set db = Nothing
End Sub
ご回答ありがとうございます。
上記コードを試してみたところ無事にクエリを開くことができました。
ご回答いただいたコードを参考に
.Parameters("Forms![受注データ抽出]![date1]") = Forms![受注データ抽出]![date1]
とし、同様の結果を得ることができました。
これまでのコードミスと原因が理解できました。
当初のご回答、理解不足で誠に申し訳ありません。
またコードの掲載に際して修正により混乱を招いて
しまい申し訳ありませんでした。
ご回答いただいた他ご回答者様へもこの場をお借りして
お詫び申し上げます。
どうもありがとうございました。
No.7
- 回答日時:
#5ですが、あとからあとから訂正入るが、列名見直しした?
intの中身、納入指示数量1はドコにあるの?
テーブルの列名とデータ型も開示したほうが良くない?
この回答への補足
度々申し訳ありません。
納入指示数量1⇒注文数量(受注数量)の誤りでした。
フィールド名、データ型は下記の通りです。
確定テーブルより
注文番号 [テキスト型]
注文年月日 [日付/時刻型]
発注者品名コード [テキスト型]
品名(品名仕様) [テキスト型]
注文数量(受注数量)[数値型]
単位 [テキスト型]
納期1 [日付/時刻型]
納入No1 [テキスト型]
納品キー番号1 [テキスト型]
受渡場所名 [テキスト型]
発注者用備考 [テキスト型]
発注者名 [テキスト型]
社内データテーブルより
SNP [数値型]
得意先品目コード [テキスト型]
クエリ 計算式による新規フィールド
印刷枚数 [数値型]
No.6
- 回答日時:
No3です。
まず、前提として「納期」が日付/時刻型であるとしています。
そうでないならば、テーブルの設定を日付/時刻型にしないと、
変換する意味がありませんが。No3の型が一致しないという
エラーもひょっとして「納期」のフィールドの型が
日付/時刻型以外の型になっていませんか。
>PARAMETERS 納期1 DateTime;
とは、あるフィールドに設定した[納期1]という
抽出条件が、日付/時刻型であるということなのに、
VBAにおいては、
>.Parameters("納期") = Format(Forms![受注データ一覧]![納期],
のように[納期]というフィールド名と同じパラメータ名を
設定していたり・・・・・
など設定がばらばらなのでQueryDefを使ってパラメータを
VBAで設定するならば、他の方への補足の内容をもとにすると、
SQL文を、
SELECT
受注.注文番号, 受注.注文年月日, 受注.品名コード, 受注.[品名(仕様)], 受注.[注文数量(数量)], 参照データ.SNP, 受注.単位, 受注.納期, 受注.納品No, 受注.発注者, Int([注文数量(量)]/[SNP]+0.5)
AS 印刷枚数
FROM 受注 LEFT JOIN 参照データ ON 受注.品名コード = 参照データ.品目コード
WHERE 受注.納期=[XYZ];
として、行儀良く後始末をするためにVBAを、
Private Sub コマンド23_Click()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim qdf As DAO.QueryDef
Set db = CurrentDb
Set qdf = db.QueryDefs("受注クエリ")
With qdf
qdf.Parameters("XYZ") = CDate(Format(Forms![受注データ一覧]![納期], "@@@@/@@/@@"))
Set rs = .OpenRecordset
End With
MsgBox rs![注文番号]
qdf.Close: Set qdf = Nothing
rs.Close: Set rs = Nothing
db.Close: Set db = Nothing
End Sub
補足の中のSQL文には、「納期1」、「受注.納期1」「受注.納期」
など、意味不明のフィールド名が出てくるので、「受注」テーブル
には、「納期」というフィールドが存在していて、「納期1」という
フィールドは存在しないものとします。
なお、「受注データ一覧」というフォームの「納期」という
(たぶん)テキストボックスに入力するのは、たとえば、
「20140115」のような数値型あるいはテキスト型の
文字列という前提にしています。そのために
CDate(Format(Forms![受注データ一覧]![納期], "@@@@/@@/@@"))
のような型変換をしています。
これでエラーが出るようであれば他の問題があるのでは?
この回答への補足
申し訳ありません、得意先の名前がわかるテーブルや
フィールドがあった為SQLを手直しして掲載した為
誤ったコードになってしまいました。
改めてクエリを作成、フィールド名も確認しました。
フォームからyyyy/mm/ddの書式で日付を指定し該当する
レコードをクエリで抽出します。
フィールドの納期1については日付の書式に設定されていたので
Parameterのコードを書き換えました。
補足を誤って確定してしまいました。
下記にSQLコードとVBAコードを記載します。
PARAMETERS 納期1 DateTime;
SELECT 確定.注文番号, 確定.注文年月日, 確定.発注者品名コード, 確定.[品名(品名仕様)], 確定.[注文数量(受注数量)], 社内データ.SNP, 確定.単位, 確定.納期1, 確定.納入No1, 確定.納品キー番号1, 確定.受渡場所名, 確定.発注者用備考, 確定.発注者名, Int([納入指示数量1]/[SNP]+0.5) AS 印刷枚数
FROM 確定 LEFT JOIN 社内データ ON 確定.発注者品名コード = 社内データ.得意先品目コード
WHERE (((確定.納期1)=[Forms]![受注データ抽出]![date1]));
Private Sub コマンド23_Click()
Dim db As DAO.database
Dim rs As DAO.Recordset
Dim qdf As DAO.QueryDef
Set db = CurrentDb
Set qdf = db.QueryDefs("確定クエリ")
With qdf
.Parameters("納期1") = Forms![受注データ抽出]![date1]
Set rs = db.OpenRecordset("確定クエリ", dbOpenDynaset)
End With
MsgBox rs!注文番号
qdf.Close: Set qdf = Nothing
rs.Close: Set rs = Nothing
db.Close: Set db = Nothing
End Sub
上記記述で
実行時エラー3061
パラメーターが少なすぎます。2を指定してください。
エラーが発生します。
ただ他にパラメータを設定しているフィールドがありません。
やはり他に誤った記述があるのでしょうか・・・
No.5
- 回答日時:
VBAを介さないクエリで動かしてみるのが良さそう。
「パラメータを要求される」とは、SQL文に出てくる項目がFromで指定された
テーブル・クエリに存在しないから「どうすれば良いの?」と問われることです。
whereの左辺、なぜ項目末尾に1がある?投稿のためのコピペミスじゃ無いでしょ。
一度、すべての列名を見直しされると良いと思います。
No.4
- 回答日時:
Endwithの前行でCLOSEしちゃダメでしょ。
「受注クエリ」が2つ目のパラメータを要求してるのかな?
SQLビューで開いてコピペで開示できますか?
この回答への補足
.close 失礼しました。
新規で空のデータベースに適当なデータを入力し
(パラメータの設定は無し)
クエリをRecordsetで開いたところ問題なく開けました。
下記にSQLコードを記述します。
PARAMETERS 納期1 DateTime;
SELECT
受注.注文番号, 受注.注文年月日, 受注.品名コード, 受注.[品名(仕様)], 受注.[注文数量(数量)], 参照データ.SNP, 受注.単位, 受注.納期, 受注.納品No, 受注.発注者, Int([注文数量(量)]/[SNP]+0.5) AS 印刷枚数
FROM 受注 LEFT JOIN 参照データ ON 受注.品名コード = 参照データ.品目コード
WHERE (((受注.納期1)=[Forms]![受注データ一覧]![納期]));
やはり問題は納期のパラメータでしょうか?
フィールド印刷枚数には計算結果のデータを入れています。
テーブルは同フォルダにcsvファイルを落とし込み
リンクテーブルを作成しています。
No.2
- 回答日時:
動作確認したわけではありませんが、想像での話しです。
パラメータ「納期」は日付型フィールドでしょうか?
Format()関数の戻り値はString型ですので、その値をCdate()関数を使用して日付型に
変換してから、パラメータにセットしたらどうでしょうか?
参考URL:http://office.microsoft.com/ja-jp/access-help/HA …
この回答への補足
回答ありがとうございます。
早速CDate関数を使用してみました。
CDate(Format(Forms![受注データ一覧]![納期], "yyyy/mm/dd"))
先の質問のエラー表示ではなく
実行時エラー3061
パラメーターが少なすぎます。2を指定してください。
とのエラーメッセージ。
デバッグを開くと
Set rs = .OpenRecordset 部分がマーキングされ
rs = nothing
やはりクエリが開けていない様子でした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) ACCESS DAO で不要なテーブルのフィールド(列)の削除 4 2022/06/23 12:13
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
- Access(アクセス) アクセス レポートを開いたときにパラメーターの自動入力がしたい 4 2022/11/30 11:21
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
パラメータが少なすぎます。1を指定して下さい。""
Excel(エクセル)
-
「パラメータが少なすぎます。3を指定してください。」って???
Access(アクセス)
-
-
4
Access サブフォームでの選択行の取得
その他(データベース)
-
5
アクセスVBAのMe!と[ ]
Access(アクセス)
-
6
Access パラメータークエリ VBAの書き方について よろしくお願いします。 ①クエリでデータを
Access(アクセス)
-
7
エラー(型が一致しません。)の対処方法
Visual Basic(VBA)
-
8
Accessでレコードを別テーブルへコピーするには
Access(アクセス)
-
9
アクセスで数値型のフィールドにNullをいれたい
その他(データベース)
-
10
access vba 開いていないフォームのプロパティを編集したい
Access(アクセス)
-
11
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
12
ACCESSでVBAから選択クエリの抽出条件を指定したい
Access(アクセス)
-
13
アクセスのエラー「クエリには出力フィールドが1つ以上必要です。」
その他(Microsoft Office)
-
14
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
15
ACCSESS2013VBA フォームのレコードソースを変更する
その他(データベース)
-
16
選択したチェックボックスのみチェックを入れたいのですが
その他(データベース)
-
17
Access 最後のレコードに到達するまでループ処理を行う方法
Access(アクセス)
-
18
ACCESSでメッセージにクエリ結果を表示なんてできるの?
Access(アクセス)
-
19
AccessのDAOでフィールド名を配列に格納して・・・
Visual Basic(VBA)
-
20
アクセスのテキストボックスの初期値を空白に
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
あるフィールドの最大値を条件...
-
usingの意味がわからないのですが
-
Accessの帳票フォームで重複デ...
-
ACCESS VBA クエリを開く
-
Excel 2019 のピボットテーブル...
-
「直需」の意味を教えてください
-
Oracle 2つのDate型の値の差を...
-
エクセルVBAで5行目からオート...
-
Accessでテーブルの値をテキス...
-
ACCESSで400以上のフィールドが...
-
Accessで数値型にNULLをInsert...
-
Accessのフィールド数が255しか...
-
Access テキスト型に対する指定...
-
ORACLEでLONG項目からCHAR項目...
-
ACCESSで和暦を西暦に・・・
-
他テーブルで一致する列から名...
-
Access IF文でテーブルに存在し...
-
作番ってどういう意味でしょうか?
-
Accessでテーブル名やクエリ名...
-
アクセス エラーを数値「0」に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access2021 「ISNULL関数には引...
-
accessでの請求管理について
-
accessでのフォームの連携について
-
あるフィールドの最大値を条件...
-
accessについて
-
usingの意味がわからないのですが
-
Accessフォーム全レコードをPDF...
-
アクセスのテーブルを分ける理...
-
Accessの帳票フォームで重複デ...
-
MS ACCESS 商品価格変更時の該...
-
フィールド名が取得したい
-
曜日を表す項目
-
SQL EXISTS演算子について
-
ACCESS VBA クエリを開く
-
SQL Server 2005 Expressで営業...
-
Accessでクエリの作成、多対1対...
-
集計結果を別テーブルに更新ク...
-
受注明細テーブルについて
-
ACCESS データシートビューでの...
-
SQLコマンドのorder by句
おすすめ情報