Access2003 OutlookExpress6 

テーブル 「T_実績」 をもとに クエリ 「Q_今日の実績」 があります。
「Q_今日の実績」 は[品名] [品番] [受付日]

フォーム1 には、テキストボックス txt_受付日 と コマンドボタン1 があり
txt_受付日 に入力した日付で抽出したクエリ「Q_今日の実績」の結果を
メールの本文に記載し、送信したいです。

宛先:aaa@aaa
CC:bbb@bbb
本文:
 [受付日]の実績、更新されました。
 鉛筆  cg022-25  (改行したい)
 消しゴム  TG56
 定規  0389235
(↑品名  ↑品番  日によって件数は増減する。0件のときは送信しない)

いろいろなサイトを見て自分で作ってみましたが、抽出条件がないクエリの時しか送れず、また、クエリの結果が10件の場合は10通のメールを送信してしまいます。
よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:2009/03/04 09:37:33
  • 終了:2009/03/05 13:19:51

ベストアンサー

id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912009/03/04 17:18:14

ポイント200pt

うーん、コードを見る限りレコードが10件あったら10通というつくりにはなっていませんね。

これは、ボタンがクリックされたときに1度だけ実行するようになっているのですよね?


とりあえず、他の部分に対応しました。

・0件のときは送信しない

・本当は[受付日]を入れたい(レコードがあれば出るはず)

・改行したい

Option Compare Database

Private Sub コマンド1_Click()
    Dim DB As Database
    Dim RS As Recordset
    Dim 件名 As String
    Dim 本文 As String
    
    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("Q_今日の実績")
    
    '検索結果の確認:街頭情報がなければ終了
    If RS.RecordCount = 0 Then
        MsgBox "該当するデータがありません"
        Exit Sub
    End If
    
    '件名の作成
    件名 = "実績更新のお知らせ"
    '本文の作成
    本文 = "[" & RS!受付日 & "]の実績、更新されました。"
    Do Until RS.EOF
        '本文の作成
        本文 = 本文 & vbCrLf & RS!品名 & RS!品番
        RS.MoveNext
    Loop

    'メールの送信
    DoCmd.SendObject acSendNoObject, acSendNoObject, acFormatTXT, "aaa@aaa", , , 件名, 本文, False
    RS.Close: Set RS = Nothing
End Sub

本当にレコード数だけメールが送信されるか、もう一度確認いただけますか。

また、日付が入らない場合はクエリの中身を提示ください。

(そこに日付がなければ追加すればOKなはずです。)

id:sakanainu

Mooks様、どうもありがとうございます。レコード数だけメール送信されることなく、送ることができました。お礼が遅くなり申し訳ありません。

ただ、テキストボックス[txt受付日]に入力した日付で抽出をしたいのですが、

Set RS = DB.OpenRecordset("Q_今日の実績")

で、パラメータが少なすぎます。1を指定してください

とエラーになってしまいます。

SELECT T_実績.品名, T_実績.品番, T_実績.受付日

FROM T_実績

WHERE (((T_実績.受付日)=[forms]![フォーム1]![txt受付日]))

ORDER BY T_実績.受付日 DESC;

よろしくお願いいたします。

2009/03/05 10:48:18

