Outlookで受信したメールの添付ファイルを自動保存する方法を徹底解説

Outlookで受信したメールの添付ファイルを自動保存する方法

こんな人にオススメの記事です

  • 受信したメールの添付ファイルを自動ですべて保存したい人
  • OutlookでVBAを使ってみたい人
  • Outlookを使った業務の効率化を検討している人

この記事では、マクロを使ってOutlookで受信したメールの添付ファイルを自動的に所定のフォルダー内に保存する方法を初心者にもわかりやすく、丁寧に解説していきます。

この画面はOffice 2019のOutlookで解説しています。

目次

Outlookのマクロを使う事前準備その1 すべてのマクロを有効にする

まずはOutlookで自作したマクロの実行を許可するように設定していきます。

Outlookの初期設定では「デジタル署名されたマクロ以外はすべて無効」となっており、自作したマクロは全て無視されてしまいます。
自分でデジタル署名を作成する方法もあるので興味がある人はMicrosoft公式サイトをご覧ください。
※設定が複雑なためここでは解説しません。

STEP
[ファイル]をクリックする

Outlookを起動し、左上にある[ファイル]をクリックしてください。

すべてのマクロを有効にする step1 [ファイル]をクリックする
すべてのマクロを有効にする step1 [ファイル]をクリックする
STEP
[オプション]をクリックする

[ファイル]をクリックすると「アカウント情報」と大きく書かれた画面に移動します。

その中の[オプション]をクリックしてください。

Outlookのウィンドウを縮小していると[オプション]が表示されない場合があります。
[オプション]が見当たらない場合はOutlookのウィンドウを最大化してみてください。

すべてのマクロを有効にする step2 [オプション]をクリックする
すべてのマクロを有効にする step2 [オプション]をクリックする
STEP
[トラストセンター]をクリックする

[オプション]をクリックすると「Outlookのオプション」と書かれたウィンドウが立ち上がります。

そのウィンドウの左側にある[トラストセンター]をクリックしてください。

すべてのマクロを有効にする step3 [トラストセンター]をクリックする
すべてのマクロを有効にする step3 [トラストセンター]をクリックする
STEP
[トラストセンターの設定]をクリックする

[トラストセンター]をクリックすると「セキュリティと詳細情報」を書かれた画面に移動します。

その中にある[トラストセンターの設定]と書かれたボタンをクリックしてください。

すべてのマクロを有効にする step4 [トラストセンターの設定]をクリックする
すべてのマクロを有効にする step4 [トラストセンターの設定]をクリックする
STEP
[マクロの設定]をクリック

[トラストセンターの設定]と書かれたボタンをクリックすると「トラストセンター」が立ち上がります。

その画面の左側メニューにある[マクロの設定]をクリックしてください。

すべてのマクロを有効にする step5 [マクロの設定]をクリックする
すべてのマクロを有効にする step5 [マクロの設定]をクリックする
STEP
[すべてのマクロを有効にする]にチェックを入れて[OK]をクリック

[マクロの設定]をクリックすると「マクロの設定」と書かれた画面に移動します。

その中にある[すべてのマクロを有効にする]にチェックを入れてください。

次に右下にある[OK]をクリックしてください。

すべてのマクロを有効にする step6 [すべてのマクロを有効にする]にチェックを入れて[OK]をクリックする
すべてのマクロを有効にする step6 [すべてのマクロを有効にする]にチェックを入れて[OK]をクリックする
STEP
1つ前の画面に戻るので再度[OK]をクリック

「マクロの設定」と書かれた画面で[OK]をクリックすると、「Outlookのオプション」ウィンドウに戻ります。

再度右下にある[OK]をクリックして、「Outlookのオプション」ウィンドウを閉じてください。

これでOutlookで自作のマクロを実行することができるようになります。

すべてのマクロを有効にする step7 1つ前の画面に戻るので再度[OK]をクリックする
すべてのマクロを有効にする step7 1つ前の画面に戻るので再度[OK]をクリックする

Outlookのマクロを使う事前準備その2 リボンに開発タブを表示する

Outlookで自作のマクロの実行を許可した後は、Outlookのリボンに開発タブを表示させます。

リボンとは

Outlookの「リボン」とは以下の赤枠で囲った箇所を指します。

Outlookの「リボン」
Outlookの「リボン」

リボン(英: ribbon)とは、マイクロソフトが提唱した、アプリケーションソフトウェアの操作コマンドメニューの表示領域におけるグラフィカルユーザーインターフェイス (GUI) 方式の一種である。Microsoft Office 2007で初めて搭載された。

Wikipedia https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%9C%E3%83%B3_(GUI)

Outlookのリボンに開発タブを表示させることで、マクロの管理が簡単になります。

