時間のかかる業務の代表「メール作成」。中には、定期的かつ毎回同じようなフォーマットで作成、送信するメールもあるのではないでしょうか。今回は、日報を例に、Excelに記入したことを基にメールを作成するVBAを紹介します。
業務で発生するちょっとした面倒くさい業務。特定の操作を繰り返すだけなので、今のままでもいいけど、楽になったらいいなと思うこともあるのではないでしょうか。例えば業務を自動化すると時間が空くため、他の業務に時間を充てたり、残業時間を減らしたりできるかもしれません。
本連載「働く価値を上げる“VBA/GAS術”」では、業務を効率化する手段として「Microsoft Excel」(マイクロソフトエクセル)で使える「VBA」(Visual Basic for Applications)と「G Suite」の「GAS」(Google Apps Script)の使い方を説明し、よくある業務課題の解決策を紹介します。
仕事の中で、書類作成業務とともに時間がかかる業務の代表が「メール」ではないでしょうか。多くの人は、仕事で社内や取引先と毎日たくさんのメールをやりとりしています。
その中には、定期的かつ毎回同じようなフォーマットで作成、送信するメールもあるのではないでしょうか。例えば、日報や定期的に発生する依頼、期限をお知らせするリマインドなどが挙げられます。
そのようなメールの作成も、大体の内容や手順が決まっていれば、マクロ化できます。定期的に発生するメール作成は、1回当たりが小さな時短でも、日々積み重なると大きな差を生み出します。
今回は、日報メールを題材にして、「Excelに記載した内容を基にMicrosoft Outlook(以下、Outlook)でメールの下書きを作成する」マクロの作り方を解説します。なお、以下の記事で紹介した命令については本記事では詳しく紹介しませんので、都度参照してください。
では準備として、Excelファイルに日報メールの元データを2つのシートに用意します。
まず、1つ目が「フォーマット」シートです。このシートには、日報メールを作成する際に必要な、「送信先アドレス」「件名」「宛名」「本文の書き出し」「締めの文章」などを記載します。
なお、B3セルの件名欄は、現在の日付が挿入されるように、以下のExcel関数を入力しています。
="日報 [" & B1 & "] : " & TEXT(TODAY(), "yyyy/mm/dd(ddd)")
2つ目のシートは「レポート」シートです。日報には、時間帯別の活動内容を記載することがあるので、それらの情報をこのシートに表形式で記載します。
日報は、日々変わるので、メール作成のマクロを動作させる前に、当日の活動内容に更新します。
もう一つの準備として、Outlookライブラリの参照設定を行います。これを設定することで、Outlook関連の各種オブジェクトやメンバーが、自動メンバー表示などに表示されるようになります。
ライブラリの参照設定を行うには、まずVBEのメニューの「ツール」から「参照設定」を選択します。
次に、たくさんのライブラリが列挙されている「参照設定」ダイアログの中から「Microsoft Outlook 16.0 Object Library」にチェックを入れて、「OK」をクリックします。
これで、Outlookライブラリの参照設定は完了です。下記のようにOutlookライブラリの構成要素に、自動メンバー表示からアクセス可能です。
これで事前準備は完了です。
下記は、Excelの2つのシートを基にOutlookで下書きを作成するプロシージャ「Sub 日報メール作成()」です。
- Sub 日報メール作成()
- 'レポート部分の生成
- Dim report As String: report = ""
- Dim i As Long: i = 2
- With Sheet2
- Do While .Cells(i, 1).Value <> ""
- report = report & .Cells(i, 1).Value & "/"
- report = report & .Cells(i, 2).Value & "/"
- report = report & .Cells(i, 3).Value & "<br>"
- i = i + 1
- Loop
- End With
- 'メールの各要素の生成
- With Sheet1
- Dim myTo As String: myTo = .Range("B2").Value
- Dim mySubject As String: mySubject = .Range("B3").Value
- Dim myBody As String: myBody = ""
- myBody = myBody & .Range("B4").Value & "<br>" '宛名"
- myBody = myBody & convertLf(.Range("B5").Value) & "<br>" '書き出し
- myBody = myBody & report 'レポート
- myBody = myBody & convertLf(.Range("B6").Value) '締め
- End With
- '下書き作成
- Dim olApp As Outlook.Application
- Set olApp = New Outlook.Application
- Dim myMail As MailItem
- Set myMail = olApp.CreateItem(olMailItem)
- With myMail
- .To = myTo
- .Subject = mySubject
- .Display
- .HTMLBody = myBody & .HTMLBody
- End With
- End Sub
「Sub 日報メール作成()」を実行すると、下記のようなメールの下書きがOutlookに作成されます。
下記は、処理の大まかな流れです。
また、上記プロシージャ内で使用している「Function」プロシージャ「convertLf()」は下記になります。
- Function convertLf(ByVal str As String) As String
- convertLf = Replace(str, vbLf, "<br>")
- End Function
今回作成するメールはHTMLメールです。従って、メール上の「改行」は、Excelのセル内部の改行コード「LF(ラインフィード)」ではなく、HTMLのbrタグで表現する必要があります。
Functionプロシージャ「convertLf()」は、与えられた文字列内の改行コード「LF」を、brタグに置換して返すものです。
VBAによるOutlookの操作方法を中心に、ポイントを解説します。
今回は、Outlookアプリケーションを用意し、VBAから操作します。それを行っているのが、下記です。
Dim olApp As Outlook.Application Set olApp = New Outlook.Application
これにより、新しい「OutlookApplication」オブジェクトが生成され、「olApp」という変数名で扱えるようになります。
続いて、下記のステートメントを解説します。
Set myMail = olApp.CreateItem(olMailItem)
「CreateItem」メソッドは、OutlookApplicationオブジェクト上に、新しく「Outlookアイテム」を作るメソッドです。
OutlookApplicationオブジェクト.CreateItem(アイテムタイプ)
CreateItemメソッドで作成できるアイテムには、幾つかの種類があります。どの種類のアイテムを作成するかは、下記の表の引数に与える値で決定します。
アイテムの種類 | オブジェクト | 定数名 | 値 |
---|---|---|---|
メール | MailItem | olMailItem | 0 |
予定 | AppointmentItem | olAppointmentItem | 1 |
連絡先 | ContactItem | olContactItem | 2 |
タスク | TaskItem | olTaskItem | 3 |
今回は、新しいメールを作成するので、引数として指定する定数は「olMailItem」、生成されるオブジェクトは「MailItem」オブジェクトになります。
作成したMailItemオブジェクトについて、送信先アドレス、件名、本文などを指定し、入力している部分が下記です。
With myMail .To = myTo .Subject = mySubject .Display .HTMLBody = myBody & .HTMLBody End With
「To」プロパティ、「Subject」プロパティ、「HTMLBody」プロパティはそれぞれ、MailItemオブジェクトの送信先アドレス、件名、HTML本文を指定するプロパティです。同様に、「CC」プロパティや「BCC」プロパティなども存在しています。
もろもろの設定が完了したら、そのMailItemオブジェクトを下書きとして表示します。その処理を行うのが、「Display」メソッドです。
MailItemオブジェクト.Display
プロシージャ「Sub 日報メール作成()」では、Displayメソッドの後に、HTML本文を指定するHTMLBodyプロパティを指定しています。この順番に違和感を覚えるかもしれませんが、これは「既定の署名」を表示するためです。
Displayメソッドが実行されると、自動でHTML本文に既定の署名が呼び出される特性があります。しかし、HTMLBodyによりHTML本文に値が入った状態で、Displayメソッドを実行しても署名は反映されません。そのため、一度Displayメソッドを実行し、既定の署名をHTML本文に表示させてから、HTMLBodyでメール本文を挿入しています。
解説は以上です。再度、プロシージャ「Sub 日報メール作成()」の内容を確認しましょう。
- Sub 日報メール作成()
- 'レポート部分の生成
- Dim report As String: report = ""
- Dim i As Long: i = 2
- With Sheet2
- Do While .Cells(i, 1).Value <> ""
- report = report & .Cells(i, 1).Value & "/"
- report = report & .Cells(i, 2).Value & "/"
- report = report & .Cells(i, 3).Value & "<br>"
- i = i + 1
- Loop
- End With
- 'メールの各要素の生成
- With Sheet1
- Dim myTo As String: myTo = .Range("B2").Value
- Dim mySubject As String: mySubject = .Range("B3").Value
- Dim myBody As String: myBody = ""
- myBody = myBody & .Range("B4").Value & "<br>" '宛名"
- myBody = myBody & convertLf(.Range("B5").Value) & "<br>" '書き出し
- myBody = myBody & report 'レポート
- myBody = myBody & convertLf(.Range("B6").Value) '締め
- End With
- '下書き作成
- Dim olApp As Outlook.Application
- Set olApp = New Outlook.Application
- Dim myMail As MailItem
- Set myMail = olApp.CreateItem(olMailItem)
- With myMail
- .To = myTo
- .Subject = mySubject
- .Display
- .HTMLBody = myBody & .HTMLBody
- End With
- End Sub
今回は、Excel VBAで日報メールの下書き作成マクロを作成しました。1回当たりは小さな作業の効率化でも、毎日のように積み重なると大きな差を生み出します。ぜひ、活用してみてください。
次回は、日報メールの下書き作成マクロをGASで作成する方法を紹介します。
高橋宣成
プランノーツ 代表取締役
「ITを活用して日本の『働く』の価値を高める」をテーマに、ExcelやVBA、G Suite、Google Apps Script、クラウドなどによる企業または個人事業主向けのシステムおよびツールの開発やコンサルティング、セミナー講師などを務める。「IT×働き方」をテーマに運営するブログ「いつも隣にITのお仕事」は月間60万PV達成。
高橋宣成著 秀和システム 1800円(税別)
動くコードが書けたその先、つまり「ExcelVBAを実務で使う」という目的に特化した実践書。ExcelVBAを楽に効果的に使いこなし続けるための知恵と知識、そしてそのためのビジョンと踏み出す勇気を提供する1冊。
詳解! Google Apps Script完全入門 ~Google Apps & G Suiteの最新プログラミングガイド~
高橋宣成著 秀和システム 2600円(税別)
Google Apps Scriptの完全入門書として、JavaScriptの基本から自作ライブラリまでを徹底解説。これ一冊だけで基礎から実践まで体系的にマスターできます。
Copyright © ITmedia, Inc. All Rights Reserved.
Coding Edge 鬮ォ�ェ陋滂ソス�ス�コ闕オ譁溷クキ�ケ譎「�ス�ウ驛「�ァ�ス�ュ驛「譎「�ス�ウ驛「�ァ�ス�ー