Corredor

ウェブ、プログラミングの勉強メモ。

リッチテキストなメールテンプレートを開きメールの件名と本文の文言を置換する Outlook マクロ

普段は Thunderbird を使っているが、会社で Outlook を使わされている。Outlook も、Excel や Word と同じように VBA (マクロ) が使えるので、少しマクロを書いてみた。

いつも週次で送っているメールがあり、本文の内容はそのままに、件名と本文にある日付のみを書き換えて送っている。毎週同じことをするのはバカらしいので、これを自動化した。

前提

対象は Outlook 2007・2010。リッチテキスト形式のメールしか送受信しないので、以下はリッチテキスト形式のメールテンプレートを操作するマクロとして読んでほしい。

メールテンプレートの用意

マクロを作る前に、メールテンプレートファイルを .oft 形式で用意する。

リッチテキスト形式のメールを新規作成し、宛先、件名、本文などを書く。フォント設定などあれば予めしておくが吉。この時、あとで自動置換させたい部分は「【今日日付】」と黒カッコで囲うなどして、一意に特定できる文字列にしておく。個人的には「★1★」「★2★」と、置換する箇所に「★」マークを置くのをオススメ。★マークなんてメールで使わないので、万が一置換漏れがあったりした時は気付きやすいからだ。

ここでは、以下のようなテンプレートを作成したものとして話を進める (メールの中身は適当、実際のオシゴトとは一切関係ありません)。

宛先:(色々設定しておく)
CC :(色々設定しておく)
件名:【週次連絡】【今日日付】 分の報告書について

本文:

宛先各位
お疲れ様です。Neo です。

今週の報告書を作成しました。
詳細はポータルサイトよりご確認ください。
確認期限は、明日 【明日日付】 の15時までです。

以上です。

このメールの件名の「【今日日付】」部分、本文の「【明日日付】」部分をそれぞれ置換する。

メールができたら「名前を付けて保存」より、「Outlook テンプレート (*.oft)」形式で適当なフォルダに保存する。これでメールテンプレートの準備ができた。

参照設定

まずは Outlook 上で Alt + F11

VB Editor が開くので、「ツール」→「参照設定」より、「Microsoft Word 12.0 Object Library (Outlook 2007 の場合)」にチェックを入れる。Outlook 2010 の場合はバージョンが 14.0 になっている、同じものがあるはずだ。

後述するが、この参照設定は必須ではない。

マクロ作成

次に「標準モジュール」を新規作成し、以下のようなマクロを書く。

Sub メールテンプレート起動と文字列置換()
    Dim mail As Outlook.MailItem
    Set mail = Application.CreateItemFromTemplate("C:\メールテンプレート.oft")
    mail.Display
    
    ' 件名の置換
    mail.Subject = Replace(mail.Subject, "【今日日付】", Format(Date, "mm-dd"))
    
    ' 本文の置換
    With Application.ActiveInspector.WordEditor.Range(0, 0)
        With .Find
            .Text = "【明日日付】"
            .Replacement.Text = Format(DateAdd("d", 1, Date), "mm/dd(aaa)")
            .Execute Replace:=wdReplaceAll
        End With
    End With
End Sub

ポイントは以下のとおり。

  • CreateItemFromTemplate("C:\メールテンプレート.oft") 部分で、予め作っておいたテンプレートファイルへのパスを指定する。
  • mail.Display でメールウィンドウが起動する。
  • mail.Subject = Replace() で件名の置換。「【今日日付】」という文言を、Format() で整形した今日日付 (mm-dd 形式) に変換する。
  • 本文の置換には WordEditor を使用している。予め Word の Object Library を参照させておいたのは、ココで定数の wdReplaceAll を使うため。ちなみに wdReplaceAll は「一括置換」の操作。
    • 逆にいえば、Const wdReplaceAll = 2 などとどこかで宣言しておけば、Word の Object Library を参照しなくとも置換させることができる。
    • テキスト形式のメールであれば mail.Body、HTML 形式のメールであれば mail.HTMLBody というプロパティから置換したりもできたが、リッチテキスト形式を扱う mail.RTFBody というプロパティはバイト配列に直したりしないといけなくて直観的でなかったため、WordEditor を使用した。
  • 本文の置換の際は、DateAdd() 関数で今日日付 (Date) に1日足し ("d", 1,)、それを Format() で整形して mm/dd(aaa) 形式で置換している。
  • With .Find のブロックを複数作れば、1つのメールの本文中にある複数の文言を置換させられる。また、この Sub プロシージャのようなものを複数作り、それらを Call する親プロシージャを用意しておけば、複数のメールを一括で立ち上げ、それぞれ置換させたりすることも可能。
  • メールの送信はしていない。テンプレートを開き、必要な箇所を置換したらマクロが終了する。内容を確認して、手動で送信する (マクロで送信もできるけど、相手に見てもらうモノなので、最後は自分の責任で目視確認した方がよろし)。

あとはお好みに合わせてカスタマイズしてください

WordEditor でのカーソル位置の設定とかがイマイチうまくできなくて、苦肉の策で SendKeys を多用する無茶苦茶なマクロを別途書いたりしていたが、テンプレートの内容はしばらく変わらないし、ひとまずこれで良い感じ。

参考