アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のような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

A 回答 (2件)

Application_NewMail はメールがまとめて入ると一度しか実行されません。



ご希望の動作が可能かは確約できませんが、試しに

Application_NewMailEx を試されてはいかがですか?

Application_NewMailEx は一通一通にマクロを実行します。(OUTLOOK2003から使用可)

少しでもお役に立てればいいのですが・・・
    • good
    • 0

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# …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!