質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

Q&A

1回答

5759閲覧

OutLookのVBAにて、MailItemが思った動作をしない事

toshikida

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

0グッド

1クリップ

投稿2018/10/12 14:25

編集2018/10/14 21:25

Outlook2010で、Aのメールを開いた時に何かしら処理をして
又、そのAのメールを閉じた時に、別の処理(メール作成、送信)をしようと考えています。

Outlook vba の ThisOutlookSessionに下記のコードを入力しますと
通常は、

'''vba
Private WithEvents g_mailItem As mailItem ''(1)

Private Sub g_mailItem_Open(Cancel As Boolean) ''(2)
Aのメールを開いた時の処理をする
End Sub
Private Sub g_mailItem_Open(Cancel As Boolean) ''(3)
Aのメールを閉じた時の処理
'(別の送信メールを作成し、送る)
Dim objOutlook As Outlook.Application
Dim objMail As Outlook.MailItem
Dim wsMail As Worksheet

Set objOutlook = New Outlook.Application
Set wsMail = ThisWorkbook.Sheets("メール内容")
Set objMail = objOutlook.CreateItem(olMailItem)
With wsMail
objMail.To = "MailAddress@xx.xx" 'メール宛先
objMail.Subject = .Range("B1").Value 'メール件名
objMail.BodyFormat = olFormatPlain 'メールの形式
objMail.Body = .Range("B2").Value 'メール本文
objMail.Send
End With
Set objOutlook = Nothing

End Sub
Private Sub Application_ItemLoad(ByVal Item As Object) ''(4)
Dim mailItem As mailItem
If TypeOf Item Is mailItem Then
Set g_mailItem = Item
End If
End Sub
'''

にて、正常に動作しているのですが

下記の動作をした時に動作しません
⓵ Aのメールを開いてから、Bのメールを開き、AかBのメールを閉じた時のイベント
⓶ Aのメールを開いてから、Aのメールを閉じ、受信フォルダーで他のメールを選択しないで
再びAのメールを開いた時

⓵の場合、g_maileitemの内容が、AのメールからBのメールの内容に変わり、
closeのイベントが、動作しない
⓶の場合、OUTLOOKの受信フォルダで、他のメールを選択しないで同じメールを選択すると
ItemLoadのイベントが、動作しない

と思われます。

別に、Aのメールを開いた後、Bのメールを開いても cansel=true等で 開かなくてもいいです。
何か方法は無いですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imihito

2018/10/12 23:52

情報の追記の依頼:①このコードはどのホスト上(Excel or Outlook or ...)のどのモジュールに記述していますか? 修正の依頼:①タグにVBAを追加してください / ②コード全体の前の行に空行+「```vba」、後の行に「```」+空行、を追加しコードにシンタックスハイライトが適用されるようにしてください
toshikida

2018/10/14 21:26

アドバイスして頂き、有難うございました
guest

回答1

0

通常、Excel外部からThisWorkbookは参照できないはずなのですが、それはさておき。

Outlook2016だと以下のコードで、希望と思われる動作になりました(最低限のロジックに絞っています)。

vba

1'ThisOutlookSession 2 3Private WithEvents currentMailItem As Outlook.MailItem 4Private currentMailIsOpend As Boolean 5 6Private WithEvents cancelMailItem As Outlook.MailItem 7 8 9Private Sub currentMailItem_Open(Cancel As Boolean) 10 currentMailIsOpend = True 11 Debug.Print "メールを開いた時の処理:"; currentMailItem.Subject 12End Sub 13 14Private Sub currentMailItem_Close(Cancel As Boolean) 15 currentMailIsOpend = False: Set cancelMailItem = Nothing 16 Debug.Print "メールを閉じた時の処理:"; currentMailItem.Subject 17End Sub 18 19 20'Aのメールを開いた後、Bのメールを開いても cansel=true等で 開かなくてもいい 21Private Sub cancelMailItem_Open(Cancel As Boolean) 22 Cancel = True 23 Debug.Print "cancelMailItem Cancel" 24End Sub 25 26 27Private Sub Application_ItemLoad(ByVal Item As Object) 28 If Not TypeOf Item Is Outlook.MailItem Then Exit Sub 29 30 If currentMailIsOpend Then 31 Debug.Print "Cancel load" 32 Set cancelMailItem = Item 33 Else 34 Debug.Print "Current load" 35 Set currentMailItem = Item 36 End If 37 38End Sub

⓵ Aのメールを開いてから、Bのメールを開き、AかBのメールを閉じた時のイベント
Aのメールを開いた後、Bのメールを開いても cansel=true等で 開かなくてもいいです。

初期状態だとcurrentMailIsOpendがFalseなので、ロードしたItemはcurrentMailItemにセットされます。
メールが開かれるとcurrentMailIsOpendがTrueになります。

currentMailItemが開いている間はcurrentMailIsOpendがTrueなので、ロードしたItemはcancelMailItemにセットされ、Cancel = Trueによって開かれません。

メールが閉じられるとcurrentMailIsOpendがFalseになるため、他のメールを開けるようになります。

⓶の場合、OUTLOOKの受信フォルダで、他のメールを選択しないで同じメールを選択すると

ItemLoadのイベントが、動作しない

何もしなくても再度開いたときにMailItem_Openなどは動くので、特に対処はしていません。

投稿2018/10/15 12:12

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問