こんな人にオススメの記事です
- Outlookで受信したメールをExcelで一覧化したい人
- メールの管理を効率化したい人
- 業務効率化のためにマクロを学びたい人
日々、受信トレイに積み重なる顧客からの問い合わせ、取引先の連絡、社内からの依頼メール。
その中から必要な情報を探し出すのに手間がかかり、肝心の業務がおろそかになっていませんか。
メールが増えるほど、検索や整理に時間を取られてしまい、迅速な対応や的確な判断が難しくなるのは、多くの職場で共通する悩みです。
そこで役立つのが、Outlookメールを自動でExcelに一覧化するVBAマクロです。
これを導入すれば、クリック1つで件名・送信者・宛先・受信日時・本文といった情報がExcel形式で表示されます。
Excel上であれば、顧客名や案件キーワードで即座にフィルタして必要なメールを抽出したり、受信日時順に並べ替えて対応漏れを防いだりと、柔軟な操作が簡単です。
準備するものと基本の流れ
このVBAマクロを活用するには、Windows版のOutlookとExcelが入ったPC環境があれば十分です。
特別な開発ツールは不要です。以下の手順に沿って設定することですぐに利用可能です。
- 「開発」タブをクリックしてVisual Basicを開く
- 指定したコードを貼り付けて、✕をクリックしてVisual Basicを閉じる
- 「ファイル」→「名前を付けて保存」をクリックして、ファイルの種類で「Excelマクロ有効ブック(.xlsm)」を選択して保存
- 「開発」タブから「マクロの表示」をクリックし「Outlookのメール一覧取得」を選択して「実行」をクリック
- 「処理が完了しました。」と表示されたら「OK」をクリック
- ExcelにOutlookのメールが一覧で表示されていることを確認する
ここからは、Excelブックを用意してマクロを実行するまでの流れを、実際の画面を使いながらわかりやすく解説していきます。
Excelを起動し、「開発」タブをクリックしてください。
次に、「開発」タブの中にある「Visual Basic」をクリックしてください。
「Visual Basic」をクリックしたら、左上の枠の中にある「This Workbook」をクリックしてください。
「This Workbook」をクリックすると、以下の画像のように右側が真っ白な状態になります。
右側の真っ白なところに、以下のコードを貼り付けてください。
貼り付け終わったら右上の「✕」をクリックしてください。
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
右上の「✕」をクリックすると、通常のExcel画面に戻ります。
次に、左上の「ファイル」をクリックしてください。
「ファイル」をクリックすると、Excelのホーム画面に移動します。
その中にある「名前を付けて保存」をクリックしてください。
「名前を付けて保存」をクリックすると、左上に「名前を付けて保存」と書かれた画面に移動します。
まず、ファイル名を入力してください。
※わかりやすい名前を任意で付けてください。
次に、その下のファイルの種類で「Excelマクロ有効ブック(.xlsm)」を選択して「保存」をクリックしてください。
「保存」をクリックすると、Excelの通常画面に戻ります。
次に「開発」タブの中にある「マクロ」をクリックしてください。
「マクロ」をクリックすると、「マクロ」と書かれた小さなウィンドウが立ち上がります。
その中にある「Outlookのメール一覧取得」を選択し、「実行(R)」をクリックしてください。
「実行(R)」をクリックすると、ExcelがOutlookからメールの一覧の取得を開始します。
取得が完了すると「処理が完了しました。」と表示されます。
「OK」をクリックしてウィンドウを閉じてください。
これでOutlookのメールが一覧でExcelに表示されます。
導入前に知っておきたい前提条件と制限事項
導入前に知っておきたい前提条件と制限事項をまとめます。
- 同じログインアカウントのメールのみ対象
現在ログインしているOutlookアカウントでアクセスできるメールだけが対象です。他人のメールボックスや権限がない共有メールは一覧化できません。 - Outlookで受信済みのメールのみ対象
マクロはOutlookがすでに受信しているメールを参照します。Outlookが未起動、または受信処理が未完了だと、メールは取得できません。実行前にOutlookを起動し、新着メールを受信しておくことが肝心です。 - Windows環境での利用が基本
VBAはWindows版Officeを前提としているため、MacやWeb版Outlookなど、別環境で動作が変わる可能性があります。Windows版OutlookとExcelを使っているなら問題ないでしょう。 - フォルダ名や言語設定
「Inbox」や「Sent Items」などの標準フォルダ名は、言語設定によって異なる場合があります。コード内で指定するフォルダ名は実際の環境に合わせて修正が必要なことがあります。 - OutlookとExcelは同一PC上で動作
ローカル環境でOutlookとExcelが連動する仕組みを使うため、クラウド経由で別PCのメールを直接取得するといった操作は想定していません。
VBAマクロのポイントと設定項目
このマクロには、日常業務で本当に役立つ工夫がいくつも散りばめられています。
まず、重複メールの再取得を防ぐ仕組みがあるため、日々マクロを実行しても同じメールが増え続ける心配がありません。
メール固有のIDを利用し、一度取り込んだメールを再度追加しないことで、一覧が常に分かりやすい状態を保ちます。毎朝マクロを実行して新規メールだけ追加、という運用も可能です。
次に、フォルダ指定を柔軟に変えられます。受信トレイ(Inbox)を対象にするだけでなく、送信済みアイテム(Sent Items)や特定案件用のサブフォルダを参照することもできます。
顧客別、案件別にフォルダを分けている方は、必要な情報だけを取得することで、さらに業務効率が上がるでしょう。
本文取得においては、HTMLタグなど余計な要素を排除し、テキスト形式で内容を取り込むため、純粋な文章として確認できます。
これにより、メール内容の把握やコピーペーストによる二次利用がスムーズです。
コード内にはコメントが付いており、初心者でも最低限の修正で自分好みにカスタマイズできます。
たとえば、シート名を変えたり、特定の条件でメールを絞り込んだりといった応用も、徐々に試していくと良いでしょう。
最初は基本のまま使い、慣れたら少しずつ改良することで、自分の業務にぴったり合った仕組みを作り上げられます。
Outlookで受信したメールを自動でExcelに一覧化するVBAマクロに関するよくある質問と答え
Outlookで受信したメールを自動でExcelに一覧化するVBAマクロに関するよくある質問と答えをまとめました。
その他OutlookやExcelに関する記事
その他OutlookやExcelに関する記事はこちらです。ぜひご覧ください。
-
アウトルック(Microsoft Outlook)
添付されているwinmail.datの開き方6選
こんな方にオススメ winmail.datが添付されたメールが来て困っている方 winmail.datが何なのかわからない方 winmail.datの開き方を知りたい方 winmail.datを変換したい... -
アウトルック(Microsoft Outlook)
【Outlook】メールテンプレートの作成方法と呼び出し方
こんな人にオススメの記事です 営業メールや問い合わせ対応メールを効率化したい人 フォーマットを固定してメールの送信ミスを防ぎたい人 日報や週報など定期的な報告を... -
アウトルック(Microsoft Outlook)
【Outlook】送信先に表示される差出人名を変更する方法
こんな人にオススメの記事です Outlookでメールの差出人名を変更したい人 Outlookで現在の差出人名を確認したい人 「メールを送った相手に自分の名前がどう表示されてい... -
アウトルック(Microsoft Outlook)
Outlookで未読メールのみを簡単に表示する方法|デスクトップ版・Web版対応
こんな人にオススメの記事です 未読メールのみを瞬時に確認したい人 未読メールを見逃さず、すぐに確認したい人 整理された未読メール表示を活用し、メールチェックの負... -
エクセル(Microsoft Office Excel)
エクセル(Excel)で作成したデータをワード(Word)に貼りつける方法7選
こんな人にオススメの記事です エクセルからワードに貼り付けると毎回形が崩れてしまう エクセルのデータを更新したらワードに貼り付けた表も自動的に更新されてほしい ... -
アウトルック(Microsoft Outlook)
Outlookのナビゲーションバーを下に表示する方法
こんな人にオススメの記事です Outlookのナビゲーションバーを下に移動させたい人 小さな画面やノートPCをOutlookを使用している人 Outlookの操作性を向上させたい人 Ou... -
エクセル(Microsoft Office Excel)
【エクセル】自動計算されない場合の原因と対処法
こんな人にオススメの記事です エクセルの計算式が突然自動計算されなくなった場合 エクセルの計算式を自動計算したくない人 エクセルは普段は自動計算されていて、関数... -
エクセル(Microsoft Office Excel)
【Excel】空白行を一括で削除する方法
こんな人にオススメの記事です 不要な空白行を一括で削除する方法を知りたい人 空白行を一括で削除するマクロを作成したい人 Excelでデータを扱っていると、途中に空白... -
アウトルック(Microsoft Outlook)
Outlookで行間が勝手に広くなる場合の対処法
こんな人にオススメの記事です Outlookで行間が勝手に広くなってしまった場合 Outlookで行間を狭くしたい人 Outlookを使用している際に、メールの行間が広がってしまい...
最後までご覧いただきありがとうございました。
このサイトは情シスマンが半径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
コメント