Outlookでよくメールをmsgファイルの保存します。ファイル名先頭には日時を付けてます。
日時はメールの以下の部分から取得しています。
5個くらいまでなら手動でもいいんですが、10個くらいになると「なんか自動化できないかなー」という思いに駆られます。
ということでVBAを作りました。
■動作
出力対象のメールを選択します。
※複数選択可
「選択中のメールをファイル保存」マクロを実行します。
マクロ内で設定しているパスにメールがmsgファイルで保存されます。
ファイル形式は「yyyymmdd_hhmmss_[件名].msg」
■ソース
※使用する場合、定数のOUTPUT_PATHは好みの場所に変更してください。
'************************************************************** '* モジュール名: '* 概要:選択中のメールをファイル保存する '* 備考: '*************************************************************** Option Explicit ' ファイル保存先 Private Const OUTPUT_PATH = "C:\Users\[user_id]\Desktop" Private Const REMOVE_STR = "[\\/:*?""'<>|]" ' パスから除去する文字列 Private fso As FileSystemObject '************************************************************** '* 関数名:選択中のメールをファイル保存 '* 概要:選択中のメールをファイル保存する '* 使い方: '* パラメータ :(I) なし '* 戻り値 :なし '*************************************************************** Public Sub 選択中のメールをファイル保存() Dim objOL As Outlook.Application Dim objOLSelect As Outlook.Selection Dim item As MailItem Dim i As Long, j As Long, k As Long Dim spathsave As String Dim filepath As String Set objOL = New Outlook.Application Set objOLSelect = objOL.ActiveExplorer.Selection Set fso = New FileSystemObject ' [ 選択中のメールに対してループ ] For k = 1 To objOLSelect.count ' メールを取得 Set item = objOLSelect.item(k) Debug.Print item.Subject ' 同じ年月日時分秒で同じ件名のメールがあった場合の対応。末尾に「 (n)」の文字列を付ける For j = 0 To 1000 ' 0:まずは同じ年月日時分秒で同じ件名のメールがない想定 If j = 0 Then ' ファイルパス作成 filepath = fso.BuildPath(OUTPUT_PATH, Format(item.ReceivedTime, "yyyymmdd_hhmmss") & "_" & RegExpReplace(item.Subject, REMOVE_STR, "") & ".msg") Else ' 括弧付のファイルパス作成 filepath = fso.BuildPath(OUTPUT_PATH, Format(item.ReceivedTime, "yyyymmdd_hhmmss") & "_" & RegExpReplace(item.Subject, REMOVE_STR, "") & " (" & j & ").msg") End If ' ファイルがないなら保存する If fso.FileExists(filepath) = False Then item.SaveAs filepath Exit For ' j ループ終了 End If If j = 1000 Then MsgBox "同じ年月日時分秒で同じ件名が1000件!さすがにここには来ないはず" End If Next j Next k End Sub '************************************************************** '* 関数名:RegExpReplace '* 概要:正規表現置換 '* 使い方: '* パラメータ :(I)文字列 '* :(I)正規表現パターン '* :(I)置換後文字列 '* 戻り値 :変換後文字列 '*************************************************************** Private Function RegExpReplace(s1 As String, sPattern As String, sReplaceStr As String) Dim oRegExp As RegExp Set oRegExp = New RegExp oRegExp.Pattern = sPattern ' 正規表現パターン oRegExp.IgnoreCase = False ' 大文字小文字を区別 oRegExp.Global = True ' 複数マッチオン RegExpReplace = oRegExp.Replace(s1, sReplaceStr) ' 置換 End Function