業務効率化

OutlookVBA:メール操作前処理

Outlook(Classic)を操作する前処理のプロシージャです。メールの操作をする際に必要な条件(メールを開いているか、選択しているかなど)を満たす処理で、メール作成、送信双方のプロシージャ前処理として使用できます。

記事の内容

・コード

・ポイント機能

コード

➤コードはこちら
Option Explicit

Sub OlMailPreSub()

Dim olApp As Outlook.Application
Set olApp = New Outlook.Application
Dim olMail As Outlook.MailItem
Dim istoreply As String

istoreply = MsgBox("返信?", vbYesNoCancel)

'赤文字の注意文
Dim 注意文 As String
Dim htbody As String
注意文 = "宛先等に間違いありませんか?"
htbody = "<html><body><p>" & "<span style='color:red;'>" & 注意文 & "</span><br></body></html>"

1:
On Error Resume Next
Set olApp = GetObject(, "Outlook.Application") ' 既存のインスタンスを取得
If olApp Is Nothing Then
    Set olApp = CreateObject("Outlook.Application") ' 新しいインスタンスを作成
End If
On Error GoTo 0

If olApp Is Nothing Then
    MsgBox "Outlookを取得または起動できませんでした。", vbExclamation
    If MsgBox("再試行しますか?", vbOKCancel) <> vbOK Then
        GoTo 1
    Else
        Exit Sub
    End If
End If


On Error Resume Next
Dim olrep As Outlook.MailItem
If istoreply = vbYes Then
    If MsgBox("メールを開き、返信メールを選択状態にしていますか?", vbYesNoCancel) <> vbYes Then Exit Sub
2:
    If olApp.ActiveExplorer.Selection.count = 0 Then
        If MsgBox("返信するメールを選択してください。", vbOKCancel) = vbOK Then
            GoTo 2
        Else
            Exit Sub
    End If
    End If
    Set olMail = olApp.ActiveExplorer.Selection.item(1)
    Set olrep = olMail.ReplyAll
    
    If Err.Number <> 0 Then
        MsgBox "メールを選択してください"
        Err.Clear ' エラー状態をクリア
        GoTo 2
    End If
Else
    Set olMail = olApp.CreateItem(olMailItem)
    Set olrep = olMail
End If

On Error GoTo 0

olrep.Display


End Sub

メール操作前の処理に入りつけることでエラー回避ができます(OutlookClassicが終了しないことが前提ですが...)。

使用前には、参照設定でoutlookにチェックを付けてください。

ポイント機能

・GetObjectとCreateObjectの併用

GetObjectとCreateObjectの併用

オブジェクト取得メソッドとしてある二つを使用しています。これはメールアプリを開いていても開いていなくても操作できるようにするためです。コンピュータメモリの容量とその動作の観点からはあまりリソースを割くことは好ましくない為、GetObjectメソッド使用の方が好ましいですが、メールの操作ということであまり影響もないためどちらも使用しています。

CreateObjectは参照設定でチェックをしない=事前バインディングをしていない場合の使用が多いですが、今回はメールアプリの開閉に関わらず実行するために両方を使用しています。

外部アプリ使用時の宣言では、変数に直接 Dim 変数 As New Outlook.applicationを宣言するという方法と、今回の2行記載方法があります。

どちらがいいかというと、2行で書くのが無難とのことです。1行でもよいですが、その場合set Nothingをした後でも変数を使うと再度オブジェクトが再生成されてしまうようです。

参考:VBAオブジェクト変数の宣言時に1行でAs Newした時と2行に分けてSetした時の違い #ExcelVBA - Qiita

-業務効率化