
下記のような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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Visual Studio 「AnyCpu」について
-
「読み込み違反」が起きたとき...
-
C++初心者です。 debug asserti...
-
Windows PowerShellでC言語を実...
-
VB6 EXEとプログラムの違い
-
エスケープ・シーケンスによる...
-
ManagementClassが見つからない。
-
Designer.vbは直接コードをいじ...
-
う~ん…。
-
VBAの参照設定について
-
byte型をstring型として扱うには
-
VB2013で作成したプログラムの...
-
C#ソースをCSCファイルにてコン...
-
C++Builder5で画像データを用紙...
-
VB6.0で作成したexeファイルが...
-
VBAでエクセルからワードへの差...
-
意味不明の実行時エラーで困っ...
-
~の文字化けについて
-
VBAでOutlookを終了させたい Ex...
-
VBSで起動したアプリが前面表示...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Visual Studio 「AnyCpu」について
-
excel vbaから実行するexe実行...
-
Windows PowerShellでC言語を実...
-
「読み込み違反」が起きたとき...
-
C++初心者です。 debug asserti...
-
VB6.0 exe作成時に実行時エラー...
-
mscorlib.dllの初回例外について
-
外部exe呼び出しの方法 ShellEx...
-
VisualStudioでC#が実行できない
-
CreateFile が ERROR_PATH_NOT_...
-
androidで.exeを実行できますか?
-
実行ファイル(.exe)が別のPC...
-
ActiveX → VB を起動するとCre...
-
C#VB、exeに埋め込んだexeの実行
-
ActiveDirectoryから値を取得
-
Format 関数のバグ?
-
Windows64BitOSでVB5.0のPG起動
-
JP1から起動したexeでhttpリク...
-
JP1/File Transmission Server/...
-
matlabで作成したdllをVBAで使...
おすすめ情報