情シス仕事の備忘録

自身の備忘録を兼ねて、情シス仕事で役に立ちそうな情報を掲載しています

Outlook VBA メールのExcelファイル一覧出力

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ファイルへの一覧出力の必要性が生じた際の参考になれば幸いです。