課題・悩み「決まったメールや添付ファイルを受信するたびに保存するのは面倒」
解決策「特定の件名のメールをフォルダに自動で保存するVBAマクロのコード」を解説
Outlookで受信するメールの量は日に日に増え、特定のメールを手動で整理・保存する作業は時間がかかり、煩雑なものになりがちです。
今回は、特定の条件に一致するメールを自動で検出し、それらを整理して保存するVBAマクロの作成方法を紹介します。
このマクロは、新着メールが受信された際に自動的に動作します。
件名に特定の文字列が含まれるメールを検出し、そのメールと添付ファイルを「yymmdd(メール受信日)_メール送信者_メール件名_hhmm(メール受信時間)」というフォーマットで名付けられたフォルダに保存します。
これにより、メールの自動整理とアーカイブが簡単になります。
【特定の件名のメールをフォルダに自動で保存するVBAマクロのコード】を図解で解説しています。
Outlookのメールを自動整理・保存するVBAマクロ
このVBAマクロは、Outlookの新着メールを監視し、特定の条件(件名に特定の文字列が含まれるメール)に一致するメールを検出して、それらのメールとその添付ファイルを特定のフォーマット(「yymmdd(メール受信日)_メール送信者_メール件名_hhmm(メール受信時間)」)で名付けられたフォルダに保存するものです。
このプロセスにより、メールの自動整理と保存が可能になります。
メールの件名もフォルダ名の一部として使用するため、フォルダ名に使用できない文字を置換する処理を追加しています。
Private Sub Application_NewMail()
Dim objInbox As Outlook.MAPIFolder
Dim objMail As Outlook.MailItem
Dim objItems As Outlook.Items
Dim strFilter As String
Dim saveFolder As String
Dim objItem As Object
Dim objAttachment As Outlook.Attachment
Dim receivedDate As String
Dim receivedTime As String
Dim senderName As String
Dim mailSubject As String
Dim specificFolder As String
' デスクトップのパスを指定
saveFolder = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\メール保存\"
' 受信トレイを設定
Set objInbox = Application.Session.GetDefaultFolder(olFolderInbox)
Set objItems = objInbox.Items
' 特定の文字列を含むメールをフィルタ
strFilter = "@SQL=""urn:schemas:httpmail:subject"" LIKE '%特定の文字列%'"
Set objItems = objItems.Restrict(strFilter)
For Each objItem In objItems
If TypeOf objItem Is MailItem Then
Set objMail = objItem
' 受信日と受信時間をフォーマット
receivedDate = Format(objMail.ReceivedTime, "yymmdd")
receivedTime = Format(objMail.ReceivedTime, "hhmm")
' 送信者名と件名をフォーマット
senderName = objMail.SenderName
mailSubject = objMail.Subject
Dim invalidChars As Variant
invalidChars = Array(":", "\", "/", "*", "?", """", "<", ">", "|", "&")
For i = 0 To UBound(invalidChars)
senderName = Replace(senderName, invalidChars(i), "-")
mailSubject = Replace(mailSubject, invalidChars(i), "-")
Next i
' 特定のフォルダを作成
specificFolder = saveFolder & receivedDate & "_" & senderName & "_" & mailSubject & "_" & receivedTime & "\"
If Dir(specificFolder, vbDirectory) = "" Then MkDir specificFolder
' メールを特定のフォルダに保存
Dim safeSubject As String
safeSubject = Replace(objMail.Subject, ":", "-")
safeSubject = Replace(safeSubject, "\", "-")
safeSubject = Replace(safeSubject, "/", "-")
safeSubject = Replace(safeSubject, "*", "-")
safeSubject = Replace(safeSubject, "?", "-")
safeSubject = Replace(safeSubject, """", "-")
safeSubject = Replace(safeSubject, "<", "-")
safeSubject = Replace(safeSubject, ">", "-")
safeSubject = Replace(safeSubject, "|", "-")
Dim savePath As String
savePath = specificFolder & safeSubject & ".msg"
objMail.SaveAs savePath, olMSG
' 添付ファイルがあれば保存
If objMail.Attachments.Count > 0 Then
For Each objAttachment In objMail.Attachments
Dim attachmentPath As String
attachmentPath = specificFolder & objAttachment.FileName
objAttachment.SaveAsFile attachmentPath
Next objAttachment
End If
End If
Next
End Sub
ただし、メールの件名が長い場合や特殊文字が多く含まれている場合は、フォルダ名が非常に長くなる可能性があるため、適宜調整が必要です。
また、Windowsのフォルダパスの最大長(一般的には260文字)を超えないように注意してください。
環境設定
OutlookでVBAマクロを使用するための環境設定。
セキュリティ設定の変更や参照設定の追加が必要です。
この部分のコードはありませんが、Outlookのマクロセキュリティを低く設定し、Microsoft Outlook Object Libraryへの参照設定が必要です。
受信トレイの設定
Outlookの受信トレイを指定し、新着メールを監視する設定を行います。
Set objInbox = Application.Session.GetDefaultFolder(olFolderInbox)
メールのフィルタリング
件名に特定の文字列が含まれるメールを検出するためのフィルタリング処理。
strFilter = "@SQL=""urn:schemas:httpmail:subject"" LIKE '%特定の文字列%'"
Set objItems = objItems.Restrict(strFilter)
フォルダ名の生成
メールの受信日、送信者名、件名、受信時間からフォルダ名を生成します。
フォルダ名に使用できない文字は置換されます。
件名や送信者名の処理: senderName = Replace(senderName, invalidChars(i), "-") など
フォルダ名の組み立て:
specificFolder = saveFolder & receivedDate & "_" & senderName & "_" & mailSubject & "_" & receivedTime & "\"
フォルダの作成
指定されたフォルダ名でディレクトリを作成します。
既に存在しない場合のみ作成します。
If Dir(specificFolder, vbDirectory) = "" Then MkDir specificFolder
メールと添付ファイルの保存
メール本体と添付ファイルを上記で生成したフォルダに保存します。
メールは.msg形式で、添付ファイルは元のファイル名を保持します。
メールの保存
objMail.SaveAs savePath, olMSG
添付ファイルの保存
objAttachment.SaveAsFile attachmentPath
注意点
データ量による処理時間
メールや添付ファイルが大量にある場合、それらをフィルタリングし、保存する過程で処理に時間がかかる可能性があります。
操作の取り消し
VBAマクロで実行した操作は自動的に行われ、Outlookやファイルシステムに直接影響を与えるため、これらの操作は通常、元に戻すことができません。
セキュリティリスク
マクロを有効にすることはセキュリティリスクを伴います。
信頼できるマクロのみを実行し、不明なソースからのマクロは実行しないでください。
必要な環境設定
Outlookのマクロセキュリティ設定
「ファイル」>「オプション」>「セキュリティセンター」>「セキュリティセンターの設定」から、「マクロ設定」を変更し、マクロの実行を許可してください。
参照設定の追加
VBAエディタで「ツール」>「参照設定」を開き、「Microsoft Outlook 15.0 Object Library」(バージョンは異なる場合があります)にチェックを入れて、参照設定を追加してください。
コードのカスタマイズ箇所
メールのフィルタリング条件
特定の文字列を件名に含むメールをフィルタリングする条件です。
この文字列を実際に検出したい内容に変更してください。
strFilter = "@SQL=""urn:schemas:httpmail:subject"" LIKE '%特定の文字列%'"
保存先の基本フォルダ
メールと添付ファイルを保存する基本のフォルダパスです。
デフォルトではデスクトップ上の「メール保存」となっていますが、これを変更可能です。
saveFolder = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\メール保存\"
メール送信者の名前の扱い
フォルダ名の一部としてメール送信者の名前を使用します。
送信者名に不適切な文字が含まれている場合は、これを置換する必要があります。
senderName = Replace(senderName, invalidChars(i), "-")
メール件名の扱い
フォルダ名の一部としてメール件名を使用します。
件名に不適切な文字が含まれている場合は、これを置換する必要があります。
mailSubject = Replace(mailSubject, invalidChars(i), "-")
コードを変更する必要がある理由と詳細
メールのフィルタリング条件
この条件は、どのメールを自動で保存するかを決定します。
例えば、プロジェクト名、キーワード、特定の人物からのメールなど、特定の条件に合わせてこの文字列を変更することで、関連するメールのみを自動で保存することができます。
保存先の基本フォルダ
メールを保存する場所は、ユーザーの環境や整理の好みによって異なります。
デスクトップ以外にも、ドキュメントフォルダや特定のプロジェクトフォルダなど、適切な保存先を設定できます。
メール送信者の名前の扱い
フォルダ名に使用できない文字(例\//*?”<>|)は、ファイルシステムによって禁止されています。
これらの文字が送信者名に含まれている場合、フォルダ作成時にエラーが発生するため、安全な文字への置換が必要です。
メール件名の扱い
メール件名も同様にフォルダ名の一部として使用されます。
件名にフォルダ名として不適切な文字が含まれている場合、これらを安全な文字に置換することでエラーを避けることができます。
まとめ:
このVBAマクロを使用することで、Outlookのメール管理が格段に楽になります。
日々の業務で受信する重要なメールを自動で整理・保存し、より効率的なメール管理を実現しましょう。
Outlookの作業を自動化する便利なVBAマクロのコードの一覧です。
コメント