【Outlook】VBAでメールから件名・送信者・日時をCSVに書き出す手順

【Outlook】VBAでメールから件名・送信者・日時をCSVに書き出す手順
🛡️ 超解決

Outlookで受信したメールの中から、必要な件名・送信者・日時だけを効率的に抽出したいと思ったことはありませんか。

手作業で一つずつコピー&ペーストしていては、大量のメールを処理する際に膨大な時間がかかります。

この記事では、OutlookのVBA(Visual Basic for Applications)を活用して、これらの情報を自動的にCSVファイルへ書き出す手順を詳しく解説します。

この方法をマスターすれば、メール管理の効率が劇的に向上します。

【要点】Outlookメールの基本情報をCSVへ自動抽出するVBA活用法

  • Outlook VBAマクロの作成: Outlookのメール情報をCSVファイルに書き出すためのVBAコードを記述・実行します。
  • メール情報の取得: 指定したフォルダ内のメールから、件名、送信者、受信日時を取得します。
  • CSVファイルへの出力: 取得したメール情報を、カンマ区切り(CSV形式)でファイルに保存します。

ADVERTISEMENT

Outlook VBAでメール情報をCSVに出力する仕組み

OutlookのVBAは、Outlookアプリケーション自体を操作するためのプログラミング言語です。これにより、メールの検索、閲覧、作成、そして情報の抽出といった様々な自動化が可能になります。

今回の目的は、特定のフォルダに格納されているメールから、件名、送信者(From)、受信日時といった基本的な情報を取得し、それをCSV(Comma Separated Values)形式のテキストファイルとして保存することです。CSV形式は、Excelなどの表計算ソフトで簡単に開けるため、データの整理や分析に非常に便利です。

VBAコードは、Outlookのオブジェクトモデルという仕組みを通じて、メールアイテムにアクセスします。具体的には、`Application`オブジェクトから`Session`、`Folders`、そして個々の`MailItem`オブジェクトへと階層的にたどることで、メールの各プロパティ(件名、送信者、受信日時など)を取得します。取得した情報は、ファイル操作用のオブジェクトを使って、指定したパスのCSVファイルに追記していく形で書き出されます。

お探しの解決策が見つからない場合は、こちらの「Teams/Outlookトラブル完全解決データベース」で他のエラー原因や解決策をチェックしてみてください。

Outlook VBAマクロでメール情報をCSVに書き出す手順

  1. VBAエディタを開く
    Outlookを開き、キーボードで「Alt」キーと「F11」キーを同時に押します。これにより、Visual Basic for Applicationsエディタ(VBAエディタ)が開きます。
  2. 標準モジュールを挿入する
    VBAエディタのメニューバーから「挿入」をクリックし、次に「標準モジュール」を選択します。これにより、コードを記述するための新しいモジュールが作成されます。
  3. VBAコードを記述する
    挿入されたモジュールウィンドウに、以下のVBAコードをコピー&ペーストします。コード内の「’」で始まる行はコメントであり、プログラムの動作には影響しません。必要に応じて、`fso`や`ts`といった変数名や、`strFolderPath`、`strFilePath`などのパスに関する部分を、ご自身の環境に合わせて変更してください。
