ExcelVBAでOutlookメールを自動化!【サンプルダウンロード可】

2019-08-25

腰の重たい、面倒くさがりのみなさん。
メール、自動化しませんか?

あなたの業務に、毎日同じようなメールを作成しなければならない作業はありませんか?

僕には毎日日報をメールで送らなければいけない作業がありました。
それは、その日一日の業務内容をメールにまとめて、Outlookで上司に送信するだけの簡単なお仕事でした。

しかし僕は思いました。
壮絶に面倒くさい!!、と。

もちろん、中には同じ作業の繰り返しを苦にしない方もいるでしょう。
そんな方がこの記事を目にすることがあるのかはわかりませんが、うっかりこんな記事に迷い込んでしまうこともあるでしょう。

勤勉は美徳です。
では、この記事を閉じて日々のルーティン業務にお戻りくださいませ。

ここから先は、面倒くさがりの面倒くさがりによる面倒くさがりのための、メール自動化の方法についての解説記事です。
我こそは、という方は先にお進みくださいませ・・・。

サンプルファイルダウンロードはこちらから!

もくじ

  1. ああ、面倒なメール作成
  2. メール自動化計画
  3. Outlookメール自動化の準備
  4. OutlookメールをVBAで作成する
  5. Excelマクロをアプリケーション風に使う
  6. まとめ
  7. コード全文

ああ、面倒なメール作成

さて、ここまで来られた皆さんはきっと、ちょっとした作業すら面倒でしかたのない方々なのでしょう。

非常によくわかります。

確かに勤勉は美徳です。
しかし、現代でもっとも評価されるのは、まじめで勤勉な人間ではなく、同じ作業をより短時間でできる人間です。

メールの自動化の仕組みは、エンジニアでない方でも案外簡単に作成することができます。
前置きはこのくらいにして、さっそくその方法をお教えします。

メール自動化計画

メールの自動化を行う方法はいくつかあります。

以下はその特徴とメリットをまとめたものになります。

メールの自動化方法メリットデメリット学習難易度
VBAでOutlook自動化Officeがあれば使えるOutlookでしか使えない
PythonやC#などによるプログラミングGmailなども自動化できる 業務PCで使えない場合がある
IFTTTなどの自動化ツール複数サービスの連携が簡単 業務PCで使えない場合がある

上で例に挙げた3つのうち、自分でプログラミングをすることやIFTTT連携を行うことは、一般的な日本企業では難しいケースも多いでしょう。
日本企業の多くはセキュリティ上、規定外のツールやアプリケーションの使用が制限されていたり、そもそもネットにつながってないなんて場合もあるからです。

ですが、日本の会社の大半は、MicrosoftのOfficeを導入しています。
業務でExcel、Outlookを使っていないという会社はむしろ少ないのではないでしょうか?

VBA自動化であれば、Officeさえあれば他のツールも、インターネット接続もいりません。
確実にあなたの業務を自動化できます。

では、さっそく、VBAでメールを自動化する方法を見ていきましょう。

Outlookメール自動化の準備

まず、VBAでOutlookを操作するには、Outlookオブジェクトを有効にする必要があります。

Excelの開発タブからVisualBasicを開き、[ツール]→[参照設定]の順に開きます。

そこで、下の画像のようにMicrosoft Outlook 16.0 Object Libraryを有効にしたら準備は完了です!

OutlookメールをVBAで作成する

では、順番にコードを見ていきます。
コードの全文は一番最後に貼りますね。

まずは標準モジュールを開き、Sub関数で、マクロを作成しています。

Sub 日報メール作成()
	'メールの各要素の生成
	formtext = UserForm1.TextBox1.Value

この、UserForm1.TextBox1.Valueというのは、VBAユーザーフォームで作成したメールの入力フォームのことです。
ユーザーフォームオブジェクトには好きな名前をつけられます。

.valueで、入力された文字列を取得して、formtextという変数に格納しています。

次はこちらの部分ですね。
まず、Withのセンテンスでメールの送信先などの情報を記載したSheet2というシートを開きます。

With Sheet2
    Dim myTo As String: myTo = .Range("B3").Value
    Dim mySubject As String: mySubject = .Range("B4").Value
    Dim myBody As String: myBody = ""
    myBody = .Range("B5").Value & vbCr & .Range("C5").Value & vbCr & .Range("D5").Value & vbCr & vbCr
    myBody = myBody & formtext & vbCr & vbCr
    myBody = myBody & .Range("B6").Value & vbCr & .Range("C6").Value
End With

そして、シート内の書くセルから、必要な情報を抜き出して変数に格納していきます。
詳しくは、こちらのマクロファイルをダウンロードできますので、直接ご確認いただければと思います。

ちなみに、ちょいちょい出てくるvbCrという文字列は、改行を意味します。
これを&で文字列に連結することで、VBA上で改行を表現できます。

最終的に、メールの全文はmyBodyという変数に格納されました。

最後に、Outlookのメール形式に変換して、メールの下書きまで作成しましょう。
完全に自動で送信まですることも可能ですが、僕は誤送信が怖かったので下書きまでにしておきました。

'下書き作成
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
    .Body = myBody & .Body
myMail.Body = strstyle & myMail.Body
End With

Excelマクロをアプリケーション風に使う

さて、上記のコードだけでもメール自動化ツールとしては使えますが、どうせならアプリケーションっぽくしたいですよね。
Excelファイルを開くと同時にユーザーフォームを立ち上げ、Excelシートを非表示にすることによって、アプリケーションっぽい使用感になります。

以下のコードで実装できます。

Auto_Open関数は、ファイルの起動時に読み込まれます。

ちなみに、Application.DisplayAlerts = Falseの一文で、閉じる際の「保存しますか?」というアラートも非表示にしてます。
邪魔ですもんね、あれ笑

Sub Auto_Open()
  UserForm1.Show
  Application.DisplayAlerts = False
End Sub

まとめ

今回はOutlookをVBAで自動化してみました。
作成して思ったこととしては、やっぱPythonで書いたほうが楽だなー、ってことでした。

VBAってすごく便利で、僕もよく使ってます。
何がいいって、PCをほとんど使えない人でも多少は使い方がわかるのがExcelなんですよね。

ほんとに、Microsoftの誰でも使えるUIを作る力はすごいなと思います。

Excelがこれだけ普及してる世の中なので、VBAでツールを作ると、PCをまともに使えない人にも配布することができます。
また、アプリケーションのインストールやネット通信が禁止されている企業でも使えるケースが多いです。

なので、VBAがもっと開発しやすい言語だったらな、と素人ながらしばしば感じてきました。

そんな折、MicrosoftはOffice2019から、VBAの代わりにPythonを導入する方針という噂を耳にしました。
もしも本当に実現するなら非常に楽しみですね。

Officeのエコシステムがさらに発展しそうです。

コード全文

サンプルファイルダウンロードはこちらから!

Sub 日報メール作成()
	'メールの各要素の生成
	formtext = UserForm1.TextBox1.Value
	With Sheet2
	    Dim myTo As String: myTo = .Range("B3").Value
	    Dim mySubject As String: mySubject = .Range("B4").Value
	    Dim myBody As String: myBody = ""
	    myBody = .Range("B5").Value & vbCr & .Range("C5").Value & vbCr & .Range("D5").Value & vbCr & vbCr
	    myBody = myBody & formtext & vbCr & vbCr
	    myBody = myBody & .Range("B6").Value & vbCr & .Range("C6").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
	    .Body = myBody & .Body
	myMail.Body = strstyle & myMail.Body
	End With
End Sub