三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

QA20110912 アウトルック 終了時の未送信確認メッセージを何とかしたい

読者より、下記の質問が届きました。

> 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 使えばいいのかもしれないけど・・・

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)