Outlookのリボンに開発タブを表示させたくない場合はキーボードショートカット[Alt] + [F11キー]でもVBAの画面を開くことができます。

STEP
[ファイル]をクリックする

Outlookを起動し、左上にある[ファイル]をクリックしてください。

リボンに開発タブを表示する step1 [ファイル]をクリックする
STEP
[オプション]をクリックする

[ファイル]をクリックすると「アカウント情報」と大きく書かれた画面に移動します。

その中の[オプション]をクリックしてください。

Outlookのウィンドウを縮小していると[オプション]が表示されない場合があります。
[オプション]が見当たらない場合はOutlookのウィンドウを最大化してみてください。

リボンに開発タブを表示する step2 [オプション]をクリックする
リボンに開発タブを表示する step2 [オプション]をクリックする
STEP
[リボンのユーザー設定]をクリックする

[オプション]をクリックすると「Outlookのオプション」と書かれたウィンドウが立ち上がります。

そのウィンドウの左側にある[リボンのユーザー設定]をクリックしてください。

リボンに開発タブを表示する step3 [リボンのユーザー設定]をクリックする
リボンに開発タブを表示する step3 [リボンのユーザー設定]をクリックする
STEP
[開発]にチェックを入れて[OK]をクリックする
リボンに開発タブを表示する step4 [開発]にチェックを入れて[OK]をクリックする

[リボンのユーザー設定]をクリックすると「リボンをカスタマイズします。」と書かれた画面に移動します。

右側の枠の中にある[開発]にチェックを入れて、右下の[OK]をクリックしてください。

右側の枠に表示されているのが、現在Outlookに表示されている項目です。
初期設定では[開発]にチェックが入っていません。

受信したメールの添付ファイルを自動保存するためのマクロ

すべてのマクロを有効にし、Outlookのリボンに[開発]タブが表示されたら次は実際にマクロを作成していきましょう。

Option Explicit

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    
    Dim folderPath As String
    Dim entryIDs As Variant
    Dim recTime As String
    Dim attachFileName As String
    Dim i As Long
    
    Dim objMsg As Object
    Dim objAttach As Attachment
    
    folderPath = "C:\Users\Downloads\" '添付ファイルを保存するフォルダパスを指定、最後に\を付けること
    
    entryIDs = Split(EntryIDCollection, ",") '複数のメールを同時受信した際は、複数のIDがカンマ区切りで渡されるため、カンマ区切りでIDを配列に格納
    
    For i = 0 To UBound(entryIDs)
        Set objMsg = Application.Session.GetItemFromID(entryIDs(i)) '受信したメールを取得
        recTime = Format(objMsg.ReceivedTime, "yyyymmdd-hhmm_") '受信日時を取得してタイトル用に文字列に変換
        
        For Each objAttach In objMsg.Attachments '受信メールに添付されたファイル毎に処理
            attachFileName = folderPath & recTime & objAttach.FileName 'フォルダパスを付けて添付ファイル名を用意
            objAttach.SaveAsFile attachFileName '添付ファイルを保存
        Next
    Next i
    
    Set objMsg = Nothing

End Sub

上記がVBAのコードです。

基本的にはこのまま使うことができますが、保存先フォルダーだけは変更する必要があります。

14行目のfolderPath = "C:\Users\Downloads\"で保存先を指定しているので、そこを指定のフォルダーに書き換えてください。(必須)

"C:\Users\jo-sys\Desktop\Outlookの添付ファイル\"といったようなフルパスで指定する必要があります。

フルパスの確認方法

フォルダーのフルパスを確認するには以下の手順で行います。

  • 指定したいフォルダーを右クリック
  • [プロパティ]をクリック
  • [セキュリティ]タブをクリック

[セキュリティ]タブのオブジェクト名に書かれているのがフルパスです。

フルパスの確認方法
フルパスの確認方法

同じメールの中に同じ名前の添付ファイルが複数ある場合は上書きされてしまいます。

受信した日付毎にフォルダーを作成し、その中に受信したメールの添付ファイルを自動保存するためのマクロ

受信したメールの添付ファイルを自動保存するためのマクロの応用編で、指定したフォルダーの中に日付毎のサブフォルダーを自動で作成し、その中に添付ファイルを保存していくものです。

