前に添付付きメールをもらったけど、どれかわからない…
Outlookの添付ファイルを一括保存したい!
前にもらった添付付きメールがどこに行ったか分からないという経験、誰しもあるのではないでしょうか?そもそも添付ファイルだけを一括保存したいのに、できなくていちいち保存するのはかなり手間がかかる作業です。
本記事では Excelシートに入力した条件 に合わせて、Outlookの添付ファイルを自動で一括保存するVBAを紹介します。なお、保存先フォルダは毎回ダイアログで選択でき、送信者や件名、拡張子なども細かくフィルタ出来るようになっています。このコードを使って、効率化を進めてください。
また、VBA初心者の方でも使用できるよう、使い方も丁寧に解説しています。ぜひ最後まで確認してみてください。
【結論】コピペで使える添付ファイル取得VBA
まずコピペで使えるコードを紹介します。
次のコードをコピペするだけで、添付ファイルの一括取得ができます。
Sub SaveAttachmentsWithConditions()
Dim olApp As Outlook.Application
Dim olNs As Outlook.Namespace
Dim olFolder As Outlook.Folder
Dim olItem As Object
Dim olMail As Outlook.MailItem
Dim olAtt As Outlook.Attachment
Dim savePath As String
Dim fileName As String
' 条件用Excelの情報
Dim xlBook As Workbook
Dim xlSheet As Worksheet
Dim dateFrom As Variant, dateTo As Variant
Dim senderCond As String, receiverCond As String, subjectCond As String
Dim extCondRaw As String, extList() As String
Dim fileNameCond As String
' 保存先フォルダの選択
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "添付ファイルの保存先を選択してください"
If .Show <> -1 Then Exit Sub
savePath = .SelectedItems(1) & "\"
End With
Set xlBook = ThisWorkbook
Set xlSheet = ActiveSheet
' 条件取得(空欄許容)
dateFrom = xlSheet.Range("B1").Value
dateTo = xlSheet.Range("B2").Value
senderCond = Trim(xlSheet.Range("B3").Value)
receiverCond = Trim(xlSheet.Range("B4").Value)
subjectCond = Trim(xlSheet.Range("B5").Value)
fileNameCond = Trim(xlSheet.Range("B6").Value)
extCondRaw = Trim(xlSheet.Range("B7").Value)
If extCondRaw <> "" Then
extList = Split(LCase(extCondRaw), ",")
End If
' Outlookの受信トレイを対象
Set olApp = Outlook.Application
Set olNs = olApp.GetNamespace("MAPI")
Set olFolder = olNs.GetDefaultFolder(olFolderInbox)
' Restrictで日付範囲フィルタ作成
Dim filter As String
filter = ""
If IsDate(dateFrom) Then
filter = "[ReceivedTime] >= '" & Format(dateFrom, "yyyy/mm/dd") & "'"
End If
If IsDate(dateTo) Then
If filter <> "" Then filter = filter & " AND "
filter = filter & "[ReceivedTime] <= '" & Format(dateTo + 1, "yyyy/mm/dd") & "'"
End If
Dim targetItems As Outlook.Items
If filter <> "" Then
Set targetItems = olFolder.Items.Restrict(filter)
Else
Set targetItems = olFolder.Items
End If
targetItems.Sort "ReceivedTime", True
Dim totalCount As Long, currentCount As Long
totalCount = targetItems.Count
currentCount = 0
For Each olItem In targetItems
currentCount = currentCount + 1
Application.StatusBar = "処理中: " & currentCount & " / " & totalCount & _
"(" & Format(currentCount / totalCount, "0%") & ")"
If TypeOf olItem Is MailItem Then
Set olMail = olItem
If senderCond <> "" And InStr(1, olMail.SenderEmailAddress, senderCond, vbTextCompare) = 0 Then GoTo SkipMail
If receiverCond <> "" And InStr(1, olMail.To & olMail.CC, receiverCond, vbTextCompare) = 0 Then GoTo SkipMail
If subjectCond <> "" And InStr(1, olMail.Subject, subjectCond, vbTextCompare) = 0 Then GoTo SkipMail
' 添付ファイル保存処理
If olMail.Attachments.Count > 0 Then
For Each olAtt In olMail.Attachments
Dim fileExt As String
Dim attName As String
attName = olAtt.fileName
fileExt = LCase(Right(attName, Len(attName) - InStrRev(attName, ".")))
' ファイル名条件に一致しなければスキップ
If fileNameCond <> "" And InStr(1, attName, fileNameCond, vbTextCompare) = 0 Then GoTo NextAttachment
If extCondRaw = "" Then
fileName = savePath & Format(olMail.ReceivedTime, "yyyymmdd_hhnnss_") & attName
olAtt.SaveAsFile fileName
Else
Dim i As Long
For i = LBound(extList) To UBound(extList)
If "." & fileExt = Trim(extList(i)) Then
fileName = savePath & Format(olMail.ReceivedTime, "yyyymmdd_hhnnss_") & attName
olAtt.SaveAsFile fileName
Exit For
End If
Next i
End If
NextAttachment:
Next
End If
End If
SkipMail:
Next
Application.StatusBar = False
MsgBox "条件に合致するファイルの保存が完了しました。", vbInformation
End Sub
※当サイトで紹介している他のコピペコードは、コチラにまとめています!
【番外】そのまま使えるエクセルファイル
VBAが分からないという方向けに、VBAが入ったエクセルファイルを用意しました。ここに内容を書き込むだけで、簡単にメールが自動作成できます。
また、PCによっては「参照設定の追加」が必要となることがあります。エラーが出る場合は、この記事で紹介している「参照設定の追加」を試してください。
エクセルファイルはNoteにて販売しています。すぐに使いたい方はこちらを活用ください。


