【コピペでOK】Outlookの添付ファイルを自動保存するVBA!添付メールの一括保存マクロ!

コピペで使えるコード集

前に添付付きメールをもらったけど、どれかわからない…
Outlookの添付ファイルを一括保存したい!

前にもらった添付付きメールがどこに行ったか分からないという経験、誰しもあるのではないでしょうか?そもそも添付ファイルだけを一括保存したいのに、できなくていちいち保存するのはかなり手間がかかる作業です。

本記事では Excelシートに入力した条件 に合わせて、Outlookの添付ファイルを自動で一括保存するVBAを紹介します。なお、保存先フォルダは毎回ダイアログで選択でき、送信者や件名、拡張子なども細かくフィルタ出来るようになっています。このコードを使って、効率化を進めてください。

また、VBA初心者の方でも使用できるよう、使い方も丁寧に解説しています。ぜひ最後まで確認してみてください。

【結論】コピペで使える添付ファイル取得VBA

まずコピペで使えるコードを紹介します。

次のコードをコピペするだけで、添付ファイルの一括取得ができます。

Sub SaveAttachmentsWithConditions()
    Dim olApp As Outlook.Application
    Dim olNs As Outlook.Namespace
    Dim olFolder As Outlook.Folder
    Dim olItem As Object
    Dim olMail As Outlook.MailItem
    Dim olAtt As Outlook.Attachment
    Dim savePath As String
    Dim fileName As String

    ' 条件用Excelの情報
    Dim xlBook As Workbook
    Dim xlSheet As Worksheet
    Dim dateFrom As Variant, dateTo As Variant
    Dim senderCond As String, receiverCond As String, subjectCond As String
    Dim extCondRaw As String, extList() As String
    Dim fileNameCond As String

    ' 保存先フォルダの選択
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "添付ファイルの保存先を選択してください"
        If .Show <> -1 Then Exit Sub
        savePath = .SelectedItems(1) & "\"
    End With

    Set xlBook = ThisWorkbook
    Set xlSheet = ActiveSheet

    ' 条件取得(空欄許容)
    dateFrom = xlSheet.Range("B1").Value
    dateTo = xlSheet.Range("B2").Value
    senderCond = Trim(xlSheet.Range("B3").Value)
    receiverCond = Trim(xlSheet.Range("B4").Value)
    subjectCond = Trim(xlSheet.Range("B5").Value)
    fileNameCond = Trim(xlSheet.Range("B6").Value)
    extCondRaw = Trim(xlSheet.Range("B7").Value)

    If extCondRaw <> "" Then
        extList = Split(LCase(extCondRaw), ",")
    End If

    ' Outlookの受信トレイを対象
    Set olApp = Outlook.Application
    Set olNs = olApp.GetNamespace("MAPI")
    Set olFolder = olNs.GetDefaultFolder(olFolderInbox)

    ' Restrictで日付範囲フィルタ作成
    Dim filter As String
    filter = ""
    If IsDate(dateFrom) Then
        filter = "[ReceivedTime] >= '" & Format(dateFrom, "yyyy/mm/dd") & "'"
    End If
    If IsDate(dateTo) Then
        If filter <> "" Then filter = filter & " AND "
        filter = filter & "[ReceivedTime] <= '" & Format(dateTo + 1, "yyyy/mm/dd") & "'"
    End If

    Dim targetItems As Outlook.Items
    If filter <> "" Then
        Set targetItems = olFolder.Items.Restrict(filter)
    Else
        Set targetItems = olFolder.Items
    End If

    targetItems.Sort "ReceivedTime", True

    Dim totalCount As Long, currentCount As Long
    totalCount = targetItems.Count
    currentCount = 0

    For Each olItem In targetItems
        currentCount = currentCount + 1
        Application.StatusBar = "処理中: " & currentCount & " / " & totalCount & _
                                "(" & Format(currentCount / totalCount, "0%") & ")"

        If TypeOf olItem Is MailItem Then
            Set olMail = olItem

            If senderCond <> "" And InStr(1, olMail.SenderEmailAddress, senderCond, vbTextCompare) = 0 Then GoTo SkipMail
            If receiverCond <> "" And InStr(1, olMail.To & olMail.CC, receiverCond, vbTextCompare) = 0 Then GoTo SkipMail
            If subjectCond <> "" And InStr(1, olMail.Subject, subjectCond, vbTextCompare) = 0 Then GoTo SkipMail

            ' 添付ファイル保存処理
            If olMail.Attachments.Count > 0 Then
                For Each olAtt In olMail.Attachments
                    Dim fileExt As String
                    Dim attName As String
                    attName = olAtt.fileName
                    fileExt = LCase(Right(attName, Len(attName) - InStrRev(attName, ".")))

                    ' ファイル名条件に一致しなければスキップ
                    If fileNameCond <> "" And InStr(1, attName, fileNameCond, vbTextCompare) = 0 Then GoTo NextAttachment

                    If extCondRaw = "" Then
                        fileName = savePath & Format(olMail.ReceivedTime, "yyyymmdd_hhnnss_") & attName
                        olAtt.SaveAsFile fileName
                    Else
                        Dim i As Long
                        For i = LBound(extList) To UBound(extList)
                            If "." & fileExt = Trim(extList(i)) Then
                                fileName = savePath & Format(olMail.ReceivedTime, "yyyymmdd_hhnnss_") & attName
                                olAtt.SaveAsFile fileName
                                Exit For
                            End If
                        Next i
                    End If
