【コピペでOK】エクセルにOutlookのメールを出力!VBA(マクロ)コード&DLファイル!

VBAの組み方・VBA初心者向け

Outlookのメールをエクセルに出力したい!
メールの本文をエクセルでまとめ、集計を行いたい!

Outlookの受信メールをExcelで集計したいとき、手作業での転記は意外と面倒な作業です。特に、本文の集計が必要な場合、コピー&ペーストするのは非効率ですよね。

そんな時に活躍するのが、メール自動取得VBAです。

今回紹介するコードをコピペするだけで、Outlookの受信フォルダからメールを自動で取得し、Excelに一覧として出力できます。また期間指定機能があるため、受信ボックスに大量のメールが入っている方も、分割して高速で処理が可能です。

「VBAは初めてでよく分からない…」という方でも、そのまま使えるシンプルなコードになっていますので、ぜひ試してみてください!

また、件名などの情報はVBAを使わなくても取得が可能です。VBAを使わない出力方法も解説しているので、そちらも参考にしてみてください。

このブログでは、ほかにもコピペ・ダウンロードで使えるVBAを紹介しています。ぜひほかの記事も参考にしてみてください!

【結論】コピペで使えるメール出力VBA

以下のコードをコピペするだけで、Outlookの受信ボックスに入ったメールを、自動転記できます。

詳しい使用方法は、この後紹介します。

Sub ImportOutlookEmails()
    Dim OutlookApp As Outlook.Application
    Dim OutlookNamespace As Outlook.Namespace
    Dim OutlookFolder As Outlook.MAPIFolder
    Dim OutlookItems As Outlook.Items
    Dim OutlookMail As Outlook.MailItem
    Dim xlWorksheet As Worksheet
    Dim iRow As Integer
    Dim startDate As Date
    Dim endDate As Date
    Dim attachmentStatus As String
    Dim inputStartDate As String, inputEndDate As String

    Application.ScreenUpdating = False

    ' 期間指定のためのダイアログボックスを表示(YYYYMMDD形式)
    inputStartDate = InputBox("取り込むメールの開始日を入力してください(YYYYMMDD形式)")
    inputEndDate = InputBox("取り込むメールの終了日を入力してください(YYYYMMDD形式)")
    
    ' 入力を日付型に変換
    startDate = DateSerial(Left(inputStartDate, 4), Mid(inputStartDate, 5, 2), Right(inputStartDate, 2))
    endDate = DateSerial(Left(inputEndDate, 4), Mid(inputEndDate, 5, 2), Right(inputEndDate, 2))

    ' Outlookのインスタンスを作成
    Set OutlookApp = New Outlook.Application
    Set OutlookNamespace = OutlookApp.GetNamespace("MAPI")
    ' 受信トレイのメールを取得
    Set OutlookFolder = OutlookNamespace.GetDefaultFolder(olFolderInbox)

    ' アクティブシートを取得
    Set xlWorksheet = ThisWorkbook.ActiveSheet

    ' 既存データ(2行目以降)を削除
    If xlWorksheet.UsedRange.Rows.Count > 1 Then
        xlWorksheet.Rows("2:" & xlWorksheet.Rows.Count).Delete
    End If

    ' Excelヘッダー行を設定
    xlWorksheet.Cells(1, 1).Value = "送信者"
    xlWorksheet.Cells(1, 2).Value = "件名"
    xlWorksheet.Cells(1, 3).Value = "本文"
    xlWorksheet.Cells(1, 4).Value = "日付"
    xlWorksheet.Cells(1, 5).Value = "添付有無"

    iRow = 2 ' データ行の開始行

    ' Outlookのメールを取得
    Set OutlookItems = OutlookFolder.Items
    OutlookItems.Sort "[ReceivedTime]", True ' 受信日時でソート(新しい順)

    Dim Count As Integer
    Count = 0
    
    For Each Item In OutlookItems
        ' アイテムの型を確認して MailItem の場合のみ処理する
        If TypeOf Item Is Outlook.MailItem Then
            Set OutlookMail = Item  ' 明示的に MailItem にキャスト
            
            ' メールの受信日時が指定された期間内である場合のみ取り込む
            If OutlookMail.ReceivedTime >= startDate And OutlookMail.ReceivedTime <= endDate Then
                ' 添付ファイルの有無を判定
                If OutlookMail.Attachments.Count > 0 Then
                    attachmentStatus = "あり"
                Else
                    attachmentStatus = "なし"
                End If
    
                If OutlookMail.SenderEmailType = "EX" Then
                    ' Exchangeアカウントの場合はSMTPアドレスを取得
                    On Error Resume Next  ' エラー回避(Exchangeアカウントがない場合を考慮)
                    senderEmail = OutlookMail.Sender.GetExchangeUser().PrimarySmtpAddress
                    On Error GoTo 0       ' エラー制御を元に戻す
                Else
                    ' 通常のメールアドレスを取得
                    senderEmail = OutlookMail.SenderEmailAddress
                End If
                    
                ' メールの情報をExcelに書き込む
                xlWorksheet.Cells(iRow, 1).Value = senderEmail
                xlWorksheet.Cells(iRow, 2).Value = OutlookMail.Subject
                xlWorksheet.Cells(iRow, 3).Value = OutlookMail.Body
                xlWorksheet.Cells(iRow, 4).Value = Format(OutlookMail.ReceivedTime, "yyyy/mm/dd")
                xlWorksheet.Cells(iRow, 5).Value = attachmentStatus
    
                iRow = iRow + 1 ' 次の行に移動
                Count = 1
            ElseIf OutlookMail.ReceivedTime <= startDate Or OutlookMail.ReceivedTime >= endDate And Count = 1 Then
                ' 一度期間内に入った後、期間から外れればループから出る
                Exit For
            End If
        End If
    Next Item


    ' メッセージボックスで処理が完了したことを表示
    MsgBox "OutlookのメールをExcelに取り込みました。", vbInformation

    ' オブジェクトを解放
    Set xlWorksheet = Nothing
    Set OutlookItems = Nothing
    Set OutlookFolder = Nothing
    Set OutlookNamespace = Nothing
    Set OutlookApp = Nothing

    Application.ScreenUpdating = True
    
    Columns("A:E").Select
    Selection.WrapText = False
    Range("A1").Select