受信するメールの件数が多い場合や、添付ファイルを日付ごとに管理したい場合はこちらを使ってみてください。

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    
    Dim folderPath As String
    Dim entryIDs As Variant
    Dim recTime As String
    Dim attachFileName As String
    Dim i As Long
    
    Dim objMsg As Object
    Dim objAttach As Attachment
    
    folderPath = "C:\Users\Downloads\" '添付ファイルを保存する親フォルダパスを指定、最後に\を付けること
    
    entryIDs = Split(EntryIDCollection, ",") '複数のメールを同時受信した際は、複数のIDがカンマ区切りで渡されるため、カンマ区切りでIDを配列に格納
    
    For i = 0 To UBound(entryIDs)
        Set objMsg = Application.Session.GetItemFromID(entryIDs(i)) '受信したメールを取得
        recTime = Format(objMsg.ReceivedTime, "yyyymmdd-hhmm_") '受信日時を取得してタイトル用に文字列に変換
        
        subfolder = Format(objMsg.ReceivedTime, "yyyymmdd") '受信日時yyyymmddでサブフォルダ名を用意
        frag = Dir(folderPath & subfolder, vbDirectory) 'Dir関数で親フォルダの中にサブフォルダの有無を確認
        If frag = "" Then '親フォルダの中にサブフォルダがない場合(すでにサブフォルダがある場合は何もしない)
            MkDir folderPath & subfolder 'サブフォルダを作成
        End If
        
        For Each objAttach In objMsg.Attachments '受信メールに添付されたファイル毎に処理
            attachFileName = folderPath & subfolder & "\" & recTime & objAttach.Filename 'フォルダパスを付けて添付ファイル名を用意
            'attachFileName = folderPath & subfolder & "\" & objMsg.SenderName & "_" & objMsg.Subject & "_" & recTime & objAttach.Filename '「メールのタイトル+送信者名+受信日時+添付ファイル名」の場合
            objAttach.SaveAsFile attachFileName '添付ファイルを保存
        Next
    Next i
    
    Set objMsg = Nothing

End Sub

上記がVBAのコードです。

基本的にはこのまま使うことができますが、保存先フォルダーだけは変更する必要があります。

12行目のfolderPath = "C:\Users\Downloads\"で保存先を指定しているので、そこを指定のフォルダーに書き換えてください。(必須)

"C:\Users\jo-sys\Desktop\Outlookの添付ファイル\"といったようなフルパスで指定する必要があります。

件名に特定の文字列が含まれているメールの添付ファイルだけを自動保存するためのマクロ

「メールタイトルに特定の文字列を含むものだけの添付ファイルを保存したい」とご要望を頂いたので、件名に特定の文字列が含まれているメールの添付ファイルだけを自動保存するためのマクロを載せておきます。

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    
    Dim folderPath As String
    Dim entryIDs As Variant
    Dim recTime As String
    Dim attachFileName As String
    Dim i As Long
    Dim keyword As String
    
    Dim objMsg As Object
    Dim objAttach As attachment
    
    folderPath = "C:\Users\Downloads\" ' 添付ファイルを保存するフォルダパスを指定、最後に\を付けること
    keyword = "特定の文字列" ' チェックしたい特定の文字列を指定
    
    ' フォルダパスが存在するか確認
    If Dir(folderPath, vbDirectory) = "" Then
        MsgBox "指定したフォルダパスが存在しません: " & folderPath, vbExclamation
        Exit Sub
    End If
    
    On Error GoTo ErrorHandler ' エラーハンドリングを有効にする
    
    entryIDs = Split(EntryIDCollection, ",") ' 複数のメールを同時受信した際は、複数のIDがカンマ区切りで渡されるため、カンマ区切りでIDを配列に格納
    
    For i = 0 To UBound(entryIDs)
        Set objMsg = Application.Session.GetItemFromID(entryIDs(i)) ' 受信したメールを取得
        
        ' メールタイトルに特定の文字列が含まれているかチェック
        If InStr(objMsg.Subject, keyword) > 0 Then
            recTime = Format(objMsg.ReceivedTime, "yyyymmdd-hhmm_") ' 受信日時を取得してタイトル用に文字列に変換
            
            For Each objAttach In objMsg.Attachments ' 受信メールに添付されたファイル毎に処理
                attachFileName = folderPath & recTime & objAttach.FileName ' フォルダパスを付けて添付ファイル名を用意
                objAttach.SaveAsFile attachFileName ' 添付ファイルを保存
            Next objAttach
        End If
    Next i
    
Cleanup:
    On Error Resume Next
    Set objMsg = Nothing
    Set objAttach = Nothing
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
    Resume Cleanup

End Sub

上記がVBAのコードです。

13行目のfolderPath = "C:\Users\Downloads\"で保存先を指定しているので、そこを指定のフォルダーに書き換えてください。(必須)

"C:\Users\jo-sys\Desktop\Outlookの添付ファイル\"といったようなフルパスで指定する必要があります。

14行目のkeyword = "特定の文字列"でメールの件名に含まれる特定の文字を指定しているので、そこを指定する文字列に書き換えてください。(必須)

受信したメールの添付ファイルを自動保存するためのマクロをOutlookに保存

マクロを作成できたら、以下の手順でマクロをOutlookに保存します。

STEP
[開発]タブをクリックする

