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


これまで、MAPI や Outlook オブジェクト モデルなど基本的な部分の説明をしてきましたが、そろそろ実用的な記事も書かないと飽きられてしまうかもしれませんね。そこで、今回は Outlook に関する掲示板などでよく話題に出ると思われる、受信したメールの添付ファイルを自動保存するマクロについて書きたいと思います。

たとえば、毎日あるいは毎週必ず特定の人やシステムからレポートが添付ファイルとして送信されてくる、というようなケースがあります。それを自動保存するというような機能は残念ながら Outlook にはないのですが、マクロを使えばそのようなことが実現できるのです。

以下は、受信したメールの添付ファイルをすべて C:\Attachments というフォルダに保存するというマクロです。


' メール受信時に発生するイベント
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    Dim i As Integer
    Dim c As Integer
    Dim colID As Variant
'
If Instr(EntryIDCollection, ",") = 0 Then
        SaveAttachments EntryIDCollection
    Else
        colID = Split(EntryIDCollection, ",")
        For i = LBound(colID) To UBound(colID)
            SaveAttachments colID(i)
        Next
    End If
End Sub
'
' 添付ファイルの保存を行うサブ プロシージャ
Private Sub SaveAttachments(ByVal strEntryID As String)
    Const SAVE_PATH = "C:\attachments\"
    Dim objFSO As Object ' FileSystemObject
    Dim objMsg As Object
    Dim objAttach As Attachment
    Dim strFileName As String
    Dim c As Integer: c = 1
   
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objMsg = Application.Session.GetItemFromID(strEntryID)
'
' ここで条件指定
'
    For Each objAttach In objMsg.Attachments
        With objAttach
          
            strFileName = SAVE_PATH & objAttach.FileName
           
            While objFSO.FileExists(strFileName)
                strFileName = SAVE_PATH & Left(.FileName, InStrRev(.FileName, ".") - 1) _
                    & "-" & c & Mid(.FileName, InStrRev(.FileName, "."))
                c = c + 1
            Wend
           
            .SaveAsFile strFileName
        End With
    Next
    Set objMsg = Nothing
    Set objFSO = Nothing
End Sub


では、上記のマクロについて説明しましょう。
まず、メールを受信した際に何らかの処理を行うという場合、Outlook では Application_NewMailEx というイベントを使用します。このイベントが呼ばれる際に EntryIDCollection に受信したメールのエントリ ID が文字列として渡されますが、複数のメールを同時に受信した場合には、「,」で区切って複数のエントリ ID が渡されます。そこで上記の Application_NewMailEx では EntryIDCollection に「,」が含まれる場合には Split 関数で分割し、それぞれのエントリ ID について処理するという記述をしています。

そして、実際に添付ファイルの処理が行われるのは SaveAttachments です。最初の行の Const SAVE_PATH = で保存するフォルダを指定していますので、C:\Attachments 以外のフォルダに添付ファイルを保存したい場合はこの記述を変更してください。なお、変更の際にはフォルダ名の最後に \ をつけてください。
受信したメールを取得するには、Application.Session.GetItemFromID メソッドを使用します。GetItemFromID では引数としてメールの EntryID を指定しますが、これは Application_NewMailEx で EntryIDCollection として取得したものになります。
次に、取得したメールの添付ファイルにアクセスするには、Attachments コレクションを使用します。For Each で Attachments コレクションから Attachment オブジェクトを取得し、そのオブジェクトの SaveAsFile メソッドにより添付ファイルを保存します。
ここで注意しなければならない点は SaveAsFile メソッドは保存先にすでに同じ名前のファイルがあった場合に上書きしてしまうということです。
上記のマクロでは、While … Wend でファイルの保存先に同名のファイルがあるかどうかを FileSystemObject オブジェクトの FileExists メソッドにより確認し、存在した場合にはファイル名に -1、-2 というように数字をつけて上書きが発生しないようなファイル名にしています。

なお、このマクロの例では受信したすべてのメールの添付ファイルを保存しますが、特定の条件の場合だけ保存したということもあるでしょう。
その場合、「' ここで条件指定」のところに保存する条件を指定し、条件に合わない場合 Exit Sub で保存処理を行わずに終了するという記述を行います。
たとえば、「Report」という単語を件名に含むメールの添付ファイルだけを保存したいという場合は、以下のように記述します。

    If Not objMsg.Subject Like "*Report*" Then Exit Sub

このほか、メールの件名や日付をファイル名や保存フォルダに使いたいというような要望もあるかもしれませんが、マクロが複雑になっていくのでこの辺にしておきます。

もし、こんなマクロがあったら便利なのに、と思うようなものがあればコメントに書き込んでください。需要がありそうなものであれば対応します。

2009/12/22 追記:

Application_NewMailEx イベントはメッセージを Outlook で受信したタイミングで発生するイベントですが、Exchange サーバー環境で利用している場合、Outlook を起動していない間にサーバーで受信されたメッセージに対してはこのイベントが発生しません。