その他の回答(1件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/03/04 12:52:18

ポイント35pt

コメントが無効ですので回答で失礼します(この回答に関するポイントは不要です)。

仕様の確認等コメントのほうが良いので有効にお願いできるでしょうか。


すでに、メールが送信できるようにはなっているのですから、差し支えのない範囲で

(アドレスを匿名にするなどして)コードを公開してはどうでしょうか。


おそらくコードの部分的な修正で対応できるのではないかと思います。

id:sakanainu

Mook様 ありがとうございます。Access VBA とともに 「はてな」の利用方法もあまりわかってなく、Mook様のご返答助かりました。ありがとうございます。

Private Sub コマンド1_Click()


Dim DB As Database

Dim RS As Recordset

Dim 件名 As String

Dim 本文 As String

Set DB = CurrentDb

Set RS = DB.OpenRecordset("Q_今日の実績")

Do Until RS.EOF

'件名の作成

件名 = "実績更新のお知らせ"

'本文の作成

本文 = "本日実績、更新されました。" & vbCrLf _   '本当は[受付日]を入れたい

& RS!品名 & RS!品番

RS.MoveNext

Loop

'メールの送信

DoCmd.SendObject , , acFormatTXT, "aaa@aaa", , , 件名, _

本文, False

RS.Close: Set RS = Nothing

End Sub

上記はテキストボックスに日付を入れて抽出することがわからなかったので、その部分はできていません。よろしくお願いいたします。

2009/03/04 13:04:27
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912009/03/04 17:18:14ここでベストアンサー

ポイント200pt

うーん、コードを見る限りレコードが10件あったら10通というつくりにはなっていませんね。

これは、ボタンがクリックされたときに1度だけ実行するようになっているのですよね?


とりあえず、他の部分に対応しました。

・0件のときは送信しない

・本当は[受付日]を入れたい(レコードがあれば出るはず)

・改行したい

Option Compare Database

Private Sub コマンド1_Click()
    Dim DB As Database
    Dim RS As Recordset
    Dim 件名 As String
    Dim 本文 As String
    
    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("Q_今日の実績")
    
    '検索結果の確認:街頭情報がなければ終了
    If RS.RecordCount = 0 Then
        MsgBox "該当するデータがありません"
        Exit Sub
    End If
    
    '件名の作成
    件名 = "実績更新のお知らせ"
    '本文の作成
    本文 = "[" & RS!受付日 & "]の実績、更新されました。"
    Do Until RS.EOF
        '本文の作成
        本文 = 本文 & vbCrLf & RS!品名 & RS!品番
        RS.MoveNext
    Loop

    'メールの送信
    DoCmd.SendObject acSendNoObject, acSendNoObject, acFormatTXT, "aaa@aaa", , , 件名, 本文, False
    RS.Close: Set RS = Nothing
End Sub

本当にレコード数だけメールが送信されるか、もう一度確認いただけますか。

また、日付が入らない場合はクエリの中身を提示ください。

(そこに日付がなければ追加すればOKなはずです。)

id:sakanainu

Mooks様、どうもありがとうございます。レコード数だけメール送信されることなく、送ることができました。お礼が遅くなり申し訳ありません。

ただ、テキストボックス[txt受付日]に入力した日付で抽出をしたいのですが、

Set RS = DB.OpenRecordset("Q_今日の実績")

で、パラメータが少なすぎます。1を指定してください

とエラーになってしまいます。

SELECT T_実績.品名, T_実績.品番, T_実績.受付日

FROM T_実績

WHERE (((T_実績.受付日)=[forms]![フォーム1]![txt受付日]))

ORDER BY T_実績.受付日 DESC;

よろしくお願いいたします。

2009/03/05 10:48:18
  • id:Mook
    クエリ内でフォームを指定している場合、それを OpenRecordset で指定すると該当エラーが出るようです。

    面倒ですが、
      Dim sql As String
      sql = "SELECT T_実績.品名, T_実績.品番, T_実績.受付日 " _
        & "FROM T_実績 " _
        & "WHERE (((T_実績.受付日)=" & [forms]![フォーム1]![txt受付日] & "));"

      Set RS = DB.OpenRecordset( sql )
    としたら、できないでしょうか。

    けれど、日付が
      [forms]![フォーム1]![txt受付日]
    で設定されているなら、
      本文 = "[" & [forms]![フォーム1]![txt受付日] & "]の実績、更新されました。"
    でもよいですね。
  • id:sakanainu
    Mook様度々ありがとうございます。
      Dim sql As String
      sql = "SELECT T_実績.品名, T_実績.品番, T_実績.受付日 " _
        & "FROM T_実績 " _
        & "WHERE (((T_実績.受付日)=" & [forms]![フォーム1]![txt受付日] & "));"

      Set RS = DB.OpenRecordset( sql )

    試してみましたが、クエリを開くと抽出されているのに「該当するデータがありません」のメッセージボックスがでてしまいます。
    よろしくお願いいたします。
  • id:Mook
    Set RS = DB.OpenRecordset( sql ) の前で
     MsgBox sql
    等して、クエリの中身を確認いただけますか。
  • id:sakanainu
    Mook様ありがとうございます。

    SELECT T_実績.品名, T_実績.品番, T_実績.受付日 FORM T_実績 HWERE(((T_実績.受付日)=2009/02/23));

    となっています。
  • id:Mook
        & "WHERE (((T_実績.受付日)=" & [forms]![フォーム1]![txt受付日] & "));"

        & "WHERE Format(T_実績.受付日,""yyyy/mm/dd"")=Format(" & [forms]![フォーム1]![txt受付日] & ",""yyyy/mm/dd"");"
    に変更してみてください。
  • id:sakanainu
    Mook様できました!日付型だから書式を設定しないといけないのでしょうか?
    今からすぐに業務に生かしますが、ゆっくりこのコードを解読したいと思っています。はてなの使い方も不慣れで失礼があったかと思いますが、丁寧にお答えいただき本当に助かりました。ありがとうございました。
  • id:Mook
    だいたいの データベースは文字列で記載した書式を日付に変換して比較してくれるのですが、
    Access で試してみたところ、条件が機能しませんでした。

    検索したらどうやら Access 日付は # で囲むようですね。今回は文字列に変換して無理やり
    マッチさせましたが(これはこれで応用範囲があるのですが)、下記のようでもできるようです。

        & "WHERE T_実績.受付日=#" & [forms]![フォーム1]![txt受付日] & "#;"

    このあたりはDBごとの癖なので、面倒くさいですね・・・。
  • id:sakanainu
    Mook様 どうもありがとうございます。

    & "WHERE T_実績.受付日=#" & [forms]![フォーム1]![txt受付日] & "#;"

    でしっかり動きました。でも文字列に変換させる ということも今後使うことがあるかもしれないので、大変勉強させていただきました。
    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません