• 締切済み

一通ずつ処理したい(アウトルックVBA)

下記のようなVBAソースを走らせております。 アウトルックでメールを受信し、受信トレイ入ったメールの本文内にある"昭和"または"平成"のキーワードを読み分けて、某プログラムを走らせるものです。某プログラムはShellで呼び出してから動き始め20秒程度で終了します。ほとんどの場合、一回の受信で、1通しかメールが入りませんが、まれに2通入る事が有ります(同時接続のクライアントは2台なので、同時に送られると2通入りますが、3通以上同時に入る事はありえません) その場合、下記のソースで走らせると、一度に二つのshellが立ち上がってしまい、不具合が生じます(同種同時あるいは異種同時起動ができないプログラム仕様なので) そこで、一つ目の処理が終わってから、二つ目の処理に入る・・・という動きにしたいのですが、見当がつきません。 ご教示をいただけると助かります。宜しくお願いします。 Private Sub Application_NewMail() Const SEARCHWORDA = "昭和" Const SEARCHWORDB = "平成" Dim myNS As NameSpace Dim myInBox As MAPIFolder Dim myItem As MailItem Set myNS = Outlook.Application.GetNamespace("MAPI") Set myInBox = myNS.GetDefaultFolder(olFolderInbox) For Each myItem In myInBox.Items If InStr(myItem.Body, SEARCHWORDA) > 0 Then shell "hoge1.exe" End If If InStr(myItem.Body, SEARCHWORDB) > 0 Then shell "hoge2.exe" End If Next End Sub

みんなの回答

  • yuujgmn
  • ベストアンサー率50% (2/4)
回答No.2

Application_NewMail はメールがまとめて入ると一度しか実行されません。 ご希望の動作が可能かは確約できませんが、試しに Application_NewMailEx を試されてはいかがですか? Application_NewMailEx は一通一通にマクロを実行します。(OUTLOOK2003から使用可) 少しでもお役に立てればいいのですが・・・

すると、全ての回答が全文表示されます。
回答No.1

Shellを同期処理で実行することはできませんが、APIを使ってアプリケーションの終了を待機する方法があります。 ご提示されたコードには一切触れません。Shellの同期実行のサンプルを書きましたので参考にしてみてください。 そのまま使うのであれば標準モジュールにでもコピーして、Shellメソッドの部分をShellAndWaitメソッドに置き換えればたぶん大丈夫だと思います。なお動作確認はOutlookではなくExcelで行いました。 [ Module1 ] ' Win32API Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long ' 待機関数を使用 Private Const SYNCHRONIZE = &H100000 ' ExePath 実行するアプリケーションのパス ' Timeout 終了するまで待機する時間(ミリ秒) (-1)で終了まで待機 Public Sub ShellAndWait(ByVal ExePath As String, ByVal Timeout As Long) Dim hId As Long, hProc As Long ' アプリケーションを起動し、プロセスハンドルを取得 hId = Shell(ExePath, vbNormalFocus) hProc = OpenProcess(SYNCHRONIZE, True, hId) ' アプリケーションが終了するか、タイムアウトが経過するまで待機 Call WaitForSingleObject(hProc, Timeout) ' プロセスハンドルを閉じる Call CloseHandle(hProc) End Sub Sub Sample() ' メモ帳を起動し、終了または10秒経過で制御が戻る Call ShellAndWait("Notepad.exe", 1000 * 10) MsgBox "終了しました。" End Sub ※コーディングは下記のページを参考にしました。 http://www.ops.dti.ne.jp/~allergy/vb/vbvba.html#exec

すると、全ての回答が全文表示されます。

関連するQ&A