サーバーで受信されたメッセージに対しても添付ファイルの保存を行うには、自動仕分けのクライアント ルールで実行できるマクロを作成します。
具体的な手順は以下の通りです。

  1. 下記のようなマクロを記述します。このマクロは上記の Application_NewMailEx の代わりとなるものです。

    ' 添付ファイルの保存を行うサブ プロシージャ
    Public Sub SaveAttachments(objMsg As MailItem)
        Const SAVE_PATH = "C:\attachments\"
        Dim objFSO As Object ' FileSystemObject
        Dim objAttach As Attachment
        Dim strFileName As String
        Dim c As Integer: c = 1
    '   
        Set objFSO = CreateObject("Scripting.FileSystemObject")
    '
        For Each objAttach In objMsg.Attachments
            With objAttach
               '
                strFileName = SAVE_PATH & objAttach.FileName
                '
                While objFSO.FileExists(strFileName)
                    strFileName = SAVE_PATH & Left(.FileName, InStrRev(.FileName, ".") - 1) _
                        & "-" & c & Mid(.FileName, InStrRev(.FileName, "."))
                    c = c + 1
                Wend
                '
                .SaveAsFile strFileName
            End With
        Next
        Set objMsg = Nothing
        Set objFSO = Nothing
    End Sub

  2. 新しい自動仕分けのルールを作成します。
  3. 条件にマクロを実行したいメールについての任意の条件を設定します。すべてのメールで実行する場合には条件を指定する必要はありません。
  4. メッセージに対する処理で [スクリプトを実行する] をオンにし、[スクリプト] をクリックします。
  5. [スクリプトの選択] ダイアログで SaveAttachments を選択し、[OK] をクリックします。
  6. [完了] をクリックし、ルールの作成を終了します。


マクロの登録方法やメニューへの追加について

