Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


795 / 2272 ツリー ←次へ | 前へ→

【10067】WHERE条件式での日付 あおぎん 07/12/6(木) 13:04 質問[未読]
【10069】Re:WHERE条件式での日付 VBWASURETA 07/12/6(木) 13:57 発言[未読]
【10070】Re:WHERE条件式での日付 あおぎん 07/12/6(木) 15:13 質問[未読]
【10075】Re:WHERE条件式での日付 VBWASURETA 07/12/6(木) 16:11 発言[未読]
【10077】Re:WHERE条件式での日付 あおぎん 07/12/6(木) 17:16 質問[未読]
【10079】Re:WHERE条件式での日付 VBWASURETA 07/12/6(木) 17:46 回答[未読]
【10078】Re:WHERE条件式での日付 あおぎん 07/12/6(木) 17:22 質問[未読]
【10080】Re:WHERE条件式での日付 VBWASURETA 07/12/6(木) 17:57 回答[未読]
【10081】Re:WHERE条件式での日付 小僧 07/12/6(木) 18:39 回答[未読]
【10082】Re:WHERE条件式での日付 VBWASURETA 07/12/6(木) 18:53 発言[未読]
【10090】Re:WHERE条件式での日付 あおぎん 07/12/7(金) 11:11 質問[未読]
【10091】Re:WHERE条件式での日付 小僧 07/12/7(金) 13:19 回答[未読]
【10092】Re:WHERE条件式での日付 VBWASURETA 07/12/7(金) 14:14 発言[未読]
【10094】Re:WHERE条件式での日付 あおぎん 07/12/7(金) 15:38 お礼[未読]
【10097】Re:WHERE条件式での日付 VBWASURETA 07/12/7(金) 18:27 質問[未読]
【10093】Re:WHERE条件式での日付 あおぎん 07/12/7(金) 15:19 お礼[未読]
【10088】Re:WHERE条件式での日付 あおぎん 07/12/7(金) 10:41 質問[未読]

【10067】WHERE条件式での日付
質問  あおぎん  - 07/12/6(木) 13:04 -

引用なし
パスワード
   いつもお世話になってます。

UQ_コメント印刷用を元に、F_コメント印刷 上で条件をつけた Q_コメント印刷用をレポートソースにR_結果通知を印刷しようとしています。
そのため以下のように記述しているのですが、
エラー「実行時エラー’3061’ パラメータが少なすぎます。」が出ます。
このエラーは 検索条件・・日付を書き加えたら出るようになりました。
検索条件・・日付の記述方法がおかしいのだと思いますが、修正方法がよくわかりません。

constr = " WHERE UQ_コメント印刷用.受診日 between #" & Forms!F_コメント印刷!受診日& "# And #" & Forms!F_コメント印刷!受診日至 & "# "
日付を##で囲んだりしたんですが、別のエラーが出ました。

解決方法をどなたかご教示をよろしくお願いします。


Private Sub cmd_印刷_Click()
  Dim db As Database
  Dim qdf As QueryDef
  Dim rst As Recordset
  Dim str As String, constr As String
  
  str = "SELECT UQ_コメント印刷用.* FROM UQ_コメント印刷用"
  constr = ""
  
   '検索条件・・・判定番号
  If IsNull(Me.フレーム6) Then
    constr = ""
  Else
   Select Case フレーム6
   Case 1
    constr = " WHERE UQ_コメント印刷用.判定番号 > 3"
   Case 2
    constr = " WHERE UQ_コメント印刷用.判定番号 < 4"
   End Select
  End If
  '検索条件・・・社員コード
  If constr = "" And Not IsNull(Me.社員コード) Then
    constr = " WHERE (UQ_コメント印刷用.社員コード = " & Me.社員コード & ")"
  ElseIf Not IsNull(Me.社員コード) Then
    constr = constr & " AND (UQ_コメント印刷用.社員コード = " & Me.社員コード & ")"
  End If
  '検索条件・・・カナ氏名
  If constr = "" And Not IsNull(Me.カナ氏名) Then
    constr = " WHERE (UQ_コメント印刷用.カナ氏名 Like '*" & Me.カナ氏名 & "*')"
  ElseIf Not IsNull(Me.カナ氏名) Then
    constr = constr & " AND (UQ_コメント印刷用.カナ氏名 Like '*" & Me.カナ氏名 & "*')"
  End If
  
   '検索条件・・・日付
  If constr = "" Then
    constr = " WHERE UQ_コメント印刷用.受診日 between Forms!F_コメント印刷!受診日 and Forms!F_コメント印刷!受診日至"
  Else
    constr = constr & " AND WHERE UQ_コメント印刷用.受診日 between Forms!F_コメント印刷!受診日 and Forms!F_コメント印刷!受診日至"
  End If
 
  
  'クエリの作成
  str = str & constr & ";"
  Set db = CurrentDb()
  Set qdf = db.QueryDefs("Q_コメント印刷用")
  qdf.SQL = str
  qdf.Close
  Set rst = db.OpenRecordset("Q_コメント印刷用")
  If rst.RecordCount = 0 Then
    MsgBox "対象者がいません。", vbOKOnly, "データなし"
    rst.Close
    db.Close
  Else
    rst.Close
    db.Close
    DoCmd.OpenReport "R_結果通知", acViewPreview
  End If
