【VBA】Excelファイルをメールに自動添付して送信する方法(コピペOK)

VBA
スポンサーリンク
スポンサーリンク

完成イメージ(Before / After)

Before(実行前)

Excelシートに宛先リストと添付ファイルのパスが入っている状態。Outlookには何も準備されていない。

A(宛先) B(件名) C(本文) D(添付ファイルパス)
1 宛先 件名 本文 添付ファイル
2 yamada@example.com 月次報告書の送付 山田様 お疲れ様です。… C:\Reports\月次報告_202603.xlsx
3 suzuki@example.com 請求書の送付 鈴木様 お世話になっております。… C:\Reports\請求書_202603.pdf
4 tanaka@example.com 資料の送付 田中様 ご確認をお願いいたします。… C:\Reports\会議資料.pptx

After(実行後)

Outlookにファイル添付済みの下書きメールが1通ずつ表示される。宛先・件名・本文に加え、添付ファイルが自動でセットされている送信ボタンを押すまで送信されない。


実行前の準備

Outlookの起動を確認する

VBAからOutlookを操作するには、Outlookがインストール済みで、初回起動(プロファイル設定)が完了している必要がある。マクロ実行前にOutlookを起動しておくこと。

※ Outlookが起動していない場合、「実行時エラー ‘429’」が発生します。タスクバーにOutlookのアイコンがあることを確認してください。

添付ファイルを確認する

添付するファイルが指定したパスに実際に存在することを確認する。ファイルが存在しないとエラーになる。エクスプローラーでファイルを開けることを事前に確認しておくこと。

バックアップを取る

既存のデータが入っているExcelファイルで実行する場合は、先にファイルをコピーしてバックアップを取ること。

Excelをマクロ有効ブック(.xlsm)で保存する

  1. Excelを開く(新規でも既存でもOK)
  2. 「ファイル」→「名前を付けて保存」
  3. ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存

.xlsx のままだとマクロが保存されない。必ず .xlsm にすること。

宛先リストを準備する

シートの1行目にヘッダー、2行目以降にデータを入力する。

A B C D
1 宛先 件名 本文 添付ファイル
2 yamada@example.com 月次報告書の送付 山田様 お疲れ様です。… C:\Reports\月次報告_202603.xlsx
3 suzuki@example.com 請求書の送付 鈴木様 お世話になっております。… C:\Reports\請求書_202603.pdf

D列(添付ファイル)にはファイルのフルパス(C:\から始まる絶対パス)を入力する。 相対パスでは動かない。エクスプローラーのアドレスバーからコピーすると確実。


手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

Alt + F11 キーを押すとVBE(Visual Basic Editor)が開く。

一般的にはAlt + F11で開けるが、企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。

標準モジュールを挿入する

  1. VBEのメニュー「挿入」→「標準モジュール」をクリック
  2. 右側に白い画面(コードウィンドウ)が表示される

