Outlookで受信したメールを自動でExcelに一覧化するVBAマクロ

Outlookで受信したメールを自動でExcelに一覧化するVBAマクロ

こんな人にオススメの記事です

  • Outlookで受信したメールをExcelで一覧化したい人
  • メールの管理を効率化したい人
  • 業務効率化のためにマクロを学びたい人

日々、受信トレイに積み重なる顧客からの問い合わせ、取引先の連絡、社内からの依頼メール。
その中から必要な情報を探し出すのに手間がかかり、肝心の業務がおろそかになっていませんか。

メールが増えるほど、検索や整理に時間を取られてしまい、迅速な対応や的確な判断が難しくなるのは、多くの職場で共通する悩みです。

そこで役立つのが、Outlookメールを自動でExcelに一覧化するVBAマクロです。
これを導入すれば、クリック1つで件名・送信者・宛先・受信日時・本文といった情報がExcel形式で表示されます。

Excel上であれば、顧客名や案件キーワードで即座にフィルタして必要なメールを抽出したり、受信日時順に並べ替えて対応漏れを防いだりと、柔軟な操作が簡単です。

Outlookで受信したメールの添付ファイルを自動保存するマクロ組み合わせればもっと便利になります。

目次

準備するものと基本の流れ

このVBAマクロを活用するには、Windows版のOutlookとExcelが入ったPC環境があれば十分です。
特別な開発ツールは不要です。以下の手順に沿って設定することですぐに利用可能です。

  1. 「開発」タブをクリックしてVisual Basicを開く
  2. 指定したコードを貼り付けて、✕をクリックしてVisual Basicを閉じる
  3. 「ファイル」→「名前を付けて保存」をクリックして、ファイルの種類で「Excelマクロ有効ブック(.xlsm)」を選択して保存
  4. 「開発」タブから「マクロの表示」をクリックし「Outlookのメール一覧取得」を選択して「実行」をクリック
  5. 「処理が完了しました。」と表示されたら「OK」をクリック
  6. ExcelにOutlookのメールが一覧で表示されていることを確認する

マクロを有効にするため、Excelファイルを「マクロ有効ブック(.xlsm)」で保存しておくことがポイントです。

ここからは、Excelブックを用意してマクロを実行するまでの流れを、実際の画面を使いながらわかりやすく解説していきます。

STEP
Excelの「開発」タブをクリック

Excelを起動し、「開発」タブをクリックしてください。

Excelに「開発」タブが表示されていない場合は、こちらのExcelでマクロやフォームを作成するための開発タブを追加する方法を参考に「開発」タブを表示させてください。

Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step1 Excelの「開発」タブをクリック
Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step1 Excelの「開発」タブをクリック
STEP
「Visual Basic」をクリック

次に、「開発」タブの中にある「Visual Basic」をクリックしてください。

Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step2 「Visual Basic」をクリック
Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step2 「Visual Basic」をクリック
STEP
「This Workbook」をクリック

「Visual Basic」をクリックしたら、左上の枠の中にある「This Workbook」をクリックしてください。

「This Workbook」をクリックすると、以下の画像のように右側が真っ白な状態になります。

Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step3 「This Workbook」をクリック
Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step3 「This Workbook」をクリック
STEP
コードを貼り付けて右上の「✕」をクリック

右側の真っ白なところに、以下のコードを貼り付けてください。

貼り付け終わったら右上の「✕」をクリックしてください。

Option Explicit

'-----------------------------------------
' このマクロは、Outlookから指定のフォルダ内のメールおよび開封通知(ReportItem)を取得し、
' Excelシートに一覧として蓄積します。
'
' 【主な特徴】
' - ユーザーが事前に指定したアカウント名とフォルダ名に基づいてメールを取得
' - すでに取得済み(EntryIDで判断)のメールは重複して取得しない
' - メール取得後、受信日時(またはReportItemの場合CreationTime)でソート
' - メールの本文はテキスト形式(Body)で取得
' - シート「メール一覧」にデータを蓄積
'
' ※実行前にOutlookを起動し、Excelは「メール一覧.xlsm」などマクロ有効ブックで本コードを保存しておくと便利です。
'-----------------------------------------