Outlookのマクロを使う事前準備その2 リボンに開発タブを表示するで表示させた[開発]タブをクリックしてください。

受信したメールの添付ファイルを自動保存するためのマクロをOutlookに保存
受信したメールの添付ファイルを自動保存するためのマクロをOutlookに保存
STEP
[Visual Basic]をクリックする

[開発]タブを開いたら一番左にある[Visual Basic]をクリックしてください。

受信したメールの添付ファイルを自動保存するためのマクロをOutlookに保存
受信したメールの添付ファイルを自動保存するためのマクロをOutlookに保存
STEP
[ThisOutlookSession]をクリックする

[Visual Basic]をクリックすると、上記のような画面が表示されます。

左上の枠の中にある[ThisOutlookSession]をクリックしてください。

受信したメールの添付ファイルを自動保存するためのマクロをOutlookに保存
受信したメールの添付ファイルを自動保存するためのマクロをOutlookに保存
STEP
作成したコードを貼り付けて上書き保存をクリックする

[ThisOutlookSession]の中に受信したメールの添付ファイルを自動保存するためのマクロを貼り付けてください。

貼り付け終えたら左上にある[上書き保存]をクリックしてください。

上書き保存ができたら右上の✕をクリックしてマクロの画面を閉じてください。

受信したメールの添付ファイルを自動保存するためのマクロをOutlookに保存
受信したメールの添付ファイルを自動保存するためのマクロをOutlookに保存

受信したメールの添付ファイルを自動保存するためのマクロを動かしてみる

このマクロを動かすのは非常に簡単です。

Outlookで送受信し、添付ファイルがあるメールを受信したら自動で添付ファイルを指定したフォルダーに保存してくれます。

例えば、20221124-情シスの自由帳.pdfという添付ファイルがあるメールをOutlookで受信した場合、指定したフォルダー内に20221125-1113_20221124-情シスの自由帳.pdfというファイルが保存されます。

保存されるファイル名の先頭についている20221125-1113_は受信した日時を指しています。
この場合は2022年11月24日11時13分に受信したという意味です。

その他Outlookに関する記事

その他Outlookに関する記事はこちらです。ぜひご覧ください。

最後までご覧いただきありがとうございました。
このサイトは情シスマンが半径3m以内のITに関する情報を掲載してるサイトです。
Windows系を主として、ソフトや周辺機器の操作や設定について画像も用いながらわかりやすく解説しています。

解説している内容に誤りがあった場合や、補足が必要な場合、もっと知りたい場合はこちらのお問い合わせフォームからご連絡ください。
個人の方を限定にサポートさせていただきます。

実行環境
Windows11 Home 24H2
64 ビット オペレーティング システム
11th Gen Intel(R) Core(TM) i7-11375H @ 3.30GHz 3.30 GHz
16.0 GB RAM
Microsoft 365

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメント一覧 (2件)

  • Outlookでメールの添付ファイルを自動保存する流れはなんとなくわかりました。
    ありがとうございます。
    上記の流れの中にエクセルファイルをcsv形式に変換して保存する場合のVBAを個人的に教えて頂きたいです。
    仕事で使いたい場面があって、あればすごく助かります。どうぞよろしくお願い致します。

    • こちらをプロセスに追加するのですが、全文を貼り付けてしまうと長くなりますので、メールでお送りさせていただきます。

      ' 一時的にファイルを保存
      objAttach.SaveAsFile attachFileName

      ' Excel形式のファイルならばCSVに変換
      If InStr(attachFileName, ".xls") > 0 Or InStr(attachFileName, ".xlsx") > 0 Then
      ' Excelアプリケーションを作成
      Set xlApp = CreateObject("Excel.Application")
      xlApp.Visible = False ' 非表示でExcelを開く

      ' ワークブックを開く
      Set xlWorkbook = xlApp.Workbooks.Open(attachFileName)

      ' CSVファイル名を設定(拡張子を一度だけ変換)
      If InStr(attachFileName, ".xlsx") > 0 Then
      csvFileName = Replace(attachFileName, ".xlsx", ".csv")
      ElseIf InStr(attachFileName, ".xls") > 0 Then
      csvFileName = Replace(attachFileName, ".xls", ".csv")
      End If

      ' 重複ファイル名のチェックと番号追加(CSV版)
      fileSuffix = 1
      Do While Dir(csvFileName) <> ""
      csvFileName = Replace(csvFileName, ".csv", "(" & fileSuffix & ").csv")
      fileSuffix = fileSuffix + 1
      Loop

      ' CSV形式で保存
      xlWorkbook.SaveAs csvFileName, 6 ' 6はCSV形式を指定する定数

      ' Excelを閉じる
      xlWorkbook.Close False
      xlApp.Quit

      ' 一時的に保存したExcelファイルを削除
      Kill attachFileName

コメントする

目次