End Sub

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

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

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

※ウイルスではもちろんありませんが、マクロ付きのため、自己責任でお願いします。

メール出力VBAの動作と使い方

実行すると、開始日と終了日の入力ボックスが表示されます。ここに『/』を入れずに、日付を入力してください。

日付を続けて入力する。

すると受信ボックスに入っている、開始日~終了日までのすべてのメールが出力されます。件数が多いと実行に時間がかかるので、多い場合は区切って実行をしてください。

メール出力VBAの使い方

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

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

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

・A列:送信者
・B列:件名
・C列:本文
・D列:日付
・E列:添付有無

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

VBAの埋込/ボタンの挿入

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

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

【重要】参照設定の追加

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

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

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

VBA実行

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

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

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

※VBAを使わずにメール情報をエクセルに出力する方法

出力したい情報が送信者・件名・日付の場合、メールを選択してエクセルにドラッグすることで、出力が可能です。

出力したいメールを選択して、エクセル上にドラッグ
差出人・件名・日時などの情報がリスト化される

メールを選択してエクセルに張り付けるだけなので、簡単に出力をすることができます。

件名だけの件数確認や、1日のメール送信数の確認などの場合は、この方法が便利です。

エラーの対処

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

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

さいごに

今回は、Outlookのメール自動作成VBAを紹介しました。とても効率がUPするVBAなので、ぜひ活用してみてください。

またこのコードはChatGPTで作ったVBAを元にしています。ChatGPTを使ったVBA作成法も別の記事で紹介しています、そちらもぜひ参考にしてみてください!

コメント

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