Sub Outlookのメール一覧取得()

    '===============================
    '【ユーザー指定項目:ここを事前設定してください】
    '===============================
    ' 特定のアカウント名でメールを絞りたい場合に記入
    '  例: "example@domain.com" あるいは Outlookに表示されているアカウント表示名
    ' 空欄の場合、全てのアカウントを対象とします。
    Const TARGET_ACCOUNT_NAME As String = ""
    
    ' 出力先シート名(このブック内に存在するか、新規作成します)
    Const OUTPUT_SHEET_NAME As String = "メール一覧"

    ' 取得したいOutlookフォルダパス
    ' 例1: "Inbox" → 受信トレイ
    ' 例2: "Sent Items" → 送信済みアイテム
    ' 例3: "Inbox\Processed" → 受信トレイ配下にある"Processed"フォルダ
    ' 空欄の場合は既定の受信トレイが対象になります
    Const TARGET_FOLDER_PATH As String = "Inbox"
    '===============================
    '【ここまでユーザー指定項目】
    '===============================

    Dim OutlookApp As Object        ' Outlook.Applicationを遅延バインディングで取得
    Dim OutlookNS As Object         ' Outlook.Namespace
    Dim st As Object                ' Outlook.Store
    Dim targetFolder As Object      ' 取得対象のフォルダ
    Dim itm As Object               ' 各アイテム(MailItem/ReportItem)
    Dim mailItem As Object          ' MailItem専用
    Dim reportItem As Object        ' ReportItem専用
    Dim wb As Workbook              ' 本ブック
    Dim ws As Worksheet             ' 出力先シート
    Dim lastRow As Long             ' データ書き込み先行
    Dim attachmentsList As String   ' 添付ファイル一覧文字列
    Dim existingIDs As Object       ' EntryID重複チェック用Dictionary
    Dim r As Long, idCheckRow As Long
    Dim j As Long

    Set wb = ThisWorkbook

    ' シート取得または作成
    On Error Resume Next
    Set ws = wb.Sheets(OUTPUT_SHEET_NAME)
    On Error GoTo 0
    If ws Is Nothing Then
        Set ws = wb.Worksheets.Add
        ws.Name = OUTPUT_SHEET_NAME
    End If

    ' 最終行取得
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    If lastRow < 1 Then lastRow = 1

    ' ヘッダー設定
    ws.Cells(1, 1).Value = "アカウント名"
    ws.Cells(1, 2).Value = "送信者表示名"
    ws.Cells(1, 3).Value = "送信者メールアドレス"
    ws.Cells(1, 4).Value = "宛先"
    ws.Cells(1, 5).Value = "CC"
    ws.Cells(1, 6).Value = "件名"
    ws.Cells(1, 7).Value = "本文(テキスト形式)"
    ws.Cells(1, 8).Value = "添付ファイル名"
    ws.Cells(1, 9).Value = "受信日時相当"
    ws.Cells(1, 10).Value = "EntryID"

    ' 既存EntryID取得
    Set existingIDs = CreateObject("Scripting.Dictionary")
    For idCheckRow = 2 To lastRow
        If Not IsEmpty(ws.Cells(idCheckRow, 10).Value) Then
            existingIDs(ws.Cells(idCheckRow, 10).Value) = True
        End If
    Next idCheckRow

    ' Outlook起動
    Set OutlookApp = CreateObject("Outlook.Application")
    Set OutlookNS = OutlookApp.GetNamespace("MAPI")

    ' 指定フォルダ取得
    Set targetFolder = GetOutlookFolder(OutlookNS, TARGET_ACCOUNT_NAME, TARGET_FOLDER_PATH)
    If targetFolder Is Nothing Then
        MsgBox "指定したフォルダが見つかりませんでした。" & vbCrLf & _
               "アカウント名やフォルダ名を再確認してください。", vbExclamation
        GoTo Cleanup
    End If

    ' アイテム列挙
    For Each itm In targetFolder.Items
        Select Case TypeName(itm)
            Case "MailItem"
                Set mailItem = itm
                If existingIDs.Exists(mailItem.EntryID) Then GoTo NextItem

                Dim mSenderName As String, mSenderEmail As String
                mSenderName = mailItem.SenderName
                mSenderEmail = mailItem.SenderEmailAddress

                ' 本文はテキスト形式
                Dim mailBody As String
                On Error Resume Next
                mailBody = mailItem.Body
                On Error GoTo 0

                ' 添付ファイル名取得
                attachmentsList = ""
                If mailItem.Attachments.Count > 0 Then
                    For j = 1 To mailItem.Attachments.Count
                        attachmentsList = attachmentsList & mailItem.Attachments(j).FileName & "; "
                    Next j
                    If Right(attachmentsList, 2) = "; " Then
                        attachmentsList = Left(attachmentsList, Len(attachmentsList) - 2)
                    End If
                End If

                lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
                ws.Cells(lastRow, 1).Value = targetFolder.Store.DisplayName
                ws.Cells(lastRow, 2).Value = mSenderName
                ws.Cells(lastRow, 3).Value = mSenderEmail
                ws.Cells(lastRow, 4).Value = mailItem.To
                ws.Cells(lastRow, 5).Value = mailItem.CC
                ws.Cells(lastRow, 6).Value = mailItem.Subject
                ws.Cells(lastRow, 7).Value = mailBody
                ws.Cells(lastRow, 8).Value = attachmentsList
                ws.Cells(lastRow, 9).Value = mailItem.ReceivedTime
                ws.Cells(lastRow, 10).Value = mailItem.EntryID

                existingIDs(mailItem.EntryID) = True

            Case "ReportItem"
                Set reportItem = itm
                If existingIDs.Exists(reportItem.EntryID) Then GoTo NextItem

                attachmentsList = ""
                If reportItem.Attachments.Count > 0 Then
                    For j = 1 To reportItem.Attachments.Count
                        attachmentsList = attachmentsList & reportItem.Attachments(j).FileName & "; "
                    Next j
                    If Right(attachmentsList, 2) = "; " Then
                        attachmentsList = Left(attachmentsList, Len(attachmentsList) - 2)
                    End If
                End If

                lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
                ws.Cells(lastRow, 1).Value = targetFolder.Store.DisplayName
                ws.Cells(lastRow, 2).Value = ""
                ws.Cells(lastRow, 3).Value = ""
                ws.Cells(lastRow, 4).Value = ""
                ws.Cells(lastRow, 5).Value = ""
                ws.Cells(lastRow, 6).Value = reportItem.Subject
                ws.Cells(lastRow, 7).Value = ""
                ws.Cells(lastRow, 8).Value = attachmentsList
                ws.Cells(lastRow, 9).Value = reportItem.CreationTime
                ws.Cells(lastRow, 10).Value = reportItem.EntryID

                existingIDs(reportItem.EntryID) = True

            Case Else
                ' その他は無視
        End Select