添付ファイル一括取得VBAの動作と使い方
エクセルに必要情報を記入します。日付の範囲のメールを全検索するので、できるだけ短い期間で検索するようにしてください。

実行すると、ファイル選択画面が表示されます。ここで、添付ファイルを保存するフォルダを選択します。

日付範囲のメールを全点検索し、フィルター条件のものだけを抽出します。

するとフィルターでソートした内容の添付ファイルだけが、保存されます。

業務効率化におすすめ書籍『9選』はコチラから!
メール出力VBAの使い方
ここからはVBAのコピペ方法を含めて、使い方を紹介します。
エクセルの準備(項目設定)
まず、エクセルのシートに以下のタイトルを入力してください

- 1行目:日付(FROM)
- 2行目:日付(to)
- 3行目:送信者
- 4行目:受信者
- 5行目:メールタイトル
- 6行目:添付ファイル名
- 7行目:拡張子
直接この名前をVBAで認識はしていません。ただ、リスト入力の間違い防止になるため、この内容で入力してください。
VBAの埋込
エクセルの「開発」タブから「Visual Basic」エディタを開きます。そしてVBAコードを「標準モジュール」に貼り付けます。
「開発」を出す設定やコードの書き方は、VBAの基礎まとめのページで詳しく解説しています。こちらの記事もぜひ参考にしてみてください。
【重要】参照設定の追加
このVBAを使用するためには、参照設定の追加が必要になります。エクセル上部の[開発]→[Visual Basic]と進み、VBAの編集画面を表示させます。(開発タブがない方はコチラ)

VBAの編集画面から[ツール]→[参照設定]と進みます。

参照設定の下の方に、[Microsoft Outlook 16.0 Object Library]があります。チェックを入れOKボタンを押します。

VBA実行
あとはVBAを実行すれば出力されます。基本的に、Outlookを立ち上げてからVBAを実行するようにしてください。
また受信フォルダに入っているすべてのメールが対象なので、必ず期間を指定するようにしてください。

また、実行ボタンを設置すると、マクロ画面を開く必要がなくなりとても便利です。ボタンのつけ方は、こちらの記事を参考にしてください。
エラーの対処
このVBAを実行すると、以下のようなエラーが出ることがあります。

このエラーは、参照設定で解消できることがほとんどです。参照設定の方法は、この記事の[【重要】照設定の追加]の項を参考にしてください。
さいごに
今回は、Outlookの添付ファイル一括取得VBAを紹介しました。とても効率がUPするVBAなので、ぜひ活用してみてください。
今回紹介したようなVBAスキルは、一度身につければ一生使える武器となります。コピペも便利ですが、本で体系的に学ぶことで「自分でコードを書く力」を短期間で身につけられます。
以下の記事では、Kindle Unlimited(読み放題)で無料で読めるおすすめのVBA書籍を厳選して紹介しています。生成AIを前提とした、今までとは全く違ったVBA学習法も紹介しているので、是非チェックしてみてください!






コメント