
下記のような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件)
- 最新から表示
- 回答順に表示
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# …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ActiveX → VB を起動するとCre...
-
Designer.vbは直接コードをいじ...
-
印刷要求順番と印刷出力順番が...
-
C#ソースをCSCファイルにてコン...
-
VBAで印刷スプール終了の判定を...
-
ManagementClassが見つからない。
-
クリレポのプリンタ設定について
-
意味不明の実行時エラーで困っ...
-
VB6をWindows10にインストール...
-
フォームの最前面が効かない
-
VB.NET+ActiveReports で印刷...
-
VB6上から印刷ダイアログを表示...
-
二重起動禁止にする理由とは
-
VB2008→VB2010でエラーが出てま...
-
vbaでPDFファイルが印刷されない
-
VBAでArrayListを使う為の「msc...
-
vba 時間の引き算 例えば 15:00...
-
VC#2005でエクスプローラを起動...
-
Keydownイベントについて
-
VB.NET(2017)で インストーラを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
excel vbaから実行するexe実行...
-
Windows PowerShellでC言語を実...
-
C++初心者です。 debug asserti...
-
「読み込み違反」が起きたとき...
-
Visual Studio 「AnyCpu」について
-
JP1/File Transmission Server/...
-
(msvcr71d.dll) でハンドルされ...
-
mscorlib.dllの初回例外について
-
androidで.exeを実行できますか?
-
VB6.0 exe作成時に実行時エラー...
-
VBコンソールアプリケーション...
-
ActiveDirectoryから値を取得
-
Eclipse CDT MinGWによるC言語
-
ACCESSランタイムでエラー
-
matlabで作成したdllをVBAで使...
-
VBで「ファイル名を指定して実...
-
外部exe呼び出しの方法 ShellEx...
-
VB6 EXEとプログラムの違い
-
CreateFile が ERROR_PATH_NOT_...
-
ActiveX → VB を起動するとCre...
おすすめ情報