【Outlook VBA】受信したメールの添付ファイルを指定フォルダへ保存する

Outlookの受信用フォルダを対象に添付ファイルを取り出したい場合はないでしょうか。

例えば月次ごとにフォルダが分かれていて、該当月フォルダの添付資料を取り出したいという時です。

そんな時、クリック一発でフォルダ内にある添付ファイルが取り出せたら効率がよいですよね。

今回は、

・受信メールフォルダのさらにサブフォルダにあるメールの添付ファイルを指定フォルダへ保存する方法

についてまとめます!

添付ファイル付きメールを格納するフォルダを作成する

以下のように第二階層目に添付用フォルダを作ります。


こんな感じでフォルダ名は用途に合わせて変更してください。

続いてマクロを実装しましょう。

マクロを設置する下準備をする。

以下を参考にVBAコードを配置する場所を表示させます。

Outlook VBAをはじめよう!初心者向け手引き

マクロを登録する

「開発」タブ>「Visual Basic」を押します。

「Visual Basic Editor」にて、[Project1] > [Microsoft Outlook Objects] > [ThisOutlookSession] を開きます。

以下のサンプルコードをコピーします。

Sub 添付ファイル保存()

    Dim objInbox As Object
    Dim objFolder As Object
    Dim strPath As String
    Dim i As Long
     
     
    Set objInbox = GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
    
    '添付ファイルがあるメールのフォルダを指定します。2階層以上ある場合は「.Folders.Item(<フォルダ名>)」を追加してください。
    Set objFolder = objInbox.Folders.Item("1.サブフォルダ").Folders.Item("1-1.サブフォルダ")
    
    '添付ファイルの保存先をパスで指定します。
    strPath = "C:\Users\extan\Documents\outlook_temp\"
     
    For Each objItem In objFolder.Items
        For i = 1 To objItem.Attachments.Count
            '添付ファイルに拡張子がある場合のみ処理します。
            If InStr(objItem.Attachments.Item(i), ".") <> 0 Then
                objItem.Attachments.Item(i).SaveAsFile strPath & objItem.Attachments.Item(i)
            End If
        Next i
    Next objItem
 
    Set objItem = Nothing
    Set objInbox = Nothing
    Set objFolder = Nothing
 
End Sub

VBEのコードエリアへ、コードを貼り付けて保存します。

マクロを実行する

早速添付ファイルが保存されるか確認をしてみましょう。

添付付きメールを二階層目の「1-1.サブフォルダ」へ移動します。

ソースコードを編集します。
添付ファイルがあるメールのフォルダを指定します。2階層以上ある場合は「.Folders.Item(<フォルダ名>)」を追加してください。

Set objFolder = objInbox.Folders.Item("1.サブフォルダ").Folders.Item("1-1.サブフォルダ")

添付ファイル保存先となるフォルダのパスを以下ソースコードの””内に指定します。

strPath = "C:\Users\extan\Documents\outlook_temp\"

タカヒロ
タカヒロ
パスの最後に「\」を付けるようにしてください。ない場合は添付ファイルは保存されません。

次にoutlook本体に戻り「開発」タブの「マクロ」>「添付ファイル」を押下します。

はい!添付ファイルが指定フォルダへ保存されましたね。

受信トレイ直下を指定し添付ファイルを保存する

これまでサブフォルダを指定してきましたが、次は受信トレイ直下を指定し添付ファイルを保存する方法についても説明をします。

変更箇所は以下の通りです。

■変更前

Set objFolder = objInbox.Folders.Item("1.サブフォルダ").Folders.Item("1-1.サブフォルダ")

■変更後

Set objFolder = objInbox

タカヒロ
タカヒロ
objInbox自体は受信トレイを指しますのでそのままオブジェクトにセットすれば受信トレイを対象にすることができます。

さいごに

いかがでしょうか。

今回は、

・受信メールフォルダのさらにサブフォルダにあるメールの添付ファイルを指定フォルダへ保存する方法

についてまとめました。

添付ファイルを手動で1件づつフォルダへドラッグアンドドロップするよりは手間はぐっと軽減されたかと思います。

このような自動化により普段の作業が楽になるばかりではなく資料を収集する場合にも有効ですね。

