読者より、下記の質問が届きました。
> objMAIL.Send
>この間に,送信ができたか確認してから
> oApp.Quit
>Outlookを終了させたいのですが・・・.
>
>上記のままだと送信が終わる前に終了しようとしてしまい
>送信できていませんという警告がでます.
案1.オプションを変更する
送信ファイルが残っていると終了時にメッセージが表示されるので
ツール メールセットアップ 送受信
で
□接続したら直ちに送信する
を選択する。
すぐに送信されれば、
送信箱に残らないので、
終了時の確認メッセージは出ないかなぁ・・と期待して。
オプション変更後、テストを行う
オプションを変更しても、
終了が速くて送られなかったり、
なぜか、そのまま送信トレイに残ってしまった。
小細工で、wait 5秒待ち
オプションを変更しても不安定だったので、
Application.Wait (Execel VBA)
で.Quitの終了前に5秒待ってみた。
objMAIL.Send '送信箱へ ※セキュリティの警告メッセージが出るよ Application.Wait (Now + TimeValue("0:00:05")) 'アプリを閉じる oApp.Quit
これで、なんとか動いたけど・・・5秒以上送信がかかったらマズイなぁ・・・
※他の方法も考えないと。
試行錯誤のいつものデバック、テスト動画
http://www.youtube.com/watch?v=YswBr1Bgb6I
www.youtube.com
終わりの挨拶
オプションの変更は使えない場合もあるので
(変更したくない/勝手に返るとマズイ時もあるので)、
終了前に送受信を走らせる別な方法を考えないとなぁ・・・と思いつつ、
いつものように逃げるように失礼します。 三流プログラマー Ken3
おまけ
テストに使ったソース
三流君VBAでOutlookを操作する
のサンプルに.quitとwaitを追加。
Option Explicit Sub MAKE_MAIL_ITEM_TEST_NG() Dim oApp As Object Dim myNameSpace As Object Dim myFolder As Object Dim objMAIL As Object 'メールのオブジェクト Dim strMOJI As String '本文 'outlook 起動 Set oApp = CreateObject("Outlook.Application") Set myNameSpace = oApp.GetNamespace("MAPI") Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダーを指定 myFolder.Display '表示 いつものクセで .Visible = True とやりがちだけど 'メールアイテムの作成 Set objMAIL = oApp.CreateItem(0) 'olMailItem=0 直値はいけないと思いつつ、 objMAIL.Display '画面表示(Mail入力、編集画面を表示) '宛先・件名・本文 などのデータを代入する objMAIL.To = "test3@ken3.org" '宛先 ほかに.cc や.Bccも可能です 'objMAIL.CC = "vba@ken3.org" '宛先 .cc 'objMAIL.BCC = "vba@ken3.org ; oltest@ken3.org" '宛先を複数は ; セミコロンで区 切る objMAIL.Subject = "テスト メールの件名です " '.Subjectに文字列設定で件名 '本文を作る、(vbCrLfで改行されます) strMOJI = "こんにちは(このメールtestアドレスなので質問は別便で)" & vbCrLf _ & " ここで 文字列を作って .Bodyに代入する" & vbCrLf _ & " メールアイテムが作成されたらその後、 " & vbCrLf _ & " .save 下書きへ保存 や .sendで送信(確認が出る)" & vbCrLf _ & " 今回は、.Display で メール作成画面を表示" & vbCrLf _ & Now() & "作成" objMAIL.Body = strMOJI '本文の代入 '添付ファイルを送りたいって? そんな時は、.Attachments.Add "ファイル名" 'objMAIL.Attachments.Add "e:\work\test.txt" '本当はファイルの存在チェックも事前 にしたいけど 'objMAIL.Attachments.Add "e:\work\作業報告書.xls" '複数送りたかったら、再度.Addしてね objMAIL.Display '編集画面のまま止めておきたい時 や テスト中に動作を見たいとき 'objMAIL.Save '保存、下書きへ 保存後、用が無かったら.Closeで閉じるのがいいのかなぁ。 。。 'objMAIL.Close 2 '閉じる Mailの編集画面を閉じる objMAIL.Send '送信箱へ ※セキュリティの警告メッセージが出るよ Application.Wait (Now + TimeValue("0:00:05")) 'アプリを閉じる oApp.Quit End Sub
おっと、Application.WaitってAccessに無くてVBA共通じゃなかった。
http://ken3-info.blog.ocn.ne.jp/code_gomibako/2009/10/accessexcelappl.html
Dim time10 As Date time10 = DateAdd("s", 5, Now) '5秒待ち While Now < time10 DoEvents Wend
こっちのほうがサンプルとしてはいいのかなぁ?
※素直に sleep 使えばいいのかもしれないけど・・・