NextAttachment:
                Next
            End If
        End If
SkipMail:
    Next

    Application.StatusBar = False
    MsgBox "条件に合致するファイルの保存が完了しました。", vbInformation
End Sub

※当サイトで紹介している他のコピペコードは、コチラにまとめています!

【番外】そのまま使えるエクセルファイル

VBAが分からないという方向けに、VBAが入ったエクセルファイルを用意しました。ここに内容を書き込むだけで、簡単にメールが自動作成できます。

また、PCによっては「参照設定の追加」が必要となることがあります。エラーが出る場合は、この記事で紹介している「参照設定の追加」を試してください。

エクセルファイルはNoteにて販売しています。すぐに使いたい方はこちらを活用ください。

【Excelツール】Outlook添付ファイル一括自動保存ツール|すぐに使える完成版ダウンロード|犬井 | 効率化大全
前に添付付きメールをもらったけど、どれかわからない… Outlookの添付ファイルを一括保存したい! 複数のメールからの添付ファイルを一括で保存しようと思うと、一つずつ開く必要があり意外と面倒な作業です。 この記事は、そんな「添付ファイル保...

添付ファイル一括取得VBAの動作と使い方

エクセルに必要情報を記入します。日付の範囲のメールを全検索するので、できるだけ短い期間で検索するようにしてください。

実行すると、ファイル選択画面が表示されます。ここで、添付ファイルを保存するフォルダを選択します。

フォルダが選択できていれば、ファイルが何も見えなくてもOK

日付範囲のメールを全点検索し、フィルター条件のものだけを抽出します。

実行中、右下で処理の状況が確認可能。

するとフィルターでソートした内容の添付ファイルだけが、保存されます。

業務効率化におすすめ書籍『9選』はコチラから!

メール出力VBAの使い方

ここからはVBAのコピペ方法を含めて、使い方を紹介します。

エクセルの準備(項目設定)

まず、エクセルのシートに以下のタイトルを入力してください

  • 1行目:日付(FROM)
  • 2行目:日付(to)
  • 3行目:送信者
  • 4行目:受信者
  • 5行目:メールタイトル
  • 6行目:添付ファイル名
  • 7行目:拡張子

直接この名前をVBAで認識はしていません。ただ、リスト入力の間違い防止になるため、この内容で入力してください。

VBAの埋込

エクセルの「開発」タブから「Visual Basic」エディタを開きます。そしてVBAコードを「標準モジュール」に貼り付けます。

「開発」を出す設定コードの書き方は、VBAの基礎まとめのページで詳しく解説しています。こちらの記事もぜひ参考にしてみてください。

【重要】参照設定の追加

このVBAを使用するためには、参照設定の追加が必要になります。エクセル上部の[開発]→[Visual Basic]と進み、VBAの編集画面を表示させます。(開発タブがない方はコチラ)

VBAの編集画面から[ツール]→[参照設定]と進みます。

参照設定の下の方に、[Microsoft Outlook 16.0 Object Library]があります。チェックを入れOKボタンを押します。

VBA実行

あとはVBAを実行すれば出力されます。基本的に、Outlookを立ち上げてからVBAを実行するようにしてください。

また受信フォルダに入っているすべてのメールが対象なので、必ず期間を指定するようにしてください。

また、実行ボタンを設置すると、マクロ画面を開く必要がなくなりとても便利です。ボタンのつけ方は、こちらの記事を参考にしてください。

エラーの対処

このVBAを実行すると、以下のようなエラーが出ることがあります。

このエラーは、参照設定で解消できることがほとんどです。参照設定の方法は、この記事の[【重要】照設定の追加]の項を参考にしてください。

さいごに

今回は、Outlookの添付ファイル一括取得VBAを紹介しました。とても効率がUPするVBAなので、ぜひ活用してみてください。

今回紹介したようなVBAスキルは、一度身につければ一生使える武器となります。コピペも便利ですが、本で体系的に学ぶことで「自分でコードを書く力」を短期間で身につけられます。

以下の記事では、Kindle Unlimited(読み放題)無料で読めるおすすめのVBA書籍を厳選して紹介しています。生成AIを前提とした、今までとは全く違ったVBA学習法も紹介しているので、是非チェックしてみてください!

 VBA初心者におすすめの『5冊』はこちら!

※この記事を見た方は、こちらの記事もおすすめです!

コメント

タイトルとURLをコピーしました