End Sub

(WIN ACCESS ともに2000)

【10069】Re:WHERE条件式での日付
発言  VBWASURETA  - 07/12/6(木) 13:57 -

引用なし
パスワード
   ▼あおぎん さん:
こんにちは。

クエリーのパラメータ確認は一度クエリーに直接SQLを書いて実行すると
わかり易いですよ。

合っていればパラメータ入力待ち画面が表示されます。
(該当フォームを開いていない状態で開く場合)

エラーの場合は的確なエラー指摘が表示されたと思います。

【10070】Re:WHERE条件式での日付
質問  あおぎん  - 07/12/6(木) 15:13 -

引用なし
パスワード
   ▼VBWASURETA さん:


>▼あおぎん さん:
>こんにちは。
>
>クエリーのパラメータ確認は一度クエリーに直接SQLを書いて実行すると
>わかり易いですよ。
>
>合っていればパラメータ入力待ち画面が表示されます。
>(該当フォームを開いていない状態で開く場合)
>
>エラーの場合は的確なエラー指摘が表示されたと思います。

こんにちは。
お返事ありがとうございます。
クエリーに書いて実行してみました。

SELECT UQ_コメント印刷用.* FROM UQ_コメント印刷用
WHERE UQ_コメント印刷用.受診日 between Forms!F_コメント印刷!受診日 And Forms!F_コメント印刷!受診日至;

と日付条件だけ入れてみたんですけど、問題なく実行されました。

どうしてうまくいかないんでしょう・・?

【10075】Re:WHERE条件式での日付
発言  VBWASURETA  - 07/12/6(木) 16:11 -

引用なし
パスワード
   ▼あおぎん さん:
こんにちは。

それではですね。

>  'クエリの作成
>  str = str & constr & ";"

この部分でブレークを貼ってstrに代入されているSQLの文字列でクエリー実行を
試して貰っても宜しいでしょうか?

恐らくそれで問題となっている点が見える気がします。

【10077】Re:WHERE条件式での日付
質問  あおぎん  - 07/12/6(木) 17:16 -

引用なし
パスワード
   ▼VBWASURETA さん:
>▼あおぎん さん:
>
>>  'クエリの作成
>>  str = str & constr & ";"
>
>この部分でブレークを貼ってstrに代入されているSQLの文字列でクエリー実行を
>試して貰っても宜しいでしょうか?
>
>恐らくそれで問題となっている点が見える気がします。


こんにちは。
お返事ありがとうございます、

恥ずかしながらブレークを貼ってクエリー実行がよくわからないのですが、、、

わからないなりにやってみましたので、間違ってたらご指摘ください。(多分間違いだと思いますが・・)

ブレークを貼るというのは
デバッグ(D)のブレークポイントの設定というのでいいのでしょうか?
とりあえず指定の行にブレークポイントを設定し、フォーム上から実行してみました。
で、
ブレークポイントのところで止まったので、継続を実行してみました。
すると
やはり同じエラーが出ました。
パラメータが少ないとのことです。

>strに代入されているSQLの文字列でクエリー実行を
>試して貰っても宜しいでしょうか?

↑ここのところもよくわからないので、お手数ですが教えていただけませんか?

どうぞよろしくお願いします。

【10078】Re:WHERE条件式での日付
質問  あおぎん  - 07/12/6(木) 17:22 -

引用なし
パスワード
   ▼VBWASURETA さん:

それと、
検索条件を

