こんな人にオススメの記事です
- 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に関する記事はこちらです。ぜひご覧ください。
-
【Outlook】メール本文にハイパーリンクを貼る方法 - Webページやファイルへのリンク
この記事では、Outlookのメール本文にWebページやファイル、共有フォルダへのハイパーリンクを設定する方法を、初心者でも迷わず実践できるよう、画像付きで詳しく解説... -
【Outlook】メールテンプレートの作成方法と呼び出し方
この記事では、Outlookでメールテンプレート(.oft形式)を作成する手順から、作成済みテンプレートを活用してメールを素早く送信する方法までを、実際の画面を使いなが... -
【Excel】ヘッダーとフッターを設定する方法|ページ番号、日付、ファイル名など
「Excel ヘッダー ページ番号 設定方法」「Excel フッター 日付 自動更新」などでお困りではありませんか? この記事では、Excelのヘッダーとフッターに、ページ番号、... -
Outlookで行間が勝手に広くなる場合の対処法
こんな人にオススメの記事です Outlookで行間が勝手に広くなってしまった場合 Outlookで行間を狭くしたい人 Outlookを使用している際に、メールの行間が広がってしまい... -
【Excel】「マクロの実行がブロックされました」と表示された場合の対処法
こんな人にオススメの記事です ダウンロードしたExcelのファイルを開いたら「セキュリティリスク このファイルのソースが信頼できないため、Microsoftによりマクロの実... -
【Excel】数値を千円単位、百万円単位で表示する方法|書式設定で簡単
この記事では、Excelの「セルの書式設定」を使い、決算資料や売上報告書などで使う「1,234,567」といった数値を、「1,235千円」や「1百万円」のように、千円単位・百万... -
Outlookでメールの検索結果が正しく出てこない場合の対処法
こんな人にオススメの記事です Outlookでメールを検索しても一部の検索結果が出てこない Outlookでメールを検索しても検索結果に直近のメールが出てこない Outlookでメ... -
【Excel】戻るボタンが消えた場合の対処方法
こんな人にオススメの記事です Excelの戻るボタンが消えてしまった人 Excelの戻るボタンがいつもと違う場所に配置されている人 エクセルを使っていると、「戻る(元に戻... -
Outlookのキャッシュを安全に削除する方法
こんな人にオススメの記事です Outlookの動作が遅くなったと感じる場合 Outlookが頻繁にクラッシュする場合 Outlookを使い続けていると、動作が遅くなったり、メールの...
最後までご覧いただき、ありがとうございました。
記事の内容は独自検証に基づくものであり、MicrosoftやAdobeなど各ベンダーの公式見解ではありません。
環境によって結果が異なる場合がありますので、参考のうえご利用ください。
誤りのご指摘・追記のご要望・記事のご感想は、記事のコメント欄またはこちらのお問い合わせフォームからお寄せください。個人の方向けには、トラブルの切り分けや設定アドバイスも実施します。
※Microsoft、Windows、Adobe、Acrobat、Creative Cloud、Google Chromeほか記載の製品名・サービス名は各社の商標または登録商標です。
コメント
コメント一覧 (2件)
非常に助かります。ありがとうございます。
実行してみましたがメール本文中に画像が埋め込まれているとエラーで止まりました。
実行時エラー'-2147467259(800040005)':
オートメーションエラーです。
エラーを特定できません。
他にも同じ現象の方はいませんか?
コメントありがとうございます!
以下のコードではどうでしょう?
Option Explicit
Sub Outlookのメール一覧取得()
Const TARGET_ACCOUNT_NAME As String = "" ' アカウント名で絞りたい場合
Const OUTPUT_SHEET_NAME As String = "メール一覧"
Const TARGET_FOLDER_PATH As String = "Inbox" ' 例: "Inbox\Processed"
Dim OutlookApp As Object, OutlookNS As Object
Dim wb As Workbook, ws As Worksheet
Dim targetFolder As Object, items As Object, cur As Object
Dim lastRow As Long, idCheckRow As Long, lastDataRow As Long
Dim existingIDs As Object
'=== シート準備 ===
Set wb = ThisWorkbook
Set ws = EnsureSheet(wb, OUTPUT_SHEET_NAME)
EnsureHeader ws
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
If lastRow < 1 Then lastRow = 1 '既存 EntryID を辞書化 Set existingIDs = CreateObject("Scripting.Dictionary") For idCheckRow = 2 To lastRow If LenB(ws.Cells(idCheckRow, 10).Value) > 0 Then
existingIDs(ws.Cells(idCheckRow, 10).Value) = True
End If
Next
'=== 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 "指定フォルダが見つかりません。", vbExclamation
GoTo Cleanup
End If
'=== アイテム列挙(受信日時でソート) ===
Set items = targetFolder.Items
On Error Resume Next
items.Sort "[ReceivedTime]"
On Error GoTo 0
Set cur = items.GetFirst
ItemStart:
Do While Not cur Is Nothing
On Error GoTo ItemError
Dim tName As String: tName = TypeName(cur)
Dim eid As String: eid = SafeGetString(cur, "EntryID")
If (tName = "MailItem" Or tName = "ReportItem") And LenB(eid) > 0 Then
If Not existingIDs.Exists(eid) Then
Dim newRow As Long
newRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
ws.Cells(newRow, 1).Value = targetFolder.Store.DisplayName
ws.Cells(newRow, 10).Value = eid
If tName = "MailItem" Then
ws.Cells(newRow, 2).Value = SafeGetString(cur, "SenderName")
ws.Cells(newRow, 3).Value = SafeSenderSmtp(cur)
ws.Cells(newRow, 4).Value = SafeGetString(cur, "To")
ws.Cells(newRow, 5).Value = SafeGetString(cur, "CC")
ws.Cells(newRow, 6).Value = SafeGetString(cur, "Subject")
ws.Cells(newRow, 7).Value = SafeGetBody(cur)
ws.Cells(newRow, 8).Value = SafeGetAttachmentsList(cur)
ws.Cells(newRow, 9).Value = SafeGetDate(cur, "ReceivedTime")
Else
ws.Cells(newRow, 2).Value = ""
ws.Cells(newRow, 3).Value = ""
ws.Cells(newRow, 4).Value = ""
ws.Cells(newRow, 5).Value = ""
ws.Cells(newRow, 6).Value = SafeGetString(cur, "Subject")
ws.Cells(newRow, 7).Value = ""
ws.Cells(newRow, 8).Value = SafeGetAttachmentsList(cur)
ws.Cells(newRow, 9).Value = SafeGetDate(cur, "CreationTime")
End If
existingIDs(eid) = True
End If
End If
NextItem:
On Error GoTo 0
Set cur = items.GetNext
DoEvents
GoTo ItemStart ' Continue Do の代わり
ItemError:
' 1件エラーはスキップして続行
Resume NextItem
Loop
'=== 日時で昇順ソート ===
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 "処理が完了しました。", vbInformation
Cleanup:
Set items = Nothing
Set targetFolder = Nothing
Set OutlookNS = Nothing
Set OutlookApp = Nothing
Set ws = Nothing
Set wb = Nothing
Set existingIDs = Nothing
End Sub
'=== 補助関数群 ===
Private Function EnsureSheet(wb As Workbook, name As String) As Worksheet
On Error Resume Next
Set EnsureSheet = wb.Sheets(name)
On Error GoTo 0
If EnsureSheet Is Nothing Then
Set EnsureSheet = wb.Worksheets.Add
EnsureSheet.Name = name
End If
End Function
Private Sub EnsureHeader(ws As Worksheet)
If ws.Cells(1, 1).Value <> "アカウント名" Then
ws.Range("A1:J1").Value = _
Array("アカウント名", "送信者表示名", "送信者メールアドレス", "宛先", "CC", _
"件名", "本文(テキスト形式)", "添付ファイル名", "受信日時相当", "EntryID")
End If
End Sub
Private Function SafeGetString(obj As Object, prop As String) As String
On Error Resume Next
SafeGetString = CallByName(obj, prop, VbGet)
If Err.Number <> 0 Then SafeGetString = ""
On Error GoTo 0
End Function
Private Function SafeGetDate(obj As Object, prop As String) As Variant
On Error Resume Next
SafeGetDate = CallByName(obj, prop, VbGet)
If Err.Number <> 0 Then SafeGetDate = Null
On Error GoTo 0
End Function
Private Function SafeGetBody(mail As Object) As String
On Error Resume Next
SafeGetBody = mail.Body
If Err.Number <> 0 Then SafeGetBody = ""
On Error GoTo 0
End Function
Private Function SafeGetAttachmentsList(itm As Object) As String
Dim s As String, i As Long
On Error Resume Next
For i = 1 To itm.Attachments.Count
s = s & itm.Attachments(i).FileName & "; "
If Err.Number <> 0 Then Err.Clear
Next
If Len(s) >= 2 Then s = Left$(s, Len(s) - 2)
On Error GoTo 0
SafeGetAttachmentsList = s
End Function
Private Function SafeSenderSmtp(mail As Object) As String
On Error Resume Next
Dim addr As String
addr = mail.SenderEmailAddress
If InStr(1, addr, "@") > 0 Then
SafeSenderSmtp = addr
Else
SafeSenderSmtp = mail.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x39FE001E")
End If
If Err.Number <> 0 Then
Err.Clear
SafeSenderSmtp = addr
End If
On Error GoTo 0
End Function
Private Function GetOutlookFolder(oNS As Object, accountName As String, folderPath As String) As Object
Dim st As Object, f As Object, subFolders() As String, 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)
On Error GoTo 0
If Not f Is Nothing Then
Set GetOutlookFolder = f
Exit Function
End If
End If
Next
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
Set f = st.GetDefaultFolder(6)
ElseIf subFolders(0) = "Sent Items" Then
Set f = st.GetDefaultFolder(5)
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
If Not f Is Nothing Then
Set GetOutlookFolder = f
Exit Function
End If
End If
NextStore:
Next
End Function
Private Function GetFolderByName(st As Object, 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
End Function