メール作成をVBAで自動化して定型業務をちょっと効率化してみた

この記事は、[NTTコムウェア Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nttcomware) 23日目の記事です。

## はじめに

NTT コムウェア 2 年目社員の東です。
この記事では不定期で発生する周知メール作成業務をVBAで自動化したことについて書いていきます。
Excelさえあれば自動作成できますので、ツールのインストールができない環境でなんとか効率化したいということで悩んでいる方に一つの解決策として提示できれば幸いです。

## 自動化の経緯

弊社の業務端末はセキュリティ対策の一環で会社側で管理されたソフトウェア以外のインストールが禁止されています。
（開発の際は別端末を使用するので、必要なツールをインストールできるのですが、主にメール確認など開発以外の業務に使用している端末ではかなりしっかり会社側で統制されています。）
そのため、業務端末でJavaやPythonを使用して自動化ということができませんでした。
そこで思いついたのが**VBA**です。
ExcelなどOfficeが使える環境ならもちろんVBAでマクロを作ることは可能なはずなので、**「ソフトウェアがインストールできないなら、VBAを使えばいいじゃない」**
ということで何とかVBAを使ってメールの自動作成を達成することにしました。

今回はThunderbirdとExcel、VBAを使用してメールの自動作成マクロを実装していきます。

## 前提

私が今部署の周知担当者になっているため、不定期で以下のようなメールが送られてきます。
※もちろん実際のメールではないですが、雰囲気だけ伝わるようにしています。
※メール内に出てくる人物名は仮名です。実際の人物とは一切関係がありません。

```
各部署担当者　各位

〇〇部の山田です。
以下の内容について、職場の皆さんへの周知をお願いいたします。
ご協力よろしくお願いします。

======↓職場の皆様への周知事項↓：ここから======

職場の皆様へ

〇〇部の山田です。
職場の皆様に下記についてお知らせいたします。
（内容省略）

■本件問い合わせ先
　〇〇部　山田
　E-Mail： aaa@abc.jp

======↑職場の皆様への周知事項↑：ここまで======

以上、よろしくお願いします。

山田
```

この周知事項をコピペして以下のようなメールを私が職場の皆さんに対して送信します。

```
△△部の皆様

お世話になっております。
周知担当者の東です。


〇〇部より周知依頼がありましたので
以下に共有いたします。

---------------------- 

職場の皆様へ

〇〇部の山田です。
職場の皆様に下記についてお知らせいたします。
（内容省略）

■本件問い合わせ先
　〇〇部　山田
　E-Mail： aaa@abc.jp

東
```

## 実装
### VBAでThunderbirdの起動

まずはVBAを使ってThunderbirdを起動させましょう。
VBAからThunderbirdを起動するためには、Shell関数を使えばよいので、以下のプログラムでメール画面が立ち上がります。

```vb
Sub 周知メール自動作成()

Dim sPath As String

sPath = """C:\...(略)\thunderbird.exe"" -compose "
Shell sPath

End Sub
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2337371/7091c459-5511-d43d-ed7c-24a0fd385899.png)

これでまずはVBAからThunderbirdを立ち上げることができました。
コマンドプロンプトからThunderbirdを立ち上げるときと同じコマンドをVBAから叩いてあげればよいということですね。

### 宛先、件名、本文の追加

宛先と件名の追加についてもVBAを立ち上げたときと同じように、「コマンドプロンプトでThunderbirdを立ち上げる際に、宛先、件名、本文を入れるにはどうすればよいか」を考えます。

ではまず、宛先、件名、本文を入れながらThunderbirdを立ち上げるコマンドを見ていきましょう。
```powershell
C:\>"C:\...(略)\thunderbird.exe" -compose to="aaa@abc.jp",subject="件名",body="本文"
```
このようなコマンドを作ればいいことが分かりました。
では、これをVBAで作っていきます。

```vb
Sub 周知メール自動作成()

Dim sPath As String
Dim mailTo As String
Dim subject As String
Dim mailBody As String

