下記のような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#VB、exeに埋め込んだexeの実行
-
excel vbaから実行するexe実行...
-
外部exe呼び出しの方法 ShellEx...
-
Delphi 閉じてないウインドウを...
-
Windows PowerShellでC言語を実...
-
JP1/File Transmission Server/...
-
ACCESSランタイムでエラー
-
実行ファイル(.exe)が別のPC...
-
mscorlib.dllの初回例外について
-
VB6 EXEとプログラムの違い
-
VBAでコマンドプロンプトを呼び...
-
Format 関数のバグ?
-
C言語に詳しい人に質問です。
-
C++初心者です。 debug asserti...
-
エスケープ・シーケンスによる...
-
shell関数には二重引用符を渡せ...
-
VBにてDLLをデバックする方法。
-
vba 時間の引き算 例えば 15:00...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Visual Studio 「AnyCpu」について
-
「読み込み違反」が起きたとき...
-
Windows PowerShellでC言語を実...
-
excel vbaから実行するexe実行...
-
C++初心者です。 debug asserti...
-
実行ファイル(.exe)が別のPC...
-
ActiveDirectoryから値を取得
-
VB6.0 exe作成時に実行時エラー...
-
外部exe呼び出しの方法 ShellEx...
-
Format 関数のバグ?
-
ActiveX → VB を起動するとCre...
-
androidで.exeを実行できますか?
-
C#VB、exeに埋め込んだexeの実行
-
system関数(Windows)の戻り値!!
-
Eclipse CDT MinGWによるC言語
-
Pythonのコードをexe化
-
VBAでコマンドプロンプトを呼び...
-
VisualStudioでC#が実行できない
-
VB.NetのWinsockについて
-
mscorlib.dllの初回例外について
おすすめ情報