プロが教える店舗&オフィスのセキュリティ対策術

一覧表から,mailItemObj.Display を使って,メールを半自動で送信するVBAを作成してます。

ループのなかで,mailItemObj.Display を使うと,ループの数だけ,一度に送信のウィンドウが開いてしまいます。

これを,一つのウインドウの処理が終わったら次のウィンドウが開くようにするに,どうすればいいのでしょうか。

送信終了のイベントを検出するまで,ループさせて,終了後に次のウインドウが開くようにすれば良さそうですが,

実際にどうすればいいか解りません。

ご助言をお願いできればありがたいです。

A 回答 (2件)

こんばんは、


.Displayメソッドには戻り値が無かったように記憶しています。
従って送信またはキャンセルされた時に次に進むような処理は難しいのではないでしょうか。
WindowsAPIなどでWindowを捕まえて、すべて非表示、、順番に表示するような事も出来るかも知れませんがどうでしょう?

コードがないので実際どのようなプロセスか分かりませんが、
考え方を変え、mailItemObj.Display ウィンドウでユーザーが行いたい事を
mailItemObj.Displayを使わずUserFormで表示して実行する事は、可能ではないかと思います。

例えば、
For i = 1 to 10
With objMail
.To = List(i) 不明の為 'メール宛先
.Subject = "メール件名"    'メール件名
.BodyFormat = olFormatplain 'メールの形式
.Body = "メール本文" 'メール本文
.Display
End With
のような場合、

UserForm1.Show

UserForm1 Moduleで
Private Sub UserForm_Initialize()
省略
For i = 1 to 10
ListBox1.AddItem = .AddressEntries(i).Address ? 不明の為 'メール宛先
Next
TextBox1 = "メール件名"    'メール件名
TextBox2 = "メール本文" 'メール本文

など確認操作したい項目を備える
End Sub

Private Sub CommandButton1_Click()
省略
With objMail
.To = ListBox1.Text 'メール宛先
.Subject = TextBox1.Value    'メール件名
.BodyFormat = olFormatplain 'メールの形式
.Body = TextBox2.Value 'メール本文
.Send
End With
End Sub

ご質問から離れてしまったので、この辺で
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
VBAの初心者なので,とんちんかんなこと考えたのかも
しれません。

いろいろくぐってみると,
送信終了後に,

Application_ItemSend

のイベントが発生するとの記載がりました。
これ,OUTLOOKで発生するんですね。

このイベントをエクセルで検知できれば,
と考えてました。

あるいは,このイベントで,エクセルのセルに設定した
フラグ等の書き換えができれば,
Do While
等の無限ループで,

 objMail.Dsplay

で一ずつ送信ウインドウを開けるかなと考えました。

こんなこと可能なんでしょうかね。

お礼日時:2020/09/05 00:22

こんばんは、


エクセルから操作するのですね。
処理の流れとして
>ループのなかで,mailItemObj.Display を使う
としないのであれば、可能かもしれませんね。
Application_ItemSend で、mailItemObj.Displayから送信せずに閉じた場合、どのように対策しますか

どの様なプロセスを前提に考えられているか分かりませんが、少なくともループの中でmailItemObj.Display表示して
Do While等の無限ループで、イベントを待つのは、どうなんでしょう?(思ったら検証してみては?それが一番早いし理解できるかと)
すみません。いまは、検証する時間がないのでわかりませんが、普通?に考えると

前提として、送信イベント&キャンセルイベント、または、ウインドウが閉じるなど捕まえられるなら
トリガー >>メール作成 >> イベント >> Call メール作成 の様にするかな

Dim n As Long
sub trigger()
省略
To_Address= xxx
call MailAdd (To_Address)

sub MailAdd (To_Address As String)
省略
With objMail
.To = To_Address
省略
.Display ’イベント発生又はトリガーを得る
End With

Private Sub Outlook.Application_ItemSend(ByVal item As Object, Cancel As Boolean)
Dim To_Address As String   'このイベントこんな書き方で動いたか不明です。調べてください。
If cells(n+1,1) <>"" Then
To_Address=cells(n+1,1)
Call MailAdd (To_Address)
n=n+1
end if

適当になってしまいましたが、あくまで.Displayから挙動がつかめれば、
こんな感じで繰り返せば良いのでは?
    • good
    • 0
この回答へのお礼

へんな質問に丁寧にお答えいただいてありがとうございます。

自分の考えてコーデングしていて,全然うまくいかないので,

質問させていただきました。


とうも,大きな勘違いをしていたようで,

Application_ItemSendのイベントは,

エクセルでおきるものと思い込んでいました。

動く訳ないですよね。それでの質問でした。


それと,送信せずに閉じた場合,ウィンドウを閉じる時も

何らかのイベントが発生するのかなんて考えておりました。

この辺の考えは,PICの割り込みの種別で違った処理をする

ことが頭に残ってるからかと思います。


>Do While等の無限ループで、イベントを待つのは、どうなんでしょう?
これも,知り合いの方に良くいわれて,

あまりいい方法でないとよく言われました。


前回のご回答のように,UserFormで確認するのがベスト

かなと思います。



それと,Outlook.Application_ItemSend(ByVal item As Object, Cancel As Boolean)

な記述ができるんですね。これは,エクセル側で,イベントのハンドラーの記述ができると理解していいのでしょうか。

イベントのハンドラーはアウトルック側に書くのかなと

おぼろげながら思ってました。




とりあえず,MsgBox はさんで処理を一時中断することで

対処してみて,いろいろ試して,勉強しながら,

やっていこうと思います。


お忙しいのにご回答いただきありがとうございます。

前回のご回答をベストアンサーにさせていただきます。

お礼日時:2020/09/05 09:31

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