Outlook VBAを使用して、指定したフォルダ下にあるOutlookメールをExcelファイルに一覧出力する方法を紹介します。
・操作環境(※):
・OS:Windows 11
・メールアプリ:デスクトップ版Outlook(classic)
・使用プラン:Microsoft 365 Business Premium(※)
※ExcelとOutlookが使用できれば、上記プランでなくても問題ありません
OutlookでVBAを使用できるようにする
Outlookで初めてVBAを使用する場合、ExcelでVBAを使用できるようにする設定とほぼ同じ作業が必要となります。
スタートメニューから[Outlook(classic)]を選択し、これを起動します。
アプリが起動したら、上メニューの[ファイル]を選択します。
左下の[オプション]を選択します。
左メニューの[トラストセンター]を選択し、[トラストセンターの設定]を選択します。
左メニューの[マクロの設定]を選択し、ラジオボタンの下二つのどちらかを選択し、[OK]を選択します。
前の画面に戻り、左メニューの[リボンのユーザー設定]を選択し、メインタブの[開発]にチェックをつけ、[OK]を選択します。
画面右上の[←]を選択し、メールの一覧画面に遷移します。
上メニューの[開発]を選択し、[Visual Basic]を選択します。
上メニューの[ツール>参照設定]を選択します。
[Microsoft Outlook 16.0 Object Library]にチェックがついていない場合はチェックをつけ、[OK]を選択します(はじめからチェックがついていればそのままで問題ありません)。
Outlook VBAでメールのExcelファイル一覧出力を実装する
プロジェクトツリーのThisOutlookSession直下にスクリプトを実装します。
Excelファイル一覧出力のプロシージャのソースです。ポイント事項は以下の通りです。
- 出力対象は選択したフォルダーとする(Set mail_folder = ・・・)。
- 1件のメール内に添付ファイルが複数ある場合を考慮し、添付ファイル名はカンマ区切りの文字列で出力している。
- 送信先(To,CC,BCC)は表示名だけでなく、アドレス情報があればそれも出力している。また、送信先は種類別(To,CC,BCC)に出力している。
- Excelファイルのパスとファイル名はシンプルにC:\temp\mail_list.xlsxとし、出力後は保存して閉じている。
Sub make_mail_list()
On Error GoTo error_step:
'変数の定義
Dim cnt_col As Long
Dim cnt_mail As Long
Dim cnt_file As Long
Dim app As Object
Dim wb As Object
Dim ws As Object
Dim mail_folder As Object
Dim mail_item As Object
Dim mail_rec As Object
Dim tmp_file_name As String
Dim tmp_send_name As String
Dim tmp_to As String
Dim tmp_cc As String
Dim tmp_bcc As String
Dim array_name As Variant
'出力先ワークシートの設定
Set app = CreateObject("Excel.Application")
Set wb = app.Workbooks.Add()
Set ws = wb.sheets(1)
'出力項目のタイトル行設定
array_name = Array("mail_no", "send", "to", "cc", "bcc", _
"subject", "content", "received_date", "is_sent", "attachments")
'タイトル行出力
For cnt_col = 0 To UBound(array_name)
ws.cells(1, cnt_col + 1) = array_name(cnt_col)
Next cnt_col
'出力元メールフォルダーの設定
Set mail_folder = Outlook.Application.Session.PickFolder
'各メールの処理
For Each mail_item In mail_folder.Items
cnt_file = 0
tmp_file_name = ""
tmp_send_name = ""
tmp_to = ""
tmp_cc = ""
tmp_bcc = ""
'添付ファイルの処理(複数考慮)
If mail_item.Attachments.Count >= 1 Then
For cnt_file = 1 To mail_item.Attachments.Count
If cnt_file > 1 Then
tmp_file_name = tmp_file_name & ","
End If
tmp_file_name = tmp_file_name & mail_item.Attachments.Item(cnt_file)
Next cnt_file
End If
'送信先の処理
For Each mail_rec In mail_item.Recipients
'アドレスがあればアドレスも取得
With mail_rec
If .Address = .Name Then
tmp_send_name = .Name
Else
tmp_send_name = .Name & "<" & .Address & ">"
End If
'送信先種類に応じて出力項目を振り分け
If .Type = olTo Then
tmp_to = tmp_to & tmp_send_name & ";"
ElseIf .Type = olCC Then
tmp_cc = tmp_cc & tmp_send_name & ";"
ElseIf .Type = olBCC Then
tmp_bcc = tmp_bcc & tmp_send_name & ";"
End If
End With
Next
'メール内容出力
ws.cells(cnt_mail + 2, 1) = cnt_mail + 1
ws.cells(cnt_mail + 2, 2) = mail_item.SenderName & _
"<" & mail_item.SenderEmailAddress & ">"
ws.cells(cnt_mail + 2, 3) = tmp_to
ws.cells(cnt_mail + 2, 4) = tmp_cc
ws.cells(cnt_mail + 2, 5) = tmp_bcc
ws.cells(cnt_mail + 2, 6) = mail_item.Subject
ws.cells(cnt_mail + 2, 7) = mail_item.Body
ws.cells(cnt_mail + 2, 8) = mail_item.ReceivedTime
ws.cells(cnt_mail + 2, 9) = mail_item.Sent
ws.cells(cnt_mail + 2, 10) = tmp_file_name
cnt_mail = cnt_mail + 1
Next
'ファイル保存・完了通知
wb.SaveAs "C:\temp\mail_list.xlsx"
wb.Close
MsgBox "メール一覧作成が完了しました"
end_step:
Set mail_rec = Nothing
Set mail_item = Nothing
Set mail_folder = Nothing
Set ws = Nothing
Set wb = Nothing
Set app = Nothing
Exit Sub
error_step:
MsgBox "エラーが発生しました。エラーNo:" & _
Err.Number & ", エラー詳細:" & Err.Description
GoTo end_step
End Sub
以下は参考情報です。
※Outlook VBAに関する公式記事:
Outlook Visual Basic for Applications (VBA) リファレンス | Microsoft Learn
実装したOutlook VBAの動作確認を行う
メールの一覧画面に戻り、上メニューの[開発]を選択し、[マクロ]を選択し、前の工程で実装したプロシージャを選択します。
出力対象のフォルダーを選択し(この例ではinvoiceフォルダー)、[OK]を選択します。
出力が完了すると、ダイアログが表示されますので、[OK]を選択します。
エクスプローラーよりExcelファイルの出力先フォルダーにアクセスし、出力されたExcelファイルを起動します。
Excelファイル内にメールの内容が一覧化されています。
※分かりやすいようセルの幅等を別途微調整しています。ユーザー向けにこのVBAを提供するなら、VBA内で見栄えの調整も実装しておくと良いと思います
おわりに
デスクトップ版Outlookアプリ(classic)からの利用になってしまいますが、Outlook VBAを使用したメールのExcelファイルへの一覧出力のご紹介でした。
Outlookメールのデータファイル(pstファイル)を同アプリ上で追加すれば、今回のVBAによりこのpstファイル内のメールもExcel出力できます。
以前の記事で、Microsoft社のコンプライアンス管理サービス「Microsoft Purview」を使用したメールの情報開示の方法を紹介しました。当然、情報開示用に取得したpstファイルに対しても今回のVBAが使用できます。
メールのExcelファイルへの一覧出力の必要性が生じた際の参考になれば幸いです。