受信したメールの添付ファイルを自動保存するマクロ」への130件のフィードバック

  1. すごく参考になります。
    ファイルが重複しているときのファイル名の処理で
    Right(.FileName, InStrRev(.FileName, "."))
    で拡張子を付けてますが、これだと拡張子だけ取り出せてないような気がします。
    どうでしょう。

  2. outlook2002を使っています。
    Private Subから始まるメールの添付ファイル自動保存がうまくいきません。
    なぜでしょうか?

  3. 非常に便利なので、利用させていただいております。FAXをメール添付させるサービスを使っているので、特定のPCでそのメールを自動受信させ、このマクロで、フォルダに保存しています。その後、保存したフォルダの内容を印刷することをVBSで行っています。そこで、お聞きしたいのですが、別のアカウントで受信したメールの添付ファイルを別フォルダに保存する方法はありますか。件名や本文などに違いはありません。違いはアカウント名だけです。よろしくお願いします。

  4. To haem さんhttp://outlooklab.spaces.live.com/blog/cns!9D7EA61EC7DAA750!808.entry にアカウントごとのフォルダに保存するマクロを公開しました。

  5. アーカイバで圧縮されたファイルを解凍して保存することは可能でしょうか?圧縮されたファイルにはパスワードが設定されています。

  6. To 名前なしさんOutlook 自体には圧縮されたファイルを解凍するという機能はありません。アーカイブソフトでパスワードを指定して解凍する機能をもつものがあるなら、ファイルを保存した後、そのプログラムを実行することでご要望は満たせるのではないかと思います。VBA 内で別のプログラムを起動する方法については、http://msdn.microsoft.com/ja-jp/library/cc364421.aspx をご覧ください。

  7. 本ページのような例を探していたので、非常に参考になります。実はこのサンプルを元に企業で利用しているOutlookにマクロを作成しようとしたのですが、なぜかマクロ登録されません。ちなみにOutlook2007を利用しています。サンプルから変えた点は保存先フォルダの指定の箇所のみです。企業PCなので非管理者権限ではあるのですが、そのことは関係するでしょうか?一応補足しますと、Hell~~のマクロは作成もでき、実際にマクロも実行できます。もしお気づきのことがあれば教えてください。

  8. To 剛さんこの記事で公開されているマクロは、Outlook がメッセージを受信したときに自動的に起動されるものであり、手動で実行することを想定していません。そのため、Private Sub としていますが、Private Sub として定義したものは [ツール]-[マクロ]-[マクロ] には表示されません。しかし、実際にはメッセージの受信のたびに実行されるはずです。

    • Millefeuille さん、
      大変便利に活用させて頂いております。ひとつお聞きしたいことがあります。
      そのまま、コードを入れましたですが、メールの受信のさいには、自動的ダウンロードしなかった。原因は何処ですか。

  9. 大変便利に活用させて頂いております。ひとつお聞きしたいことがあります。PCの電源を入れているときは正常に動くのですが、PCを起動する前に来ていたメールの添付ファイルに対して動いてくれないのですがどうしてでしょうか?

  10. To teru さんApplication_NewMailEx イベントはメッセージを Outlook で受信したタイミングで発生するイベントですが、Exchange サーバー環境で利用している場合、Outlook を起動していない間にサーバーで受信されたメッセージに対してはこのイベントが発生しません。Exchange サーバー環境でも動作するようにクライアント ルールで添付ファイルを保存するための方法を追記しましたので、こちらをお試しください。

  11. サンプルとても参考になりました。件名にtest* (*は日付となります。)がある場合、添付ファイルを自動保存するということで作り変えてみました。\’ 添付ファイルの保存を行うサブ プロシージャPrivate Sub SaveAttachments(ByVal strEntryID As String) Const SAVE_PATH = "D:\\test\\" Dim objFSO As Object \’ FileSystemObject Dim objMsg As Object Dim objAttach As Attachment Dim strFileName As String Dim c As Integer: c = 1 Dim sw As Integer: sw = 0 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objMsg = Application.Session.GetItemFromID(strEntryID) \’ ここで条件指定 If objMsg.Subject Like "test*" Then sw = 1 End If \’If objMsg.Subject Like "任意文字を記入" Then \’ sw = 1 \’End If If sw = 1 Then For Each objAttach In objMsg.Attachments With objAttach strFileName = SAVE_PATH & objAttach.FileName While objFSO.FileExists(strFileName) strFileName = SAVE_PATH & Left(.FileName, InStrRev(.FileName, ".") – 1) _ & "-" & c & Mid(.FileName, InStrRev(.FileName, ".")) c = c + 1 Wend .SaveAsFile strFileName End With Next End If Set objMsg = Nothing Set objFSO = NothingEnd Subこの動作のあと、保存された添付ファイルのsheet1の行3~行100までをコピーし、xyz.xlsのdata(シート名)の行3~行100に貼り付けを行いたいのですが上記マクロに組み込めますか?添付ファイルは、変数となります。(*abc*.xls)

  12. To 名前なしさんSaveAs で保存した後、Set objBook = GetObject(strFileName)とすれば、保存した Excel のファイルを WorkBook オブジェクトとして取得できます。同様に、Set objDstBook = GetObject("C:\\xyz.xls")とすれば、コピー先の Excel ファイルも WorkBook オブジェクトとして取得できます。あとは、Excel のオブジェクト モデルを使ってコピー・ペーストすることでご要望は満たせると思います。

  13. こんにちは、はじめまして上記のマクロを利用させていただいておりますが、ひとつ要望があります。添付されてきたファイルの名前を差出人の名前変えて、添付ファイルの拡張子はそのまま保存する方法を教えてください。VBAを習い始めて間もないのでよろしくよろしくお願いいたします。

  14. To kodure ookami さんファイルの名前を差出人に変えてしまってよいのでしょうか? そうするとひとつのメールに複数の添付ファイルが追加されていた場合、全部同じ名前になってしまいますが。ファイル名の前に差出人の名前をつけるということであれば、以下のようにファイル名の前に objMsg.SenderName を追加すると良いでしょう。 strFileName = SAVE_PATH & objMsg.SenderName & "-" & objAttach.FileName

  15. はじめまして、こんにちは。上記でご紹介いただいているVBAを利用させていただこうと思い、
    会社でExchange Server経由で使用しているOutlookのMacroに登録してみました。

    Email受信のたびに(添付が付いていても付いていなくても)Error Message(Compile Error: ByRef argument type mismatch)と保存済みのVbaProject,OTMが表示され、
    「メール受信時に発生するイベント」内の”Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)が黄色くハイライトされ、
    その下の”EntryIDCollection”が反転します。また、そのEditorをCloseしようとすると”This command will stop the debugger.”というメッセージも表示されます。

    英語環境で申し訳ないのですが、ヘルプ(http://office.microsoft.com/client/helppreview.aspx?AssetId=HV808058729990&lcid=1033&NS=OUTLOOK%2EDEV&Version=12&queryid=&respos=1&HelpID=vblr6%2Echm1040077)を読んでも良くわかりません。

    解決策はありますでしょうか。どうぞよろしくお願いいたします。

    • NewMailEx の引数は ByVal EntryIDCollection As String のはずなのですが…
      一度、その定義を削除し、Visual Basic Editor のコード編集を行うウィンドウの上部に “(General)” と表示されているドロップダウンから “Application” を選択し、さらにその隣のドロップダウンで “NewMailEx” を選択してください。
      すると、コードウィンドウに Application_NewMailEx の定義が書き込まれます。
      その時点で一度メールを受信してみて、エラーが出なければそのモジュールの中身を上記のマクロのものに置き換えてください。

  16. ご教示ありがとうございました。仰られたとおり書き直したらWorkしはじめました。本当にありがとうございます。

  17. たびたびすみません。再度ご質問させていただきます。

    上記マクロのクライアントベースでの稼動はうまく行きましたが、2009/12/22追記分のExchange Server環境でのマクロ設定が良く理解できません。
    「添付ファイルを保存するサブプロジージャー」部分を上記オリジナル文から追記文に置き換えるのでしょうか?それとも追記分を書き足すのですか?
    また「下記のようなマクロを記述し、自動仕分けのクライアント ルールで [スクリプト] アクションとして “SaveAttachments” を指定します。」とはどうすればよいのでしょうか?

    よろしくお願いします。

      • 詳細手順の追記、ありがとうございました。このスクリプト付きの新しいルールを作成し、正常動作を確認できました。

        しかし、ルールのところのルール名の後ろに(client-only)と出ており、Outlook起動中しかこのルールは適用されないとのダイアログボックスが表示されます。
        ということは、やはりOutlook起動中に受信したメールにしかこのルールは適用されないのでしょうか。

        とは言っても、朝オフィスに来てOutlookを立ち上げれば、その時点で新しいメールを受信するので、そのタイミングで添付ファイルを指定フォルダーに保存できれば大きな問題はないのです。
        がしかし、例えば夜自宅でBlackberry等でServer上のメールを開いてしまうと、朝Outlookを立ち上げたときに受信済メールとなっているため、このルールおよびスクリプトが発動しないのでは、とも思っています。

        数日様子を見てみることにします。たびたびありがとうございました。

      • クライアントルールは確かにクライアントが起動されていないと実行されないルールですが、Exchange サーバーでメールを受信した際にクライアントルールに合致するメールがあると、その情報がメールボックス上の遅延処理フォルダという隠しフォルダに保存されます。
        そして、Outlook は起動後に遅延処理フォルダにある未処理のメールに対してクライアント ルールを実行するため、Outlook が接続されていない状態で受信したメールであってもクライアントルールは適切に実行されます。

  18. Outlook2010で、仕訳ルールによちスクリプトを起動しております。
    しかし、メールを受信したタイミングで、日に何度か、ルールでエラーが発生します。
    何か原因は考えられますでしょうか?

    • おそらくはマクロで受信メールを処理する際に何らかのエラーが発生しているのではないかと思います。
      Public Sub SaveAttachments(objMsg As MailItem) の下に以下の 1 行を追加してみてください。

      On Error Resume Next

      • ご回答ありがとうございます。
        お教えいただいた内容を実施したり、処理を何もしないDummyにしてみたりしましたが、ダメでした。
        すみませんが、なにか対処方法をお教え下さい。

      • 何もしないマクロでもエラーになるということでしょうか?
        そうなるとちょっとマクロが原因とは思えませんね。
        アドインなどの影響があるのかもしれません。

  19. 大変参考になる情報をありがとうございます。当方、複数の携帯電話から送られてくる写メールをoutlookで受信し、JPEGの添付ファイルを自動印刷させる方法を思案しております。その場合、自動保存させないでoutlookから直接印刷できるようなマクロがあるのでしょうか。お手数ですがお教え頂ければ幸いです。

  20. 部署内での代表アドレス(Exchangeサーバー環境)で上記スクリプトを利用させていただいております。OS等はXP+Outlook2003、Win7+Outlook2010の混在です。日替わりで4・5名のメンバーが同一業務を担当しており、メールの受信状況等が常に同一であってほしいため、フォルダをLAN上の共有フォルダに置いています。MSでは動作保証外とのことですが、メール受信状況・フォルダの振り分けは各PCでうまく動作しています。ところが、添付ファイルの保存については、XP+OL2003のPCで実行されません。OL2010で保存したスクリプトを共有フォルダへエクスポートし、OL2003のPCでインポートしています。移行の際、何か特別な処理が必要ですか?思い当たる点等がありましたら、ご教示お願いいたします。長文でのお願い失礼いたしました。

      • そういえば、デジタル署名はOL2010のPCのみ設定していると思います。
        すべてのPCで設定が必要ですか?

      • 了解いたしました。本日、設定した上で動作を確認いたします。
        ご回答ありがとうございました。

      • 動作確認いたしました。OUTLOOK2003の3台中2台はOKでしたが、1台で添付ファイルの保存ができませんでした。デジタル署名は設定済です。予想される問題としては何が考えられますか?
        何度も申し訳ありませんが、よろしくお願いいたします。

      • 考えられるのは、以下のいずれかです。
        ・マクロが何らかの理由で実行されていない
        ・マクロは実行されているがファイルの保存で問題が発生している
        ・メッセージがルールで受信トレイ以外に振り分けられている

        まずは受信トレイ以外に振り分けられていないかご確認ください。
        受信トレイに配信されているなら、マクロをデバッグしていく必要があると思います。

  21. 日々活用させていただいております。ありがとうございます。
    教えていただきたいのですが、上記の受信時ルールでスクリプト実行マクロを設定しているのですが、受信したメールの添付ファイル(abc.zip)に送信日時の名前を付けてabc_yyyymmdd.zipのように保存することは可能でしょうか? その際には、圧縮もとのファイル(abc.xls)もabc_yyyymmdd.xlsのようにしておきたいです。

    自分では、
    dim myfilename as string
    set myfilename = objFSO.senton
    strFileName = SAVE_PATH & Left(.FileName, InStrRev(.FileName, “.”) – 1) & “-” & myfilename & c & Mid(.FileName, InStrRev(.FileName, “.”))
    を記述すれば少なくとも圧縮ファイルのファイル名変更が可能かと思いきやうまく動きません。オブジェクトの扱い方に問題があるような気がします。
    お手数ですが、教えていただけると幸いです。

    • まず、上記のマクロをベースとする場合、送信日時は objFSO ではなく objMsg の SentOn として取得する必要があります。
      そして、SentOn で取得した日付は / や: のようにファイル名として使用できない文字を含んでいるため、それらを取り除く必要があります。
      以下の記述を変更してみてください。

      変更前:
      strFileName = SAVE_PATH & objAttach.FileName

      変更後:
      strFileName = SAVE_PATH & objAttach.FileName
      strFileName = Left(strFileName,InstrRev(strFileName,”.”)-1) & Format(Now,”yyyymmdd”) & Mid(strFileName,InstrRev(strFileName,”.”))

      • なお、ZIP ファイルの場合、ファイル自体の名前は変更できたとしても、その中に含まれるファイルの名前まで変更することはできません。

  22. 昨日このイベントを使わせて頂き、正常に動いたのですが、本日朝より動かなくなってしまいました。何か原因がありますでしょうか

  23. 受信されしまっているすべてのメールに添付されている、添付ファイルを一斉に、自動保存はできませんか?

  24. イベントを設定させて頂き、テスト的に保存できるか確認しました。
    上記のマクロで保存先のフォルダー名の変更と件名に「テスト」を含むメールの添付ファイルだけ保存する記述を追加しました。
    添付ファイルは指定フォルダーに保存されたのですが、下記でデバックが出てしまいます。
    Set objMsg = Application.Session.GetItemFromID(strEntryID)
    何が原因なのでしょうか?
    教えて頂けたら幸いです。

    • ファイルが保存されているということはマクロは正常に動作しているようですが…
      どのような記述を追加されたのでしょうか?

  25. こちらのコードをマクロにコピペして記述しました。指示どおりに、実行させたいのですが、実行の際に当該のマクロがプルダウンに現れません。
    こちらのコードをマクロにコピペした後は、どのような手順を踏めばよろしいのでしょうか。

    • この記事で公開されているマクロは、Outlook がメッセージを受信したときに自動的に起動されるものであり、手動で実行することを想定していません。そのため、Private Sub としていますが、Private Sub として定義したものは [ツール]-[マクロ]-[マクロ] には表示されません。しかし、実際にはメッセージの受信のたびに実行されるはずです。

  26. こんにちは。
    添付ファイルの保存は出来ました。ありがとうございました。
    保存後、保存した添付ファイル(エクセル形式の注文書)の印刷も行いたいのですが、
    方法がわかりません。(VBAはこれから勉強を始めるところです。)教えて頂けないでしょうか?

  27. 昨日コメントを残したものです。
    追加の質問です。
    印刷後印刷済みファイルは別フォルダへ移動の方法も教えてもらえると助かります。
    ほとんど無知の状態なのですが、急遽社内でその様な仕組みを作る必要があり質問させてもらっています。
    お客様から受けた注文メールの処理です。
    どうぞ宜しくお願い致します。

  28. はじめまして、こんにちは。大変便利に活用させて頂いております。毎日2つの違う件名のメール(添付ファイル付)を受信していて、添付ファイルをそれぞれ違う場所に保存したいのですが、可能でしょうか?

  29. はじめまして。『受信したメールの添付ファイルを自動保存するマクロ』大変便利で活用させていただいております。
    メール本文に添付ファイルの”受信枚数”が記載されているのですが、この”受信枚数”にて添付ファイルの保存先を変更したいのですが可能でしょうか?

    メール本文
    ”受信枚数   1枚”→ C:\attachments\ に自動保存
    ”受信枚数 ※枚” → C:\attachments1\ に自動保存
    ※添付ファイルが1枚以外

    アウトルック2007を使用しております。

      • ご連絡有難うございます。はい。
        受信枚数が 2枚以上であればすべて c:\attachments1\ 以下に保存でお願いします。

  30. はじめまして。
    添付ファイルを指定フォルダへ保存するマクロで確認させてください。
    一番最初に記載されていますマクロ すなわち、

    ‘ メール受信時に発生するイベント
    Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
               ・
               ・
               ・
               ・
    Set objFSO = Nothing
    End Sub

    を、ペーストさせていただき、保存先フォルダを変更させて、ツールーマクロ
    ーマクロで実行しようとしていますが、マクロ名(M)に何も表示されないの
    で実行(R)が押せません。

    この件で同じような説明をされている方がいらっしゃいましたが、

    Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)

    Public Sub …

    に変更すれば、マクロ名(M)に表示されるようになり、実行できるようにな
    るのでしょうか。

    申し訳ございませんが、よろしくご指導お願いします。

    CAT

    • この記事で公開されているマクロは、Outlook がメッセージを受信したときに自動的に起動されるものであり、手動で実行することを想定していません。そのため、Private Sub としていますが、Private Sub として定義したものは [ツール]-[マクロ]-[マクロ] には表示されません。しかし、実際にはメッセージの受信のたびに実行されるはずです。
      もし、受信時に自動処理するのではなく、過去に受信したメールの添付ファイルを保存したいということであれば、別途マクロを作成する必要があります。

      • 首記の件、お礼がおそくなり申し訳ございません。
        そして、ご教示有難うございました。

        ところで、何度も申し訳ございませんが、では、最上に
        記載されている、例のマクロのPrivate Sub…をそのま
        まペーストして保存すれば、受信のために添付ファイル
        は自動的に指定フォルダへ保存されるということでしょ
        うか。

        何回も申し訳ございませんが、ご教示お願いします。

        CAT

      • そうです。
        このマクロはメールを受信したときに Outlook が自動的に実行するものであり、ユーザーがマクロのメニューから実行することはできません。

      • 首記の件、ご教示いただき有難うございました。
        またまた、何度で申し訳ございませんが、受信したときに Outlook が自動的に実行する
        ということは、エディター上に上記マクロをペーストして、保存するればOutlookを起動
        するたびにマクロが実行してくれるということでしょうか。

        また、ツールバー上に実行ボタンを追加して、上記マクロを手動で動かすことは可能で
        しょうか?
        マクロの修正が必要だとは思うのですが、どのようなマクロになるのかご教示いただけ
        れば幸いかと存じます。

        CAT

      • このマクロを一度登録しておけば、Outlook が起動している間に受信したメールは自動的にこのマクロにより処理されるようになります。
        また、このような処理を手動で実行するためには、マクロの書き換えが必要となります。
        作成しますのでしばらくお待ちください。

      • 何度も申し訳ございません。
        なんとか保存できるようにはなりましたが、件名設定のところだけ
        ご教示願います。

        If Not objMsg.Subject Like “*Report*” Then Exit Sub

        を追加すればと記載されていますが、
        それ以降の、

        For Each objAttach In objMsg.Attachments
        With objAttach

        strFileName = SAVE_PATH & objAttach.FileName

        While objFSO.FileExists(strFileName)
        strFileName = SAVE_PATH & Left(.FileName, InStrRev(.FileName, “.”) – 1) _
        & “-” & c & Mid(.FileName, InStrRev(.FileName, “.”))
        c = c + 1
        Wend

        .SaveAsFile strFileName
        End With
        Next
        Set objMsg = Nothing
        Set objFSO = Nothing
        End Sub

        は、最後のEnd Subのみ生かして、ほかは’ で止めて実行
        すれば、いいのでしょうか?
        どうか、ご教示願います。

      • If 文の条件に指定している Not objMsg.Subject Like “*Report*” というのは、「Report という文字列を件名に含まない」という意味です。
        そのため、以下の1行を追加すると、Report という文字列を件名に含まない場合には Exit Sub によりそれ以降の処理が行われなくなります。

        If Not objMsg.Subject Like “*Report*” Then Exit Sub

        したがって、それ以降の処理に何か手を加える必要はありません。

  31. こちらのマクロを使わせて頂いております。ありがとうございます。

    PC上のOutlookでこちらのマクロが動作する事を確認しておりますが、他の端末で同じアカウントにアクセスしてメッセージを既読状態にしてしまうと、
    他の端末のOutlookで同アカウントの既読メッセージをサーバーから受信する場合にはこのマクロが適用されないようです。

    既読メッセージでもマクロを組んだOutlook上で受信する場合に適用させたいのですが、どのようにすればよろしいでしょうか。

    • サーバーにはExchangeサーバーをお使いなのでしょうか?
      その場合、「2009/12/22 追記: 」以降の記述の通り、自動仕分けのルールとして動作するマクロのほうをご使用ください。

  32. こんにちは。最近マクロの勉強を始めた者です。こちらのマクロを活用させていただき、outlook2007のExchangeサーバーで受信されたメールの添付ファイルの自動保存と自動印刷ができるようになりました。質問ですが、メールの添付ファイルがpdfやexcelの場合はそのまま印刷、メールの添付ファイルがメッセージファイルで、そのメッセージファイルにpdfファイルが添付されてる場合は、メッセージファイルを開いて、pdfファイルの自動保存と自動印刷を行うようにしたいのですが、何か良い方法はありますでしょうか。

  33. 毎日スキルを磨くために、このサイトで勉強させてもらってる
    新人のnakamuraです。

    大変申し訳ございませんが、添付ファイル込みのメールが、
    個人用のあるフォルダへ20件格納されています。

    それを、マクロ起動して、指定フォルダへ添付ファイルのみ
    保存したいのですが、参考になるようなサンプルソースもし
    くはマクロをご教示願えませんでしょうか。

    申し訳ございませんが、助けていただきたく。

  34. 『受信したメールの添付ファイルを自動保存するマクロ』を利用させていただき、大変助かっております。
    今回、また別のPCに同様のマクロを登録したのですが、1台だけ動作しません。セキュリティ等のメッセージやエラーのポップアップ等は出ません。
    OSはwin7-pro(64bit)で、アウトルック2013です。win7-pro(32bit)のアウトルック2013とwin7-pro(64bit)のアウトルック2010はちゃんと動いています。
    マクロの問題ではなく、PC個体の設定等の影響かと素人的に思いますが、『コントロールパネル』の『管理ツール』の『サービス』等で、
    何かが『開始』になっていないとこのマクロが有効にならない等はありますでしょうか?
    他にどこか調べるところがあれば教えてください。よろしくお願いいたします。

  35. こちらを参考にさせて頂き、添付ファイルの自動保存を利用しています。
    Outlook2010からOutlook2016にアップグレードした際に機能しなくなったのですが、「MailItem」と「Attachment」を「Outlook.MailItem」と「Outlook.Attachment」 (Outlook.を追記)にしたところ、正常に動作するようになりましたので、ここにコメントを残させて頂きます。

  36. いつもありがとうございます。
    「受信したメールの添付ファイルを自動保存するマクロ」を使用させていただいています。

    追加機能として、自分が送付したメールの添付を自動保存から除外するマクロを教えていただけませんでしょうか。
    VBA初心者で、色々試してみましたが、出来ませんでした。
    お力をお借りできますと幸いです。(グループアドレス等に送信する場合、自分にもメールが入るので、その際除外できればと考えています。)

  37. 「受信したメールの添付ファイルを自動保存するマクロ」をそのまま便利に利用させて頂いております。
    感謝申し上げます。マクロド素人の私です、一つ質問があります、出来ましたらご教授ねがいます。
    「ここで条件指定:If Not objMsg.Subject Like “*Report*” Then Exit Sub」を複数の条件指定する場合はどうするのか?お教えながいますか。

    • 複数の条件を指定したい場合、以下のいずれかの方法があります。(例は件名に Report か Test を含む場合は保存しない場合です。)
      a) それぞれの条件を指定した If 文を複数用意する
      例: If Not objMsg.Subject Like “*Report*” Then Exit Sub
      If Not objMsg.Subject Like “*Test*” Then Exit Sub
      b) 条件を OR で接続する
      例:
      If (Not objMsg.Subject Like “*Report*”) Or (Not objMsg.Subject Like “*Test*”) Then Exit Sub

  38. 大変参考にさせていただいております。

    初心者なもので、大変恐縮ですが、教えてください。

    元の添付ファイルのファイル名:abc

    保存したいファイル名:yyyymmdd_01_abc
    (年月日_その日の受信の連番(2桁)_添付ファイル名)

    としたい場合、どうしたらよろしいでしょうか?

    何卒よろしくお願いします。

  39. お世話になります。『受信したメールの添付ファイルを自動保存するマクロ』を活用させていただいております。「添付ファイルとして転送」として受け取ったメール、つまり、受信メールに添付された「.msg」ファイル、この中に添付されたファイルを保存することはできないでしょうか。添付の添付、みたいなものにアクセスするステートメントがあれば教えて頂きたいです。宜しくお願い致します。

  40. いつもお勉強させていただいています。ありがとうございます。
    以下、初歩的ですがエラーもしくはマクロが反応しない場合の原因を追加させていただきます。

    1. vbaが反応しない
       →仕訳の順位を一番上にあげて、スクリプトを読ませる優先度を最上位にしてください

    2. エラーが発生する
       →フォルダを操作中にvbaを読み込んでしまうとエラーが起きるようです。おそらくアクティブなフォルダが変更されるためだと思います。

    ご参考までに

  41. お世話になります。
    いつも参考にさせていただいています。
    受信をトリガーとし、メール自体を.msgファイルとして保存する場合はどのようになるのでしょうか?

  42. はじめまして、「受信したメールの添付ファイルを自動保存するマクロ」をさっそくつかわせていただきましたが、テストでJPGを添付したメールを受信(Outlookのすべての送受信より)してもうまく動作できませんでした。
    環境:WINDOWS7 OUTLOOK2013

    マクロを一時有効化(非推奨)にして
    上記マクロのを標準モジュールに貼り付け、SAVE_PATH以下の保存先を任意の…¥test¥に変更しました。
    EXCHANGEの環境ではありません。

    他の
    Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)を使ったマクロも動作できなかったので、設定もしくはそもそもの手順が違うかもしれませんが、何かヒントがほしいと思いコメントさせていただきます。

  43. これはOUTLOOK2010で動くんですか?
     For Each objAttach In objMsg2.Attachments
    のあと
    Set objMsg = Nothing
    に行きますけど。

  44. 大変参考にさせていただいております。

    初心者なもので、大変恐縮ですが、教えてください。

    メールの件名によって、各フォルダーを自動的ダウンロード
    件名:2018年10月  → 2018年10月のフォルダ
    件名:2018年11月  → 2018年11月のフォルダ

    としたい場合、どうしたらよろしいでしょうか?

    何卒よろしくお願いします。

    • すみませんが、フォルダーを自動的にダウンロードというのがちょっとわかりませんでした。
      そのフォルダーはどこにあるのでしょうか?
      またダウンロードは手作業の場合、何を使ってますでしょうか?

  45. Exchange サーバー環境で利用していますが、先日micro softのパッチにより、仕分け機能でスクリプトを読み込ませる機能が使用できなくなりました。パッチによる制限を避けるためレジストリの変更を検討しましたが、セキュリティが低下するため断念、またVSTOを使用してvbaを起動することも検討しましたが、コスト面から断念しました。
    その他対応策があればご教示ください。

    • 残念ながら、メール受信時に VBA を実行する必要があるなら、レジストリ設定を行ってルールでスクリプトを実行するという方法以外にはありません。

  46. こちら大変参考にしております。
    素人質問で恐縮なのですが、保存条件の指定について
    件名”A” → フォルダ”a”
    件名”B” → フォルダ”b”
    件名”C” → フォルダ”c”

    というように、件名に複数の条件指定をし、その条件ごとに保存するフォルダを変えたい場合はそういうコードを書ければよいのでしょうか?
    ご教授宜しくお願いいたします。

  47. お世話になっております。

    添付ファイルを自動保存するマクロを利用させていただいています。

    メールに保存したいExcelファイルと同時に、図が貼り付けてある場合(Excelのシートをコピーして図として貼り付け)、下記の部分でエラーとなります。

      strFileName = SAVE_PATH & objAttach.FileName

    図は無視して、Excelファイルのみ自動保存するマクロにする変更をご教示ください。

    なお、保存したいファイル名には ”PDD****”という特定の文字列が入っています。

  48. お世話になっております。

    自動保存マクロを利用させていただいており、たいへん助かっております。

    質問なのですが、メールの件名のフォルダをデスクトップ上に作成し添付の保存をメール毎繰り返す。ということは可能でしょうか?
    もし可能であればご教示頂けたらと思います。
    よろしくお願い致します

  49. いつも活用させていただいています。ありがとうございます。

    質問させてください。
    メールの件名によって保存場所を変えたくて、「SAVE_PATH」を変数として宣言してから
    If、ElseIfをつかって条件ごとにSAVE_PATHに入れるパスを変えるようにしています。
    最初うまくいっていたのですが、途中から
    Set objMsg = Application.Session.GetItemFromID(strEntryID)

    For Each objAttach In objMsg.Attachments
    の部分で「処理に失敗しました。オブジェクトが見つかりません。」のエラーが出て動かなくなってしまいました。

    「ここで条件指定」のすぐ上に
    「 If objMsg.Subject Like “該当文字” Then
    SAVE_PATH = “ファイルパス1”
    ElseIf objMsg.Subject Like “該当文字” Then
    SAVE_PATH = “ファイルパス2”
    Else
    Exit Sub
    End If」
    の記述を追加しています。

    ご教示いただけますと幸いです。
    よろしくお願いいたします。

    • 追記です。
      別ページに「受信したメールの件名の文字列により異なるフォルダーへ自動的に添付ファイルを保存するマクロ」がありますが、そこのコメントに「複数受信した場合最後のメールの添付ファイルしか保存されない」とあり
      解決していないようなのでこちらで質問させていただきました。

  50. 初めまして。「受信したメールの添付ファイルを自動保存するマクロ」を大変便利に活用させていただいております。
    添付ファイルを2か所に保存するということは可能でしょうか?

    • 可能です。
      まず、以下のようなコードを Const SAVE_PATH =… の次に追加します。

          Const SAVE_PATH2 = “C:\attachments2\”

      そして、以下のようなコードを End With の前に追加します。

                  strFileName = SAVE_PATH2 & objAttach.FileName
                  While objFSO.FileExists(strFileName)
                      strFileName = SAVE_PATH2 & Left(.FileName, InStrRev(.FileName, “.”) – 1) _
                          & “-” & c & Mid(.FileName, InStrRev(.FileName, “.”))
                      c = c + 1
                  Wend
                  .SaveAsFile strFileName

  51. はじめまして。コメント失礼いたします。
    「受信したメールの添付ファイルを自動保存するマクロ」をいつも活用させていただいております。
    とても助かっており、ありがとうございます。
    今般、添付ファイルが複数のexcelで、さらに各Bookに複数シートがあります。
    シートをすべて印刷後、Bookを保存するのですが、印刷がActivesheetのみになってしまいます。
    また、可能であれば、各シートを拡大縮小してA4用紙1枚に印刷したいと考えております。
    すべてを1枚で印刷するにはどのようにしたらよいでしょうか。
    (Bookの保存はできております。)
    ご教示いただけますと幸いです。よろしくお願いいたします。

    • 上記一部訂正いたします。
      (誤)すべてを1枚で  (正)すべてをA4用紙1枚ずつで
      以上、よろしくお願いいたします。

    • 残念ながらExcelの印刷の制御はOutlookのマクロではできません。
      Excelのマクロなら可能かもしれませんが、私にはExcelマクロが専門外なので、実現可能かもちょっとわかりませんでした。

  52. いつもお世話になっております。是非ご教示いただければ助かります。

    いままで一個のメールにおいて、自動保存の処理を行っておりました。

    今後の件名の異なる他のメールについても、自動保存の処理を入れようと検討しております。

    受信したメールの件名の文字列により異なるフォルダーへ自動的に添付ファイルを保存するマクロを参考にしたいのですが、下記 FOLDER1にはそのまま添付ファイルの名前が保存される、FOLDER2には添付ファイル+受信日の日付といったように、異なる処理を行うにはどのような記述を追加すべきでしょうか。
    宜しくお願い申し上げます。

  53. 初めまして。コメントさせていただきます。
    添付ファイルがzipファイルの時のみ(拡張子が.zip)に保存するようにするにはどのようにすればよいでしょうか。
    ご教授いただけれ

    • すみません。途中で切れてしまいました。
      ご教授いただければ幸いです。
      よろしくお願いいたします。

  54. ご多用のところ恐れいります。
    見落としていたら申し訳ございませんが、
    「受信したメールの添付ファイルを自動保存するマクロ」について
    条件のところをご教授いただけましたら大変ありがたいです。

    「Report」という単語を件名に含むメールの添付ファイルだけを保存したいという場合は、以下のように記述します。
    If Not objMsg.Subject Like “*Report*” Then Exit Sub
    とありました。

    こちらを
    「Report」という単語をファイル名に含むメールの添付ファイルだけを保存したいという場合はどのように書いたらよろしいでしょうか。

    もし複数条件も可能でしたら、
    *○○*または*○○*または*○○*というファイル名
    ○月かつ○○が入ったファイル名
    こちらもぜひよろしくお願いいたします。

  55. 申し訳ございません。先の質問(2023年4月22日 2:18 午後)は匿名にご変更お願いいたします。

  56. […] このブログをはじめて間もないころ、受信したメールの添付ファイルを自動保存するマクロを作成し、その後さまざまなご要望をいただいてこのマクロの派生版を作成してきました。しかし、この記事自体があまりにも古すぎるためか、Bing や Google の検索でヒットしなくなっているようです。そのため、マクロを一部再構成し、改めて掲載することとしました。 […]

かずま への返信 コメントをキャンセル