【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自体は受信トレイを指しますのでそのままオブジェクトにセットすれば受信トレイを対象にすることができます。

<追加>添付ファイルの上書き保存の回避、期間指定をする方法

添付ファイルの上書き保存の回避、期間指定をする方法について別記事にまとめました。
上書き保存をさせたくない場合は、ご参考頂きたくお願いいたします。

【Outlook VBA】受信トレイの添付ファイルを一括保存する方法!期間指定も!

さいごに

いかがでしょうか。

今回は、

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

についてまとめました。

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

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

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



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

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








27 件のコメント

  • 迅速なご回答誠にありがとうございました。
    早速拝見させていただきました。そちらにもお礼と重ねての質問を入れさせていただいております。お手数ですが、よろしくお願いいたします。

  • たびたびすみません。先ほど、二回目が稼働しないと質問させていただいたものですが、稼働しました。なぜかマクロが有効になっておりませんでした。
    その件は解決したのですが、別件でご教示いただきたいことがございます。
    添付ファイルの名前が同じだと、重複するため一つの添付ファイルしか保存しないことが判明しました。日付と時間を入れる方法はございますでしょうか。
    ほかのところで検索かけてもわかりづらくこちらに投稿させていただきました。
    コードを教えていただくのと、どの部分に挿入するのかなど具体的にご教示のほどよろしくお願いいたします。不躾な質問で大変申し訳ございませんがよろしくお願いいたします。

  • 初めまして。コードをコピーさせていただき、早速作成したところ、うまく稼働したのですが、二回目から稼働しなくなりました。不躾ながらご教示いただくことは可能でしょうか。

    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(“8.集計”)

    ‘添付ファイルの保存先をパスで指定します。
    strPath = “C:\Users\●●●\Desktop\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
    稼働しない原因は、なにが考えられますでしょうか。

  • お返事ありがとうございます。

    共有フォルダは別の方(会社)にて共有にして全員が見える様にしている物です
    私は見る側になります。

    Web?というのは少しわかりませんが
    “C:\Program Files (x86)\Microsoft Office\root\Office16\OUTLOOK.EXE”を実行しています。

    アクセス許可レベル:参照者
    下記にチェックが付いてます
    アイテムの参照・フォルダーの表示・アイテムの削除(許可しない)

    フォルダーパスは、表示されていません。
    受信しているアドレスは下記になります。
    JP1@****-net.co.jp

    なんか出来なそうですね…
    無理な場合、このメールを自分の別のフォルダに受信したらコピーするみたいな事も無理なのでしょうか?
    質問攻めですみません、なんか別の質問になってしまいましたが

    • 別会社のフォルダ(別ドメインの可能性)かつ、パスが不明となると
      公開しているVBAでは対応が難しいかもしれません。

      なお、ご自身のフォルダ(受信トレイ配下)にあるものでしたら取得は可能ですので、
      その場合には以下のコードへ階層にあわせてフォルダ名を指定頂ければと存じます。

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

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

  • すごく参考になりました!ありがとうございます。
    初めて開発タブを開いてやってみました。
    指定フォルダー内に既に同じファイルがあり、上書き保存されてしまい焦りました(^^;)
    同じ名前のファイルがないときだけ保存するようにしたいのですが、どうしたらいいでしょうか?

    あと受信トレイにメールが多く、全て探してしまうので処理に時間がかかります。受信トレイの直近の何件かだけとか、今月来たメールだけとかもできますか?
    メールは共有なので勝手にフォルダー分けしたり移動ができません。

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

      こちらの記事へ、上書き保存の回避、期間指定をする方法についてまとめましたので、
      ご参考頂きたくお願いいたします。
      https://extan.jp/?p=8452

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

      また初実装で稼働までできたようでよかったです。

      同じ名前のファイルがあった場合の処理についてはフォルダにあるファイル名を取得しチェックする仕組みを設ければ可能かと存じます。
      ただし、処理件数が多ければ動作が重くなる可能性があります。

      次の取得対象を期間によって絞り込むことにつきましては、Restrictメソッドをつかうことにより可能です。
      こちらを使うと対象件数が減りますので処理スピードの改善も期待できます。

      こちらの2点については機能を追加する必要があるため、開発、検証後に記事に追記させて頂きたく、
      完了後に追ってご連絡させていただきます。

  • 質問よろしいでしょうか…
    受信フォルダ以下の保存はできました。
    ありがとうございます。
    共有フォルダ内のファイルを見る事はできますでしょうか?
    共有フォルダ¥受発注情報¥03_路線便出荷情報(ケース)
    という階層になっております。
    その中に添付付のメールが入ってきます。
    それを取り出す方法を色々と探し中です。
    もしも分かりましたら、よろしくお願い致します。

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

      共有フォルダ内の添付ファイルを取得する件につきまして、
      まず共有フォルダはWeb版の機能のことでよろしいでしょうか?

      その場合、別アドレスのメールボックスのフォルダとなり、
      公開しているコードでは個人のローカルの受信トレイ配下のフォルダを対象にしているため
      対応していない状況となります。

      ただし、メールボックスの対象フォルダに対してすべて参照できる権限があり、対象フォルダのフルパスがあれば取得することができますので
      対象フォルダのアクセス権(全詳細情報参照、もしくは全アイテムの編集がON)と、共有フォルダのフルパスをご確認頂けますでしょうか。
      ※アドレスは伏字で結構です。

      例:
      ¥¥***@***.co.jp¥受信トレイ¥****¥共有フォルダ¥受発注情報¥03_路線便出荷情報(ケース)

  • ご回答ありがとうございます。
    ■確認内容①を確認した所、「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分に指定し保存します。
      指定時刻にアラームが起動すると、指定したマクロが実行されます。

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

  • コメントを残す

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