応用編としてはフォルダ指定先をyyymmddの日付フォルダを自動生成してその中に格納したり、添付ファイルリストと格納先へのハイパーリンクをExcelに出力したりとかいいかもしれません。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。



タカヒロ

タカヒロ
実質無料で読めるExcelVBA本についてまとめました。
もしVBA本購入を検討されていたら、どれだけお得か確かめてみてください。

【¥0】実質無料のExcelVBAおすすめ本25選!初級~中級まで網羅!

15 件のコメント

  • ご回答ありがとうございます。
    ■確認内容①を確認した所、「strPath &」のコードが抜けておりました。
    コードに「strPath &」を追加した所、指定フォルダに添付ファイルが保存されるようになりました。

    度重なる質問にご丁寧に回答いただき、誠にありがとうございました。

  • ご回答ありがとうございます。
    エクスプローラーのアドレス欄に指定のパスを入力し確認しましたが、やはり指定のフォルダには添付ファイルは保存されずにドキュメントのフォルダに保存されてしまいます。

    またデスクトップに指定のフォルダを作成し、マクロを実行した所、こちらもドキュメントに保存されてしまいました。
    “C:\Users\○○\Desktop\outlook_temp\”

    試しに、strPath = “C:\Users\○○\Documents\outlook_temp\”のコードを消してみたところ、それでも添付ファイルがドキュメントに保存されてしまいました??

    コードを書き込んだところは、Microsoft Outlook ObjectsのThisOutlookSessionです。

    • ご連絡ありがとうございます。
      頂いた内容から事象の再現ができました。

      「strPath」を含めない形にするとドキュメント直下に保存されることが確認できましたので、
      以下の点についてご確認頂きたくお願いいたします。

      ■確認内容①:以下のコードで「strPath &」が含まれているか、変数名が間違っていないかご確認頂きたくお願いします。
      objItem.Attachments.Item(i).SaveAsFile strPath & objItem.Attachments.Item(i)

      ※「strPath」がないとドキュメント直下に保存されます。
      objItem.Attachments.Item(i).SaveAsFile objItem.Attachments.Item(i)

      ■確認内容②:①で解消されない場合は、以下のようにSaveAsFileメソッドへ直接パスを指定しご確認頂きたくお願いします。
      objItem.Attachments.Item(i).SaveAsFile “C:\Users\○○\Desktop\outlook_temp\” & objItem.Attachments.Item(i)

      なお、コードの実装先はThisOutlookSessionで問題ありません。

  • ご回答ありがとうございます。

    おそらく指示を頂きました設定通りに行っていますが、やはりうまく指定フォルダに保存されません。
    自身が記載したコードを下記にコピーして添付してみました。
    strPath = “C:\Users\○○\Documents\outlook_temp\”

    Cドライブ以外はなく、Cドライブの設定でした。

    社内ネットワークの一端末でOutlookを利用しているのですが、何か関係がありますでしょうか?
    素人な質問ばかりで誠に申し訳ありませんが、ご教示お願い致します。

    • 前のご回答ではドキュメントのフォルダに保存されるということでしたので動きとしては問題ないかと存じます。
      そうしますとPCで見ているフォルダが指定パスと異なるところである可能性がありますので、
      エクスプローラーのアドレス欄に指定したパスをコピペした上、アクセスし添付ファイルがあるかご確認頂けますでしょうか。
      “C:\Users\○○\Documents\outlook_temp\”

  • 早速のご回答ありがとうございます。

    パスの最後に「\」を記載して、対象の指定フォルダに設定をしても、ドキュメントのフォルダに保存されてしまいます・・・。

    何か他に上手く作動しない要因が考えられますでしょうか?

    • ご連絡ありがとうございます。

      添付ファイルの保存までできるようになりましたので、VBAの設定は問題なさそうですね。

      おそらくドキュメント配下のフォルダを指定されているかと存じますので、
      ドキュメントアイコンを右クリックしてプロパティ>場所からドキュメント保管先パスと指定フォルダのパスをご確認頂けますでしょうか。
      例: ドキュメント保管先⇒C:\Users\<ユーザー名>\Documents
         指定フォルダ⇒C:\Users\<ユーザー名>\Documents\指定フォルダ

      また、Cドライブ以外(E,Fドライブなど)のフォルダがあれば指定の上ご確認頂けますでしょうか。
      例: F:\temp

      よろしくお願いいたします。

  • 現在、Outlookの業務化率化のためにこのサイト記載のコードを導入させて頂きました。

    添付ファイル保存先となるフォルダのパスについて質問があります。

    strPath = “C:\Users\extan\Documents\outlook_temp\”
    とコードを記載しましたが、エクスプローラーのドキュメントに添付ファイルが保存されてしまいます。

    outlook_tempのフォルダをドキュメント内に作成してみましたが、outlook_temp内に保存されません。

    サイト内のコードを利用させていただき、保存先のextanを自身が利用しているファイルに変更しています。

    またデスクトップに指定のフォルダを作成して、strPath =”C:\Users\○○\Desktop\指定のフォルダ”と変更してみましたが、指定のフォルダにも添付データが保存されません。

    コードの利用に関して、何か問題点がありますでしょうか?
    ご教示頂ければ幸いです。

    • いつもご利用ありがとうございます。

      指定フォルダに添付ファイルが保存されない件ですが、
      パスの最後に「\」が抜けている可能性がありますのでご確認頂けますでしょうか。

      ■変更前
      strPath =”C:\Users\○○\Desktop\指定のフォルダ”

      ■変更後
      strPath =”C:\Users\○○\Desktop\指定のフォルダ\”

  • タカヒロさん
    ご丁寧にご説明頂き、ありがとうございます。

    バッチファイル、予定アイテムのリマインダ(アラーム)を利用したマクロの自動化
    両方とも動作確認できました。

    どちらを運用すべきはまだ検討中ですが、これで業務効率化のフローに目途が立ちそうです。
    大変助かりました。有益な情報ありがとうございます!

  • 現在、業務化率化のためにVBA作成中なのですが、この記事を参考にさせて頂きました。
    プログラムの作成は大方完成できたのですが、不明な点があるので質問させて頂きます。
    作成したマクロを自動実行させたいのですが、可能でしょうか?
    Excelのマクロであれば、VBSとタイムスケジューラで実装可能なようですが
    outlookに関しては、情報がありません。
    仕様上Outlookでのマクロ自動化は難しいのでしょうか?
    可能な範囲でいいので、ご教授頂ければと思います。
    よろしくお願いします。

    • いろいろ調べていく中でbatファイルから起動できる方法がありましたので、追記致します。
      まず、任意の名前でbatファイル(****.bat)を作成します。
      以下を入力し、Outlook側に実装した実行したいマクロ名を入力し、保存します。
      start outlook.exe /autorun <実行したいマクロ名>

      あとはタスクスケジューラでbatファイルをスクリプトに指定すればOKです。

    • いつもご利用ありがとうございます。

      作成したマクロを自動実行する方法につきまして、
      タスクスケジューラから直接Outlookのマクロを指定し起動することはできませんので、
      代案として、Application.Reminderイベントを使用して、予定アイテムのリマインダ(アラーム)をトリガーに
      マクロを実行する方法をご提案いたします。

      サンプルコードは以下の通りです。
      Private Sub Application_Reminder(ByVal objItem As Object)

      Dim strItemSubject As String

      ‘予定アイテムの件名を指定します。
      strItemSubject = “<予定アイテムの件名を指定>”

      ‘予定アイテムの件名とアイテムのオブジェクトクラスが”olAppointment”(26番)だった場合の条件を設定します。
      ‘オブジェクトクラスの詳細は以下を参照してください。
      ‘https://docs.microsoft.com/ja-jp/office/vba/api/outlook.olobjectclass

      If objItem.Subject = strItemSubject And objItem.Class = “26” Then

      ‘起動したいプロシージャを指定します。
      Call <起動したいマクロ名を指定>
      End If
      End Sub

      このマクロをThisOutlookSessionに追加し、トリガーとする「予定アイテムの件名」と「起動したいマクロ名」を入力します。
      予定表へ予定アイテムの件名でアイテムを追加し、アラームを0分に指定し保存します。
      指定時刻にアラームが起動すると、指定したマクロが実行されます。

      よろしくお願いいたします。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です