'検索条件・・・日付
  If constr = "" Then
    constr = " WHERE UQ_コメント印刷用.受診日 between Forms!F_コメント印刷!受診日 and Forms!F_コメント印刷!受診日至"
  Else
    constr = constr & " AND WHERE UQ_コメント印刷用.受診日 between Forms!F_コメント印刷!受診日 and Forms!F_コメント印刷!受診日至"
  End If

から
'検索条件・・・日付
  If constr = "" Then
    constr = " WHERE UQ_コメント印刷用.受診日 between Forms!F_コメント印刷!受診日 and Forms!F_コメント印刷!受診日至"
  Else
    constr = constr & " AND UQ_コメント印刷用.受診日 between Forms!F_コメント印刷!受診日 and Forms!F_コメント印刷!受診日至"
  End If

に書き換えました。

WHERE はいらないですよね?


 

【10079】Re:WHERE条件式での日付
回答  VBWASURETA  - 07/12/6(木) 17:46 -

引用なし
パスワード
   ▼あおぎん さん:
こんにちは。

>恥ずかしながらブレークを貼ってクエリー実行がよくわからないのですが、、、
ブレークというのはデバックで合ってます。
止めたい箇所でF9キーを押すことでブレークを貼れたと思います。

>>strに代入されているSQLの文字列でクエリー実行を
>>試して貰っても宜しいでしょうか?

これですが、モジュール画面にイミディエイトウィンドウというウィンドウを
表示することができます。確かツールバーの表示辺りにあったと思います。
表示できましたら、以下の内容を入力してエンターキーをその続きで押すと
現在変数に入っている内容の文字列が下に表示されます。
その表示された文字列をクエリーに貼り付けて確認してみてください。

?str[ここでエンターキーを押す]

【10080】Re:WHERE条件式での日付
回答  VBWASURETA  - 07/12/6(木) 17:57 -

引用なし
パスワード
   ▼あおぎん さん:
こんにちは。

先ほど回答しましたがstr変数(実行手前)の中身をイミディエイトで
見てもらうとわかり易いと思います。

【10081】Re:WHERE条件式での日付
回答  小僧  - 07/12/6(木) 18:39 -

引用なし
パスワード
   ▼あおぎん さん、VBWASURETA さん:
こんにちは。

> エラー「実行時エラー’3061’ パラメータが少なすぎます。」が出ます。

パラメータクエリを Recordset オブジェクトに入れるためには
パラメータを指定してあげないと上記のようなエラーがでます。


Q_コメント印刷用 のクエリがこのプロシジャ以外から呼ばれる場合は

  'クエリの作成
  str = str & constr & ";"
  Set db = CurrentDb()
  Set qdf = db.QueryDefs("Q_コメント印刷用")
  qdf.SQL = str
  qdf.Parameters(0) = Forms!F_コメント印刷!受診日
  qdf.Parameters(1) = Forms!F_コメント印刷!受診日至
  
  Set rst = qdf.OpenRecordset 'qdfからレコードセットを生成
  qdf.Close          '上記理由により、Closeする場所の変更
  rst.MoveLast  '←追加
  If rst.RecordCount = 0 Then
  …

のようにしてQueryDefオブジェクトから
レコードセットを生成する事になります。


Q_コメント印刷用 のクエリが他では使用されない場合には
パラメータ値を直接SQL内に記述すれば該当のエラーは出ない筈です。


  constr = " WHERE UQ_コメント印刷用.受診日 between " _
        & "#" & Forms!F_コメント印刷!受診日 & "# AND " _
        & "#" & Forms!F_コメント印刷!受診日至 & "#"

【10082】Re:WHERE条件式での日付
発言  VBWASURETA  - 07/12/6(木) 18:53 -

引用なし
パスワード
   >▼あおぎん さん、小僧 さん:
こんにちは。

パラメータについては、確かに小僧さん指摘されました
通りでいけるような気がします。

以下の内容については既に確認されているようです。
エラー詳細は不明ですが。

>Q_コメント印刷用 のクエリが他では使用されない場合には
>パラメータ値を直接SQL内に記述すれば該当のエラーは出ない筈です。
>
>
>  constr = " WHERE UQ_コメント印刷用.受診日 between " _
>        & "#" & Forms!F_コメント印刷!受診日 & "# AND " _
>        & "#" & Forms!F_コメント印刷!受診日至 & "#"