コードを貼り付けて実行する

  1. 下の「コード(最小版)」をコピーして、コードウィンドウに貼り付ける
  2. Outlookが起動していることを確認する(※ 未起動の場合はエラー429が発生します。タスクバーにOutlookのアイコンがあることを確認してください)
  3. 添付ファイルが指定パスに存在することを確認する
  4. Alt + F8 を押す(または VBE上で F5
  5. 「CreateMailWithAttachment」を選択して「実行」
  6. Outlookにファイル添付済みの下書きメールが表示されることを確認する

コード(最小版)– 1ファイルを添付してメール作成

まずはこれだけで動く。Excelの宛先リストから、ファイル添付済みのOutlook下書きメールを作成する。送信はしない(.Display で下書き表示のみ)


Sub CreateMailWithAttachment()

    Dim olApp As Object
    Dim olMail As Object
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim filePath As String

    ' Outlook を起動(参照設定不要)
    Set olApp = CreateObject("Outlook.Application")

    ' 対象シートを設定
    Set ws = Worksheets("Sheet1")

    ' データの最終行を取得(A列基準)
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    ' データがない場合は終了
    If lastRow < 2 Then
        MsgBox "宛先リストが空です。A2セル以降にデータを入力してください。", vbExclamation
        Exit Sub
    End If

    ' 2行目から最終行までループ(1行目はヘッダー)
    For i = 2 To lastRow

        ' 宛先が空欄ならスキップ
        If Trim(ws.Cells(i, 1).Value) = "" Then GoTo NextRow

        ' メールを新規作成
        Set olMail = olApp.CreateItem(0)  ' 0 = olMailItem

        With olMail
            .To = ws.Cells(i, 1).Value       ' A列:宛先
            .Subject = ws.Cells(i, 2).Value  ' B列:件名
            .Body = ws.Cells(i, 3).Value     ' C列:本文

            ' ★ ここが今回のポイント:ファイルを添付 ★
            filePath = Trim(ws.Cells(i, 4).Value)  ' D列:添付ファイルパス
            If filePath <> "" Then
                If Dir(filePath) <> "" Then
                    .Attachments.Add filePath
                Else
                    MsgBox i & " 行目:添付ファイルが見つかりません。" & vbCrLf & _
                           filePath, vbExclamation
                End If
            End If

            .Display                          ' ★ 下書き表示(送信しない)
        End With

        Set olMail = Nothing

NextRow:
    Next i

    MsgBox lastRow - 1 & " 通のメールを作成しました。" & vbCrLf & _
           "Outlookで添付ファイルと内容を確認してから送信してください。", vbInformation

    Set olApp = Nothing

End Sub

重要:このコードはメールを送信しません。 .Display は下書きとしてメールウィンドウを開くだけ。添付ファイルと内容を確認してからOutlook上で送信ボタンを押す。

ポイント解説:

  • .Attachments.Add filePath — ファイルのフルパスを指定して添付する。これだけで添付完了
  • Dir(filePath) — ファイルの存在チェック。存在しない場合は添付せずにメッセージを表示
  • D列が空欄の場合は添付なしでメールを作成する(添付忘れではなく、意図的に添付なしのケースに対応)

シート名について: コード内の "Sheet1" はシート名(タブに表示される名前)。シート名を変更している場合は、自分のシート名に書き換えること。

記事007「ExcelからOutlookメールを自動作成する方法」のコードに .Attachments.Add を追加した形になっている。007のコードが動いている人は、D列とファイル添付部分を追加するだけでOK。


コード(実務版)– 一覧表から宛先・添付ファイルを読み取り一括メール作成

業務で使うなら、CC/BCC対応、複数ファイル添付(セミコロン区切り)、送信確認ダイアログ、ステータスログが必要になる。

シートのレイアウト(実務版):

A B C D E F G
1 宛先 件名 本文 添付ファイル CC BCC ステータス
2 yamada@example.com 月次報告書の送付 山田様… C:\Reports\月次報告.xlsx admin@example.com
3 suzuki@example.com 請求書の送付 鈴木様… C:\Reports\請求書.pdf;C:\Reports\明細.xlsx manager@example.com
4 tanaka@example.com 資料の送付 田中様… C:\Reports\会議資料.pptx

D列の複数ファイル添付: セミコロン(;)で区切れば、1通のメールに複数ファイルを添付できる。


Sub CreateMailWithAttachmentEx()

    Dim olApp As Object
    Dim olMail As Object
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim sendMode As VbMsgBoxResult
    Dim modeText As String
    Dim mailCount As Long
    Dim errCount As Long
    Dim filePath As String
    Dim filePaths As Variant
    Dim fp As Variant
    Dim attachCount As Long
    Dim attachFail As Long

    ' --- 送信モードの選択 ---
    sendMode = MsgBox("メールを送信しますか?" & vbCrLf & vbCrLf & _
                       "「はい」→ 送信(取り消し不可)" & vbCrLf & _
                       "「いいえ」→ 下書き表示のみ(送信しない)" & vbCrLf & _
                       "「キャンセル」→ 処理を中止", _
                       vbYesNoCancel + vbQuestion, "メール作成モード")

    ' キャンセルなら終了
    If sendMode = vbCancel Then
        MsgBox "処理を中止しました。", vbInformation
        Exit Sub
    End If

    ' 送信モードの場合は再確認
    If sendMode = vbYes Then
        If MsgBox("本当に送信しますか?" & vbCrLf & _
                  "送信したメールは取り消せません。" & vbCrLf & _
                  "添付ファイルの内容も確認しましたか?", _
                  vbYesNo + vbExclamation, "最終確認") = vbNo Then
            MsgBox "処理を中止しました。", vbInformation
            Exit Sub
        End If
    End If

    ' Outlook を起動(参照設定不要)
    Set olApp = CreateObject("Outlook.Application")

    ' 対象シートを設定
    Set ws = Worksheets("Sheet1")

    ' データの最終行を取得(A列基準)
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    ' データがない場合は終了
    If lastRow < 2 Then
        MsgBox "宛先リストが空です。A2セル以降にデータを入力してください。", vbExclamation
        Exit Sub
    End If

    mailCount = 0
    errCount = 0

    ' 2行目から最終行までループ(1行目はヘッダー)
    For i = 2 To lastRow

        ' 宛先が空欄ならスキップ
        If Trim(ws.Cells(i, 1).Value) = "" Then
            ws.Cells(i, 7).Value = "スキップ(宛先なし)"
            GoTo NextRow
        End If

        On Error GoTo ErrHandler

        ' メールを新規作成
        Set olMail = olApp.CreateItem(0)  ' 0 = olMailItem

        With olMail
            .To = ws.Cells(i, 1).Value       ' A列:宛先
            .Subject = ws.Cells(i, 2).Value  ' B列:件名
            .Body = ws.Cells(i, 3).Value     ' C列:本文

            ' ========== ファイル添付処理 ==========
            ' D列のパスをセミコロンで分割し、複数ファイルに対応
            filePath = Trim(ws.Cells(i, 4).Value)
            attachCount = 0
            attachFail = 0

            If filePath <> "" Then
                filePaths = Split(filePath, ";")
                For Each fp In filePaths
                    fp = Trim(fp)
                    If fp <> "" Then
                        If Dir(CStr(fp)) <> "" Then
                            .Attachments.Add CStr(fp)
                            attachCount = attachCount + 1
                        Else
                            attachFail = attachFail + 1
                        End If
                    End If
                Next fp
            End If
            ' ========== ファイル添付処理ここまで ==========

            ' --- CC / BCC ---
            If Trim(ws.Cells(i, 5).Value) <> "" Then
                .CC = ws.Cells(i, 5).Value   ' E列:CC
            End If
            If Trim(ws.Cells(i, 6).Value) <> "" Then
                .BCC = ws.Cells(i, 6).Value  ' F列:BCC
            End If

            ' --- 送信 or 下書き表示 ---
            If sendMode = vbYes Then
                .Send                         ' ★★★ 送信実行(取り消し不可・注意)★★★
                ws.Cells(i, 7).Value = "送信済み(添付:" & attachCount & "件)"
            Else
                .Display                      ' 下書き表示(送信しない)
                ws.Cells(i, 7).Value = "作成済み(添付:" & attachCount & "件)"
            End If

            ' 添付失敗があれば追記
            If attachFail > 0 Then
                ws.Cells(i, 7).Value = ws.Cells(i, 7).Value & _
                    " ※添付失敗:" & attachFail & "件(ファイル不在)"
            End If
        End With

        mailCount = mailCount + 1
        Set olMail = Nothing
        On Error GoTo 0

NextRow:
    Next i

    ' 完了メッセージ
    If sendMode = vbYes Then
        modeText = "送信"
    Else
        modeText = "作成(下書き)"
    End If

    MsgBox modeText & ":" & mailCount & " 通" & vbCrLf & _
           "エラー:" & errCount & " 通" & vbCrLf & _
           "G列にステータスを記録しました。", vbInformation, "完了"

    Set olApp = Nothing
    Exit Sub

ErrHandler:
    ' エラーをリセットして次の行へ進む
    ws.Cells(i, 7).Value = "エラー:" & Err.Description
    errCount = errCount + 1
    Set olMail = Nothing
    On Error GoTo 0
    Resume NextRow

End Sub

追加ポイント:

  • D列(添付ファイル)をセミコロン区切りで分割し、複数ファイル添付に対応
  • Dir関数で添付前にファイルの存在を確認。存在しないファイルはスキップしてG列にログを残す
  • E列(CC)・F列(BCC)に対応。空欄の場合は自動的にスキップ
  • 実行時に「送信 / 下書き表示 / 中止」を選択できるダイアログを表示
  • 送信を選んだ場合は、さらに最終確認ダイアログを表示(二重確認)
  • G列にステータス(「送信済み(添付:2件)」「作成済み(添付:1件)」「スキップ」「エラー」)を記録
  • エラーが発生した行はスキップして次の行を処理する(記事022「エラー処理」の考え方)

注意:.Send は一度実行すると取り消せません。 添付ファイルの間違いも送信後には修正できません。テスト時は必ず「いいえ」(下書き表示)を選んで、添付ファイルが正しいか目視確認してから、本番で「はい」(送信)を使うこと。初めて使う場合はまず最小版の .Display で動作を確認することを推奨。

シート名について: コード内の "Sheet1" はシート名(タブに表示される名前)。シート名を変更している場合は、自分のシート名に書き換えること。

CreateObject を使っているため、参照設定は不要。そのままコピペで動く。


よくある落とし穴5選

# 症状 原因 対策
1 「実行時エラー ’76’: パスが見つかりません」 添付ファイルのパスが間違っている、またはファイルが存在しない Dir関数で添付前にファイルの存在を確認する。パスはフルパス(C:\から始まる絶対パス)で指定する。エクスプローラーのアドレスバーからコピーすると確実
2 「実行時エラー ‘429’: ActiveXコンポーネントはオブジェクトを作成できません」 Outlookがインストールされていない、またはOutlookが一度も起動されていない Outlookをインストールし、初回起動でプロファイル設定を完了させてからマクロを実行する
3 添付ファイルのサイズが大きすぎて送信できない Outlookの添付ファイルサイズ制限(既定で20〜25MB)を超えている 添付前にファイルサイズを確認する。具体的な方法はFAQ Q5を参照。大きなファイルはOneDriveリンクや共有フォルダで代替する
4 添付されたファイルが0KBになる、または開けない ファイルが別のプロセスでロック(使用中)されている。または一時ファイルを添付している 添付するファイルを閉じた状態でマクロを実行する。一時ファイル(~$で始まるファイル)は添付しない
5 .Send で送信したが添付ファイルが間違っていた .Send は即座に送信を実行する。添付ファイルの間違いに送信後に気づいても取り消せない デフォルトは .Display を使う。テスト時は必ず .Display で添付ファイルが正しいか目視確認してから .Send に切り替える

FAQ

Q1: 複数のファイルを1通のメールに添付したい

実務版コードで対応済み。D列にセミコロン(;)区切りでファイルパスを記載すれば、複数ファイルが順番に添付される。例:C:\Reports\報告書.xlsx;C:\Reports\明細.pdf。添付ファイル数に上限はないが、合計サイズに注意。

Q2: PDFに変換してから添付したい

記事009「ExcelファイルをPDFに一括変換する方法」でPDF化し、そのPDFファイルのパスをD列に記載すれば、PDF添付メールが作れる。月次報告をPDFに変換してからメール添付する流れなら、009 → 075 の順に実行するのが実務的。

Q3: 宛先ごとに異なるファイルを添付したい

実務版コードで対応済み。一覧表の各行のD列にそれぞれ異なるファイルパスを入力すれば、宛先ごとに異なるファイルが添付される。記事001「フォルダ内ファイル一覧を自動取得する方法」でファイル一覧を作成し、そのパスをD列に貼り付ける方法が効率的。

Q4: ネットワークドライブや共有フォルダのファイルを添付できる?

\\サーバー名\共有フォルダ\ファイル名.xlsx のようにUNCパスで指定すれば添付できる。ただしアクセス権限がないとエラーになるため、事前にエクスプローラーでファイルを開けることを確認する。VPN接続が必要な場合はVPN接続後にマクロを実行すること。

Q5: 添付ファイルのサイズを事前にチェックしたい

FileLen("ファイルパス") でバイト数を取得できる。例えば20MBを超える場合にスキップするなら、If FileLen(filePath) > 20 * 1024 * 1024 Then で分岐できる。実務版コードにこのチェックを追加する場合は、Dir関数の直後に記述すればよい。


まとめ

この記事で、ExcelリストからOutlookメールにファイルを自動添付できるようになった。

  • 最小版:A列:宛先、B列:件名、C列:本文、D列:添付ファイルパス → .Display で下書き表示(送信しない)
  • 実務版:複数ファイル添付(セミコロン区切り)+CC/BCC対応+送信確認ダイアログ+G列にステータスログ

重要なのは、添付ファイルのパスをフルパスで正しく指定することと、テスト時は必ず .Display で添付内容を目視確認すること

関連記事

  • メールの自動作成(添付なし)の基本形 → 記事007「ExcelからOutlookメールを自動作成する方法」
  • 添付するファイルをPDFに変換したい → 記事009「ExcelファイルをPDFに一括変換する方法」
  • 表やグラフをメール本文に直接貼り付けたい → 記事025「表メール」
  • フォルダ内のファイル一覧を取得して添付パスに使いたい → 記事001「フォルダ内ファイル一覧を自動取得する方法」
  • エラー処理の考え方 → 記事022「エラー処理」

次にやりたくなること

  • 月次報告をPDFに変換してからメール添付する → 記事009「ExcelファイルをPDFに一括変換する方法」
  • 表やグラフをメール本文に直接貼り付ける → 記事025「表メール」

もっとカスタマイズしたい場合

「PDFに変換してから添付したい」「宛先ごとにフォルダから自動でファイルを選びたい」「HTML形式のメール+添付を同時に送りたい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。

相談時に以下の情報があるとスムーズです:

  • Excel のバージョン / OS
  • 宛先リストの列構成(どの列に何が入っているか)
  • 添付ファイルのパターン(固定ファイル / 宛先ごとに異なる / フォルダから自動選択)
  • メールの形式(プレーンテキスト / HTML)
  • 一度に送信するメールの件数(目安)

関連記事

コメント

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