sPath = """C:\...(略)\thunderbird.exe"" -compose "
mailTo = "aaa@abc.jp"
subject = "件名テスト"
mailBody = "本文テスト"

Shell sPath & "to=" & mailTo & ",subject=" & subject & ",body=" & mailBody

End Sub
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2337371/feec6724-d7d7-6946-4ef1-277326beab9e.png)
これで宛先、件名、本文を入れることでができるようになりました。

次に、ハードコーディングをやめてExcel側のセルの値を参照するようにしたいと思います。
Excelの方でこのような表を作っておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2337371/d67417ba-77c3-d64f-4316-5f5010152871.png)
これをVBAから参照するには、`Range("セル名").Value`を使えばよいので、下記のようにコードを変更するとExcelの値を参照して、メールを作成することができるようになります。
```vb
Sub 周知メール自動作成()

Dim sPath As String
Dim mailTo As String
Dim subject As String
Dim mailBody As String

sPath = """C:\...(略)\thunderbird.exe"" -compose "
mailTo = Range("B1").Value
subject = Range("B2").Value
mailBody = Range("B3").Value

Shell sPath & "to=" & mailTo & ",subject=" & subject & ",body=" & mailBody

End Sub
```

### 本文作成

メールを作成する準備は完了したので、続いて本文を作成していきます。
まず、メールの本文は1行ということはまずないので、数行に渡る本文を渡せるコマンドを作成する必要があります。
コマンドプロンプトでは`%0A`を改行として解釈してくれるので、改行文字を`%0A`に変換する処理を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2337371/26e1d45e-291a-edfe-7cdb-55fbcea5199a.png)
```vb
Sub 周知メール自動作成()

Dim sPath As String
Dim mailTo As String
Dim subject As String
Dim mailBody As String

sPath = """C:\...(略)\thunderbird.exe"" -compose "
mailTo = Range("B1").Value
subject = Range("B2").Value
mailBody = Range("B3").Value

mailBody = Replace(mailBody, vbLf, "%0A")

Shell sPath & "to=" & mailTo & ",subject=" & subject & ",body=" & mailBody

End Sub
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2337371/f945ebdf-7a0c-4a4c-7319-9c437fbf250c.png)

前提の章で提示した通り、作成したいメールは周知元のメールをそのまま送ればよい訳ではないので、必要な部分だけ抽出し、序文をつけていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2337371/d022755e-7ac6-e82b-5e6a-a209548a6f22.png)

```vb
Sub 周知メール自動作成()

Dim sPath As String
Dim mailTo As String
Dim subject As String
Dim preface As String
Dim mailBody As String

sPath = """C:\...(略)\thunderbird.exe"" -compose "
mailTo = Range("B1").Value
subject = Range("B2").Value
preface = Range("B3").Value
mailBody = Range("B4").Value

mailBody = Split(mailBody, "======↓職場の皆様への周知事項↓：ここから======")(1)
mailBody = Split(mailBody, "======↑職場の皆様への周知事項↑：ここまで======")(0)

mailBody = preface & mailBody
mailBody = Replace(mailBody, vbLf, "%0A")

Shell sPath & "to=" & mailTo & ",subject=" & subject & ",body=" & mailBody

End Sub

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2337371/fc374c90-7dcd-d22b-e57e-1d074df50dfb.png)

これで周知メール自動作成マクロが完成しました。
あとはこのマクロを適当な図に紐づけてシートにボタンを作ったら周知メール自動作成シートの完成です。

## おわりに

以上のようにメール作成業務を自動化しました。
さすがに周知対象のメールを受信したことを検知して自動的に周知メールを送信するところまでを自動化することはできませんでしたが、毎回自分が以前に送ったメールから序文をコピーしてきたり、周知対象の部分を手作業で抽出したりしなくてよくなっただけでも、効率的になったかなと思います。
このマクロについては、せっかく作ったので遺産として後輩に引き継いでいこうと思いますw

それではこの記事はここで締めたいと思います。
[NTTコムウェアのアドベントカレンダー](ttps://qiita.com/advent-calendar/2022/nttcomware)では他にもさまざまな記事を投稿しておりますので、ぜひ他の記事も見ていっていただけると幸いです。
最後まで読んでいただき、ありがとうございました。