【10088】Re:WHERE条件式での日付
質問  あおぎん  - 07/12/7(金) 10:41 -

引用なし
パスワード
   ▼VBWASURETA さん:
>▼あおぎん さん:
>こんにちは。
>
>先ほど回答しましたがstr変数(実行手前)の中身をイミディエイトで
>見てもらうとわかり易いと思います。

おはようございます。
ご丁寧にありがとうございます。

イミディエイトで見るということがやっとわかったので、
(理解できてないのかもしれませんが)
さっそくやってみました。

str = str & constr & ";"

この行にブレークを貼ると
?strエンターで結果を見ると
SELECT UQ_コメント印刷用.* FROM UQ_コメント印刷用
しか出ないので

その下の行にブレークを貼って実行してみました(これでいいのでしょうか?)。

フォームでいろいろ条件指定して、イミディエイトウインドウに出た以下の4つのクエリを実行してみたのですが、どれも大丈夫でした。
デバッグを閉じてクエリーをデータ表示させると指定したとおりのデータが取得できました。

SELECT UQ_コメント印刷用.* FROM UQ_コメント印刷用 WHERE UQ_コメント印刷用.判定番号 < 4 AND (UQ_コメント印刷用.カナ氏名 Like '*スエ*') AND UQ_コメント印刷用.受診日 between Forms!F_コメント印刷!受診日 and Forms!F_コメント印刷!受診日至;

SELECT UQ_コメント印刷用.* FROM UQ_コメント印刷用 WHERE UQ_コメント印刷用.判定番号 < 4 AND (UQ_コメント印刷用.社員コード = 517) AND UQ_コメント印刷用.受診日 between Forms!F_コメント印刷!受診日 and Forms!F_コメント印刷!受診日至;

SELECT UQ_コメント印刷用.* FROM UQ_コメント印刷用 WHERE UQ_コメント印刷用.判定番号 < 4 AND UQ_コメント印刷用.受診日 between Forms!F_コメント印刷!受診日 and Forms!F_コメント印刷!受診日至;


SELECT UQ_コメント印刷用.* FROM UQ_コメント印刷用 WHERE UQ_コメント印刷用.受診日 between Forms!F_コメント印刷!受診日 and Forms!F_コメント印刷!受診日至;

やり方が間違ってたり、お気づきの点などありましたら、またご指摘ください。
よろしくお願いします。

【10090】Re:WHERE条件式での日付
質問  あおぎん  - 07/12/7(金) 11:11 -

引用なし
パスワード
   ▼小僧 さん:


>
>Q_コメント印刷用 のクエリが他では使用されない場合には
>パラメータ値を直接SQL内に記述すれば該当のエラーは出ない筈です。
>
>
>  constr = " WHERE UQ_コメント印刷用.受診日 between " _
>        & "#" & Forms!F_コメント印刷!受診日 & "# AND " _
>        & "#" & Forms!F_コメント印刷!受診日至 & "#"


おはようございます。
たびたびお世話をおかけします。


他では使用予定がないので、直接記述すればいいのですよね?

投稿前に日付を ##でくくるというのをこちらの記事(番号は忘れました)から見つけたので、そこで記述してあったようにくくってみたのですがエラーになりました。

constr = " WHERE UQ_コメント印刷用.受診日 between #" & Forms!F_コメント印刷!受診日& "# And #" & Forms!F_コメント印刷!受診日至 & "# "

で、今小僧さんのと比較すると微妙に違います。

結果的にはどちらも
between #Forms!F_コメント印刷!受診日# AND # Forms!F_コメント印刷!受診日至#

になると思うのですが、"の数や位置で、結果に違いがありますか??
それとも半角スペースのとり方とかが問題なのでしょうか??
初歩的な質問で申し訳ありません。


日付の指定の仕方以外はコードがおかしいわけではないのですよね??
小僧さんのをコピーして実行してみようと思います。

【10091】Re:WHERE条件式での日付
回答  小僧  - 07/12/7(金) 13:19 -

引用なし
パスワード
   ▼あおぎん さん:

こんにちは。

>constr = " WHERE UQ_コメント印刷用.受診日 between #" & Forms!F_コメント印刷!受診日& "# And #" & Forms!F_コメント印刷!受診日至 & "# "

> "の数や位置で、結果に違いがありますか??
> それとも半角スペースのとり方とかが問題なのでしょうか??