NextItem:
    Next itm

    ' ソート(受信日時相当:9列目)
    Dim lastDataRow As Long
    lastDataRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    If lastDataRow > 1 Then
        ws.Sort.SortFields.Clear
        ws.Sort.SortFields.Add Key:=ws.Range("I2:I" & lastDataRow), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ws.Sort
            .SetRange ws.Range("A1:J" & lastDataRow)
            .Header = xlYes
            .Apply
        End With
    End If

    ' 保存
    wb.Save

    MsgBox "処理が完了しました。指定フォルダ(" & TARGET_FOLDER_PATH & ")からメールを取得・一覧化しました。", vbInformation

Cleanup:
    Set reportItem = Nothing
    Set mailItem = Nothing
    Set targetFolder = Nothing
    Set OutlookNS = Nothing
    Set OutlookApp = Nothing
    Set ws = Nothing
    Set wb = Nothing
    Set existingIDs = Nothing
End Sub

Private Function GetOutlookFolder(ByVal oNS As Object, ByVal accountName As String, ByVal folderPath As String) As Object
    Dim st As Object
    Dim f As Object
    Dim subFolders() As String
    Dim i As Long

    If folderPath = "" Then
        ' フォルダパスが空ならデフォルト受信トレイ
        For Each st In oNS.Stores
            If accountName = "" Or InStr(st.DisplayName, accountName) > 0 Then
                On Error Resume Next
                Set f = st.GetDefaultFolder(6) ' 6 = olFolderInbox
                On Error GoTo 0
                If Not f Is Nothing Then
                    Set GetOutlookFolder = f
                    Exit Function
                End If
            End If
        Next st
        Exit Function
    End If

    subFolders = Split(folderPath, "\")

    For Each st In oNS.Stores
        If accountName = "" Or InStr(st.DisplayName, accountName) > 0 Then
            If subFolders(0) = "Inbox" Then
                On Error Resume Next
                Set f = st.GetDefaultFolder(6) ' Inbox
                On Error GoTo 0
            ElseIf subFolders(0) = "Sent Items" Then
                On Error Resume Next
                Set f = st.GetDefaultFolder(5) ' Sent Items
                On Error GoTo 0
            Else
                Set f = GetFolderByName(st, subFolders(0))
            End If

            If f Is Nothing Then GoTo NextStore

            For i = 1 To UBound(subFolders)
                Set f = f.Folders(subFolders(i))
                If f Is Nothing Then Exit For
            Next i

            If Not f Is Nothing Then
                Set GetOutlookFolder = f
                Exit Function
            End If
        End If
NextStore:
    Next st
End Function

Private Function GetFolderByName(ByVal st As Object, ByVal folderName As String) As Object
    Dim f As Object
    For Each f In st.GetRootFolder.Folders
        If f.Name = folderName Then
            Set GetFolderByName = f
            Exit For
        End If
    Next f
End Function
Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step4 コードを貼り付けて右上の「✕」をクリック
Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step4 コードを貼り付けて右上の「✕」をクリック
STEP
「ファイル」をクリック

右上の「✕」をクリックすると、通常のExcel画面に戻ります。

次に、左上の「ファイル」をクリックしてください。

Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step5 「ファイル」をクリック
Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step5 「ファイル」をクリック
STEP
「名前を付けて保存」をクリック

「ファイル」をクリックすると、Excelのホーム画面に移動します。

その中にある「名前を付けて保存」をクリックしてください。

Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step6 「名前を付けて保存」をクリック
Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step6 「名前を付けて保存」をクリック
STEP
ファイル名を入力し、「Excelマクロ有効ブック(.xlsm)」を選択して「保存」をクリック

「名前を付けて保存」をクリックすると、左上に「名前を付けて保存」と書かれた画面に移動します。

まず、ファイル名を入力してください。
※わかりやすい名前を任意で付けてください。

次に、その下のファイルの種類で「Excelマクロ有効ブック(.xlsm)」を選択して「保存」をクリックしてください。

Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step7 ファイル名を入力し、「Excelマクロ有効ブック(.xlsm)」を選択して「保存」をクリック
Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step7 ファイル名を入力し、「Excelマクロ有効ブック(.xlsm)」を選択して「保存」をクリック
STEP
「開発」タブの中にある「マクロ」をクリック

「保存」をクリックすると、Excelの通常画面に戻ります。

マクロを実行する前に、Outlookを起動して最新のメールを受信しておくとよりスムーズです。

次に「開発」タブの中にある「マクロ」をクリックしてください。

Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step8 「開発」タブの中にある「マクロ」をクリック
Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step8 「開発」タブの中にある「マクロ」をクリック
STEP
「Outlookのメール一覧取得」を選択し、「実行(R)」をクリック

「マクロ」をクリックすると、「マクロ」と書かれた小さなウィンドウが立ち上がります。

その中にある「Outlookのメール一覧取得」を選択し、「実行(R)」をクリックしてください。

マクロ実行時に「マクロの実行がブロックされました」と表示された場合はこちらの対処法をご覧ください。

Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step9 「Outlookのメール一覧取得」を選択し、「実行(R)」をクリック
Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step9 「Outlookのメール一覧取得」を選択し、「実行(R)」をクリック
STEP
「OK」をクリック

「実行(R)」をクリックすると、ExcelがOutlookからメールの一覧の取得を開始します。

取得が完了すると「処理が完了しました。」と表示されます。

「OK」をクリックしてウィンドウを閉じてください。

Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step10 「OK」をクリック
Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step10 「OK」をクリック
STEP
Outlookのメールが一覧でExcelに表示されたことを確認する

これでOutlookのメールが一覧でExcelに表示されます。

Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step11 Outlookのメールが一覧でExcelに表示されたことを確認する
Outlookメールを自動でExcelに一覧化するVBAマクロ導入方法 Step11 Outlookのメールが一覧でExcelに表示されたことを確認する

導入前に知っておきたい前提条件と制限事項

導入前に知っておきたい前提条件と制限事項をまとめます。

  1. 同じログインアカウントのメールのみ対象
    現在ログインしているOutlookアカウントでアクセスできるメールだけが対象です。他人のメールボックスや権限がない共有メールは一覧化できません。
  2. Outlookで受信済みのメールのみ対象
    マクロはOutlookがすでに受信しているメールを参照します。Outlookが未起動、または受信処理が未完了だと、メールは取得できません。実行前にOutlookを起動し、新着メールを受信しておくことが肝心です。
  3. Windows環境での利用が基本
    VBAはWindows版Officeを前提としているため、MacやWeb版Outlookなど、別環境で動作が変わる可能性があります。Windows版OutlookとExcelを使っているなら問題ないでしょう。
  4. フォルダ名や言語設定
    「Inbox」や「Sent Items」などの標準フォルダ名は、言語設定によって異なる場合があります。コード内で指定するフォルダ名は実際の環境に合わせて修正が必要なことがあります。
  5. OutlookとExcelは同一PC上で動作
    ローカル環境でOutlookとExcelが連動する仕組みを使うため、クラウド経由で別PCのメールを直接取得するといった操作は想定していません。

VBAマクロのポイントと設定項目

このマクロには、日常業務で本当に役立つ工夫がいくつも散りばめられています。
まず、重複メールの再取得を防ぐ仕組みがあるため、日々マクロを実行しても同じメールが増え続ける心配がありません。
メール固有のIDを利用し、一度取り込んだメールを再度追加しないことで、一覧が常に分かりやすい状態を保ちます。毎朝マクロを実行して新規メールだけ追加、という運用も可能です。

次に、フォルダ指定を柔軟に変えられます。受信トレイ(Inbox)を対象にするだけでなく、送信済みアイテム(Sent Items)や特定案件用のサブフォルダを参照することもできます。
顧客別、案件別にフォルダを分けている方は、必要な情報だけを取得することで、さらに業務効率が上がるでしょう。

本文取得においては、HTMLタグなど余計な要素を排除し、テキスト形式で内容を取り込むため、純粋な文章として確認できます。
これにより、メール内容の把握やコピーペーストによる二次利用がスムーズです。

コード内にはコメントが付いており、初心者でも最低限の修正で自分好みにカスタマイズできます。
たとえば、シート名を変えたり、特定の条件でメールを絞り込んだりといった応用も、徐々に試していくと良いでしょう。
最初は基本のまま使い、慣れたら少しずつ改良することで、自分の業務にぴったり合った仕組みを作り上げられます。

Outlookで受信したメールを自動でExcelに一覧化するVBAマクロに関するよくある質問と答え

Outlookで受信したメールを自動でExcelに一覧化するVBAマクロに関するよくある質問と答えをまとめました。

プログラミング経験がなくても「VBAマクロ」は使えますか?

はい、コピーペーストで導入可能なので初心者でも問題ありません。複雑な設定や特殊な開発ツールは不要です。

何があれば「Outlookメール」を「Excelで一覧化」できますか?

Windows版OutlookとExcelがあれば利用できます。一般的なOffice環境で十分です。

無料でできますか?

Windows版OutlookとExcelがあれば無料で利用できます。

MacやWeb版Outlookではどうですか?

VBAはWindows前提のため、MacやWeb版Outlookでは動作が異なる場合があります。Windows環境がおすすめです。

受信前の新着メールは対象外ですか?

Outlookが受信済みのメールのみ一覧化可能です。実行前にOutlookを起動し、送受信を完了してください。

他人のメールボックスや権限のないフォルダからも一覧にできますか?

ログイン中のアカウントで閲覧可能なメールだけが対象です。他人のメールは一覧化できません。

重複メールが増える心配は?

紹介したマクロは一度取り込んだメールは再取得しないため、同じメールが何度も並ぶことはありません。

Excelで並べ替えやフィルタは自由ですか?

はい、通常のExcelデータとして使えます。

Excelで行を消したらどうなりますか?

Excelは取得結果を表示しているだけなので、行を削除してもOutlookには影響はありません。再実行時は新規メールのみ追加されます。

Outlookでメールを削除した場合、Excelはどうなる?

Excel側は独立して履歴が残ります。

大量のメールがあると動作遅くなりますか?

非常に多いと時間がかかる場合があります。

HTMLメールが多いと読みづらくない?

テキスト化することでタグを除去しているので、HTMLメールでも内容理解がスムーズです。

その他OutlookやExcelに関する記事

その他OutlookやExcelに関する記事はこちらです。ぜひご覧ください。

最後までご覧いただきありがとうございました。
このサイトは情シスマンが半径3m以内のITに関する情報を掲載してるサイトです。
Windows系を主として、ソフトや周辺機器の操作や設定について画像も用いながらわかりやすく解説しています。

解説している内容に誤りがあった場合や、補足が必要な場合、もっと知りたい場合はこちらのお問い合わせフォームからご連絡ください。
個人の方を限定にサポートさせていただきます。

実行環境
Windows11 Home 24H2
64 ビット オペレーティング システム
11th Gen Intel(R) Core(TM) i7-11375H @ 3.30GHz 3.30 GHz
16.0 GB RAM
Microsoft 365

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次