Flat lay of business concept
メールの添付ファイルを毎回手動で保存するのは、意外と手間がかかります。
特に、特定の送信者やプロジェクトごとにフォルダを分けて管理している場合、「自動で添付ファイルを保存できたらいいのに」と感じたことはありませんか?
この記事では、Outlookの特定フォルダに届いたメールの添付ファイルを自動で指定フォルダに保存するVBAの作り方を、初心者にもわかりやすく解説します。
コピペでそのまま使えるサンプルコード付きなので、業務効率化を進めたい方におすすめです。
Outlookには「VBA(Visual Basic for Applications)」という機能が標準で搭載されています。
VBAを使うと、Outlookの動作を自動化したり、受信メールの内容に応じて処理を行ったりすることができます。
今回の目的は次の通りです。
つまり、業務上の「請求書」「見積書」「納品書」などを自動的に整理して保管できるというわけです。
まずはVBAを実行できるように環境を整えましょう。
これで上部メニューに「開発」タブが追加されます。
次に、
「開発」→「Visual Basic」をクリックしてVBAエディタを開きます。
VBAエディタが起動したら、左側の「Microsoft Outlook Objects」内の「ThisOutlookSession」または「標準モジュール」を開き、コードを記述できる状態にします。
以下のサンプルコードをそのまま貼り付けて使えます。
保存先パスやフォルダ名は任意に変更してください。
Sub SaveAttachmentsFromSpecificFolder()
Dim ns As Outlook.Namespace
Dim targetFolder As Outlook.Folder
Dim itm As Object
Dim atmt As Attachment
Dim savePath As String
Dim fileName As String
' 保存先フォルダのパスを指定
savePath = "C:\Users\Public\Documents\OutlookAttachments\"
' Outlook内の特定フォルダを指定(例:受信トレイ → 請求書)
Set ns = Application.GetNamespace("MAPI")
Set targetFolder = ns.GetDefaultFolder(olFolderInbox).Folders("請求書")
' 保存処理
For Each itm In targetFolder.Items
If itm.Attachments.Count > 0 Then
For Each atmt In itm.Attachments
fileName = savePath & Format(itm.ReceivedTime, "yyyymmdd_") & atmt.FileName
atmt.SaveAsFile fileName
Next atmt
End If
Next itm
MsgBox "保存が完了しました!", vbInformation
End Sub
GetDefaultFolder(olFolderInbox):受信トレイを取得します.Folders("請求書"):受信トレイ内のサブフォルダ名を指定しますsavePath:添付ファイルを保存するローカルパスを設定しますFormat(itm.ReceivedTime, "yyyymmdd_"):メール受信日をファイル名の先頭に追加します同じフォルダでも、送信者ごとにサブフォルダを自動で作って整理したい場合は、以下のように改良します。
Sub SaveAttachmentsBySender()
Dim ns As Outlook.Namespace
Dim targetFolder As Outlook.Folder
Dim itm As Object
Dim atmt As Attachment
Dim savePath As String
Dim senderName As String
Dim filePath As String
savePath = "C:\Users\Public\Documents\OutlookAttachments\"
Set ns = Application.GetNamespace("MAPI")
Set targetFolder = ns.GetDefaultFolder(olFolderInbox).Folders("請求書")
For Each itm In targetFolder.Items
If itm.Class = olMail Then
If itm.Attachments.Count > 0 Then
senderName = Replace(itm.SenderName, " ", "_")
If Dir(savePath & senderName, vbDirectory) = "" Then
MkDir savePath & senderName
End If
For Each atmt In itm.Attachments
filePath = savePath & senderName & "\" & Format(itm.ReceivedTime, "yyyymmdd_") & atmt.FileName
atmt.SaveAsFile filePath
Next atmt
End If
End If
Next itm
MsgBox "送信者別に保存が完了しました。", vbInformation
End Sub
このコードでは、メールの送信者名をサブフォルダ名として作成し、自動で分類します。
営業部や取引先別の管理にも非常に便利です。
手動実行だけでなく、Outlookを開いたときに自動で添付ファイルを保存したい場合は、「ThisOutlookSession」に以下のようなコードを追加します。
Private Sub Application_Startup()
Call SaveAttachmentsFromSpecificFolder
End Sub
これにより、Outlookを起動するたびに自動で保存処理が実行されます。
ただし、Outlook起動時の処理速度に影響する可能性があるため、フォルダ内のメール数が多い場合は注意しましょう。
→ 指定したフォルダ名が間違っている可能性があります。
「請求書」などのフォルダ名が実際のOutlook上と完全に一致しているか確認してください。
→ 保存先フォルダが存在しない場合は、あらかじめ手動で作成しておくか、MkDir関数を使って自動作成するようにします。
→ セキュリティ設定でVBAがブロックされていることがあります。
Outlookの「マクロのセキュリティ設定」を「通知してすべてのマクロを無効化」に変更しておくと、都度許可が出せます。
Outlook VBAを使用する際は、以下の点に注意してください。
業務利用では、セキュリティポリシーに沿った設定を行うことが重要です。
手動での添付ファイル保存は時間のムダになりがちです。
VBAを使えば、たった1回の設定で、Outlook内の特定フォルダに届くメールの添付ファイルを自動保存できます。
この記事のポイントをおさらいします。
この仕組みを導入することで、毎日の事務処理が劇的に効率化されます。
ぜひ、この記事のコードを活用して業務の自動化にチャレンジしてみてください。