Sub ExportMailInfoToCSV()

    Dim objOutlook As Outlook.Application
    Dim objNamespace As Outlook.Namespace
    Dim objFolder As Outlook.Folder
    Dim objMailItem As Outlook.MailItem
    Dim objFSO As Object ' FileSystemObject
    Dim objTS As Object ' TextStream
    Dim strFolderPath As String
    Dim strFilePath As String
    Dim strLine As String
    Dim i As Long

    ' --- 設定項目 --- 
    ' 情報を抽出したいOutlookフォルダのパスを指定します。
    ' 例: "インボクス" (受信トレイ)
    '     "インボクス\SubFolder" (インボクス内のSubFolder)
    strFolderPath = "インボクス"

    ' CSVファイルの出力先パスとファイル名を指定します。
    ' 例: "C:\Users\YourUsername\Documents\MailExport.csv"
    strFilePath = "C:\Users\YourUsername\Documents\MailExport.csv"
    ' --- 設定項目ここまで ---

    On Error GoTo ErrorHandler

    ' Outlookオブジェクトを取得
    Set objOutlook = Application
    Set objNamespace = objOutlook.GetNamespace("MAPI")

    ' 指定されたフォルダを取得
    On Error Resume Next ' フォルダが存在しない場合のエラーを回避
    Set objFolder = objNamespace.Folders(strFolderPath)
    If objFolder Is Nothing Then
        ' サブフォルダの場合の処理
        Dim folderParts() As String
        folderParts = Split(strFolderPath, "\")
        Set objFolder = objNamespace.Folders(folderParts(0))
        For i = 1 To UBound(folderParts)
            Set objFolder = objFolder.Folders(folderParts(i))
        Next i
    End If
    On Error GoTo ErrorHandler ' エラーハンドリングを元に戻す

    If objFolder Is Nothing Then
        MsgBox "指定されたフォルダが見つかりません: " & strFolderPath, vbCritical
        Exit Sub
    End If

    ' FileSystemObjectを作成
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    ' CSVファイルを開く(なければ新規作成、あれば追記)
    ' UTF-8エンコーディングで開くためにBOMを付与
    Set objTS = objFSO.OpenTextFile(strFilePath, 8, True, -1) ' 8 = ForWriting, 2 = TristateTrue (Unicode/UTF-8)

    ' CSVヘッダー行を書き込む(初回のみ)
    If objTS.Size = 0 Then
        objTS.WriteLine "件名,送信者,受信日時"
    End If

    ' フォルダ内のメールアイテムをループ処理
    For i = 1 To objFolder.Items.Count
        If TypeName(objFolder.Items(i)) = "MailItem" Then
            Set objMailItem = objFolder.Items(i)

            ' 各プロパティを取得
            Dim strSubject As String
            Dim strSenderName As String
            Dim strReceivedTime As String

            strSubject = objMailItem.Subject
            strSenderName = objMailItem.SenderName
            strReceivedTime = Format(objMailItem.ReceivedTime, "yyyy/mm/dd hh:nn:ss") ' 日時フォーマット指定

            ' CSV形式の行を作成(ダブルクォーテーションで囲む)
            ' 件名や送信者名にカンマが含まれる場合を考慮
            strLine = """" & strSubject & "","""" & strSenderName & "","""" & strReceivedTime & """

            ' CSVファイルに書き込む
            objTS.WriteLine strLine
        End If
    Next i

    ' リソースを解放
    objTS.Close
    Set objTS = Nothing
    Set objFSO = Nothing
    Set objMailItem = Nothing
    Set objFolder = Nothing
    Set objNamespace = Nothing
    Set objOutlook = Nothing

    MsgBox "メール情報のCSVエクスポートが完了しました。", vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
    If Not objTS Is Nothing Then
        If objTS.AtEndOfStream = False Then objTS.Close
    End If
    Set objTS = Nothing
    Set objFSO = Nothing
    Set objMailItem = Nothing
    Set objFolder = Nothing
    Set objNamespace = Nothing
    Set objOutlook = Nothing

End Sub
  1. コードのカスタマイズ
    上記のコード内の以下の部分を、ご自身の環境に合わせて修正してください。
    • `strFolderPath = “インボクス”`: 抽出したいメールが格納されているOutlookフォルダ名を指定します。受信トレイの場合は「インボクス」、送信済みアイテムの場合は「送信済みアイテム」など、正確なフォルダ名を入力してください。サブフォルダを指定する場合は、パス区切り文字としてバックスラッシュ(\)を使用します(例: “インボクス\特定フォルダ”)。
    • `strFilePath = “C:\Users\YourUsername\Documents\MailExport.csv”`: CSVファイルを作成・保存する場所とファイル名を指定します。指定したパスにフォルダが存在しない場合はエラーになりますので、事前にフォルダを作成しておいてください。ファイル名は任意で変更可能です。
  2. マクロの実行
    VBAエディタのメニューバーから「実行」をクリックし、「Sub/ユーザーフォームの実行」を選択します。または、コードウィンドウ内でカーソルをマクロコード内に置き、「F5」キーを押します。マクロが正常に実行されると、指定したフォルダからメール情報が抽出され、指定したCSVファイルに書き込まれます。完了メッセージが表示されたら、指定した場所にCSVファイルが作成されているか確認してください。

CSVファイルへの出力における注意点とトラブルシューティング

CSVファイルが文字化けしてしまう場合

CSVファイルを開いたときに文字化けが発生する場合、エンコーディングの問題が考えられます。上記のコードではUTF-8エンコーディングで出力するように設定していますが、Excelのバージョンや設定によっては正しく解釈されないことがあります。

対処法:

  1. Excelで開く際にエンコーディングを指定する
    ExcelでCSVファイルを開く場合、「ファイル」タブ → 「開く」 → 「参照」からCSVファイルを選択します。ファイル選択ダイアログの右下にある「ファイルの種類」で「テキストファイル」を選択し、CSVファイルを選びます。すると「テキストファイルのインポート」ウィザードが表示されるので、「ファイルの種類」で「Unicode (UTF-8)」を選択してインポートを完了させます。
  2. VBAコードのエンコーディングを変更する
    VBAコード内の`OpenTextFile`メソッドの引数を変更し、Shift_JISなどで出力するように変更することも可能です。ただし、UTF-8の方が互換性が高い場合が多いです。`Set objTS = objFSO.OpenTextFile(strFilePath, 8, True, -1)` の `-1` を `0` (ANSI/Shift_JIS) に変更するとShift_JISで出力されます。

指定したフォルダのメールが抽出されない場合

指定したフォルダパスが間違っているか、フォルダが存在しない可能性があります。また、Outlookのデータファイル(.pstまたは.ost)が破損している場合も、正常にメールアイテムを取得できないことがあります。

対処法:

  1. フォルダパスの確認
    Outlookで、VBAコードに記述したフォルダ名が正確であるか再確認してください。特にサブフォルダを指定する場合は、バックスラッシュ(\)で正しく区切られているか確認が必要です。
  2. Outlookのデータファイル修復
    Outlookのデータファイルが破損している場合は、受信トレイ修復ツール(SCANPST.EXE)を使用して修復を試みてください。このツールはOutlookのインストールフォルダ内にあります。
  3. 別のフォルダで試す
    一時的な問題か確認するため、受信トレイなど、確実にメールが存在する別のフォルダでマクロを実行してみてください。

件名や送信者名にカンマが含まれる場合の表示崩れ

CSVファイルでは、各項目がカンマ(,)で区切られます。もしメールの件名や送信者名にカンマが含まれていると、CSVファイルを開いた際に意図しない列にデータが入ってしまうことがあります。

対処法:

  1. ダブルクォーテーションによる囲み
    上記のVBAコードでは、`strLine = “””” & strSubject & “”,”””” & strSenderName & “”,”””” & strReceivedTime & “””
    ` の部分で、各項目をダブルクォーテーション(“)で囲んでいます。これにより、項目内にカンマが含まれていても、CSVファイルとして正しく解釈されるようになります。この部分は、CSVの標準的な仕様に則った処理です。
  2. Excelでの区切り文字変更
    もしExcelで開いた際に問題が発生した場合は、Excelの「データ」タブにある「区切り位置」機能を使って、カンマ区切りではなく、ダブルクォーテーションで囲まれたテキストとして再解析することも可能です。

マクロのセキュリティ設定について

OutlookやOfficeアプリケーションでは、セキュリティのためにマクロの実行が制限されている場合があります。マクロが実行されない場合は、セキュリティ設定を確認する必要があります。

対処法:

  1. Outlookのセキュリティセンター設定
    「ファイル」タブ → 「オプション」 → 「セキュリティセンター」 → 「セキュリティセンターの設定」を開きます。「マクロの設定」で、「すべてのマクロを無効にする(通知あり)」または「すべてのマクロを無効にする(推奨)」以外を選択し、マクロの実行を許可する設定に変更してください。ただし、セキュリティリスクを伴うため、信頼できるソースからのマクロのみを実行するように注意が必要です。

ADVERTISEMENT

新しいOutlook(プレビュー版)でのVBA利用について

現在、Microsoftは新しいOutlook(プレビュー版)を提供しており、従来のOutlookとは一部インターフェースや機能が異なります。新しいOutlookでは、従来のVBAマクロがそのまま動作しない可能性があります。

新しいOutlookで同様の自動化を行いたい場合は、OfficeスクリプトやPower Automateなどの、よりモダンな自動化ソリューションの利用が推奨されます。これらのツールは、Webベースで動作し、より広範なアプリケーションとの連携が可能です。

ただし、新しいOutlookの提供状況や機能は変更される可能性があるため、最新の情報はMicrosoftの公式ドキュメントをご確認ください。

まとめ

この記事では、Outlook VBAを使用して、メールから件名、送信者、受信日時といった情報を抽出し、CSVファイルに自動で書き出す手順を解説しました。

このVBAマクロを活用することで、手作業によるメール情報の整理にかかる時間を大幅に削減できます。

今後は、抽出する情報を「本文の冒頭部分」や「添付ファイルの有無」などに拡張したり、特定の条件(例: 特定の送信者からのメールのみ)で抽出するようコードを改変したりすることも可能です。ぜひ、ご自身の業務に合わせてカスタマイズしてみてください。

👥
Teams/Outlookトラブル完全解決データベース サインイン、接続エラー、メール送受信の不具合など、特有のトラブル解決策を網羅。困った時の逆引きに活用してください。

ADVERTISEMENT

この記事の監修者
🌐

超解決 リモートワーク研究班

Microsoft 365の導入・保守を専門とするエンジニアグループ。通信障害やサインイン不具合など、ビジネスインフラのトラブル対応に精通しています。