上記はVBEの画面からコピーされてますでしょうか。
そのままですと、

受診日& "#

の箇所で半角スペースがなくてエラーになりますね。


当方が提示した文は、こちらの掲示板の幅を考えて
改行コードを入れただけですので、
基本的には1行で書いてしまっても結果は変わりません。

その際に
・全角スペースはだめ
・余計な半角スペースはいくらあっても影響しない
・「Where」「Between」等の語句の前後には必ず半角スペース

ができていれば、問題ないはずです。


VBWASURETA さんがご提示されているデバッグの方法にて
SQL文の内容が間違っていないか確認されてみると良いと思います。


> str = str & constr & ";"
>
> この行にブレークを貼ると
> ?strエンターで結果を見ると

str = str & constr & ";"
Debug.Print str

ど記述すると、イミディエトウィンドウに
str の内容が表示されますよ^^

【10092】Re:WHERE条件式での日付
発言  VBWASURETA  - 07/12/7(金) 14:14 -

引用なし
パスワード
   ▼小僧 さん、あおぎん さん:
こんにちは。

この問題はイミディエトウィンドウに表示することで
問題箇所が理解しやすいと思います。
因みにイミディエトウィンドウは色々活用できますので
デバックするのには最適です^^

2つの例:
<イミディエトウィンドウ>
↓計算式
?3+1[エンターキー]
4[結果]

↓関数単体実行(関数名と引数)
?Test(1)[エンターキー]
関数の戻り値

【10093】Re:WHERE条件式での日付
お礼  あおぎん  - 07/12/7(金) 15:19 -

引用なし
パスワード
   ▼小僧 さん:

小僧さんのをコピペしたらうまくいきました!


>受診日& "#
>
>の箇所で半角スペースがなくてエラーになりますね。

半角スペースがなかったのですね・・。
一言一句間違えないように確認した(つもりだった)のですが、それに気づいていたら投稿しなくてもすんだのですね。
いつもそそっかしくてお手を煩わせてすみません。


>その際に
>・全角スペースはだめ
>・余計な半角スペースはいくらあっても影響しない
>・「Where」「Between」等の語句の前後には必ず半角スペース
>
>ができていれば、問題ないはずです。

以後気をつけて記述するようにします!

>str = str & constr & ";"
>Debug.Print str
>
>ど記述すると、イミディエトウィンドウに
>str の内容が表示されますよ^^

記述してみました。
表示されました!
こんな便利なものがあったとは・・。

解説本をさらっと読んだだけではわからないことだらけです^^;。
理解力が鈍いだけかもですが。

いろいろありがとうございました。

【10094】Re:WHERE条件式での日付
お礼  あおぎん  - 07/12/7(金) 15:38 -

引用なし
パスワード
   ▼VBWASURETA さん:

こんにちは。

別記事に書いてますが、#を使ってコードを書いた際にスペースの記述ミスでうまくいかなかったみたいです。

たいへんお手を煩わせました。
今回イミディエイトウィンドウ等いろいろ教えていただきありがとうございました。
記述ミスの発見に役立ちそうで、そそっかしい私には最適のようです。
ありがとうございました。


>この問題はイミディエトウィンドウに表示することで
>問題箇所が理解しやすいと思います。
>因みにイミディエトウィンドウは色々活用できますので
>デバックするのには最適です^^
>
>2つの例:
><イミディエトウィンドウ>
>↓計算式
>?3+1[エンターキー]
>4[結果]
>
>↓関数単体実行(関数名と引数)
>?Test(1)[エンターキー]
>関数の戻り値

【10097】Re:WHERE条件式での日付
質問  VBWASURETA  - 07/12/7(金) 18:27 -

引用なし
パスワード
   ▼あおぎん さん:

こんばんは。

モジュールを見ていて疑問に思ってしまったんですが・・・

>constr = " WHERE UQ_コメント印刷用.受診日 between #" & Forms!F_コメント印刷!受診日& "# And #" & Forms!F_コメント印刷!受診日至 & "# "

の「 & Forms!F_コメント印刷!受診日& 」ですが、
このSQL書いた後(この行からカーソル移動した後)警告が出なかったでしょうか?
もしくは自動修正された気がします。

文字列同士を連結する際に&で繋げなければコンパイルで警告が
表示された覚えがあります。もしかすると別の言語かも知れません^^;

795 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078201
(SS)C-BOARD v3.8 is Free