【Outlook】差し込み印刷で添付ファイルを個別に変える手順(VBA)

【Outlook】差し込み印刷で添付ファイルを個別に変える手順(VBA)
🛡️ 超解決

Outlookでメールを大量送信する際、宛先ごとに異なる添付ファイルを付けたい場面はありませんか。

通常、Outlookの差し込み印刷機能では、全ての宛先に同じ添付ファイルしか設定できません。

この記事では、VBA(Visual Basic for Applications)を活用して、Outlookの差し込み印刷で添付ファイルを個別に変更する具体的な手順を解説します。

これにより、顧客ごとの契約書や請求書など、パーソナライズされた添付ファイルを自動で送信できるようになります。

ADVERTISEMENT

Outlook差し込み印刷で添付ファイルを個別に設定する仕組み

Outlookの標準機能だけでは、差し込み印刷の際に宛先ごとに異なる添付ファイルを指定することはできません。これは、差し込み印刷の仕組みが、メール本文や件名などのテキスト情報をデータベースから取得して挿入することに特化しているためです。

しかし、VBAを用いることで、Outlookの操作を自動化し、この制限を克服できます。具体的には、Excelなどのデータソースから添付ファイル名を読み込み、Outlookのメールアイテムに動的に設定するという流れになります。

このVBAスクリプトは、指定されたデータソース(通常はExcelファイル)を参照し、各レコードに対応する添付ファイルパスを取得します。そして、Outlookのメール作成プロセスにおいて、そのパスにあるファイルを添付し、メールを送信します。この自動化により、手作業でのファイル添付ミスを防ぎ、作業効率を大幅に向上させることが可能です。

お探しの解決策が見つからない場合は、こちらの「Teams/Outlookトラブル完全解決データベース」で他のエラー原因や解決策をチェックしてみてください。

添付ファイルを個別に変更するVBAコードと設定手順

この機能を実現するには、Excelで宛先リストと添付ファイルパスを管理し、Outlook VBAでそれらを読み込んでメールを送信するスクリプトを作成します。以下にその詳細な手順を示します。

  1. Excelで宛先リストと添付ファイルパスを作成する
    まず、Excelを開き、以下の3つの列を含むシートを作成します。
  2. 「メールアドレス」列: 送信先のメールアドレスを入力します。
  3. 「ファイル名」列: 各宛先に送信する添付ファイルのファイル名(フルパスまたはファイル名のみ)を入力します。ファイル名のみの場合、スクリプトと同じフォルダにファイルを置くか、別途指定が必要です。
  4. 「件名」列(任意): メール件名を個別に設定したい場合に使用します。
  5. 「本文」列(任意): メール本文を個別に設定したい場合に使用します。
  6. Outlook VBAエディターを開く
    Outlookを起動し、Alt + F11 キーを押してVBAエディターを開きます。
  7. 標準モジュールを挿入する
    VBAエディターのメニューから「挿入」→「標準モジュール」を選択します。
  8. VBAコードを貼り付ける
    表示されたコードウィンドウに、以下のVBAコードをコピーして貼り付けます。
Sub SendMailsWithIndividualAttachments()

    Dim OutApp As Object
    Dim OutMail As Object
    Dim ExcelApp As Object
    Dim ExcelWb As Object
    Dim ExcelWs As Object
    Dim LastRow As Long
    Dim i As Long
    Dim MailAddress As String
    Dim Subject As String
    Dim Body As String
    Dim AttachmentPath As String
    Dim FolderPath As String ' attachments are stored in a specific folder

    ' --- 設定項目 ---
    Const ExcelFilePath As String = "C:\Path\To\Your\ExcelFile.xlsx" ' ★Excelファイルのフルパスを指定してください
    Const SheetName As String = "Sheet1" ' ★Excelシート名を指定してください
    Const AttachmentFolderPath As String = "C:\Path\To\Your\Attachments\" ' ★添付ファイルが保存されているフォルダのパスを指定してください
    ' ----------------

    ' Outlookオブジェクトを作成
    On Error Resume Next
    Set OutApp = GetObject(, "Outlook.Application")
    If OutApp Is Nothing Then
        Set OutApp = CreateObject("Outlook.Application")
    End If
    On Error GoTo 0

    If OutApp Is Nothing Then
        MsgBox "Outlookを起動できませんでした。Outlookがインストールされているか確認してください。", vbCritical
        Exit Sub
    End If

    ' Excelオブジェクトを作成
    On Error Resume Next
    Set ExcelApp = GetObject(, "Excel.Application")
    If ExcelApp Is Nothing Then
        Set ExcelApp = CreateObject("Excel.Application")
    End If
    On Error GoTo 0

    If ExcelApp Is Nothing Then
        MsgBox "Excelを起動できませんでした。Excelがインストールされているか確認してください。", vbCritical
        Exit Sub
    End If

    ' Excelファイルを開く
    On Error Resume Next
    Set ExcelWb = ExcelApp.Workbooks.Open(ExcelFilePath)
    If ExcelWb Is Nothing Then
        MsgBox "Excelファイルを開けませんでした。パスを確認してください: " & ExcelFilePath, vbCritical
        ExcelApp.Quit
        Set ExcelApp = Nothing
        Exit Sub
    End If
    On Error GoTo 0

    Set ExcelWs = ExcelWb.Sheets(SheetName)

    ' データ最終行を取得 (A列を基準)
    LastRow = ExcelWs.Cells(ExcelWs.Rows.Count, "A").End(xlUp).Row

    ' 2行目から最終行までループ (1行目はヘッダーと想定)
    For i = 2 To LastRow
        ' 各列から情報を取得
        MailAddress = Trim(ExcelWs.Cells(i, "A").Value) ' メールアドレス (A列)
        AttachmentPath = Trim(ExcelWs.Cells(i, "B").Value) ' ファイル名 (B列)
        Subject = Trim(ExcelWs.Cells(i, "C").Value) ' 件名 (C列、任意)
        Body = Trim(ExcelWs.Cells(i, "D").Value) ' 本文 (D列、任意)

        ' メールアドレスが空の場合はスキップ
        If MailAddress = "" Then
            Debug.Print "行 " & i & " はメールアドレスが空のためスキップします。"
            GoTo NextIteration ' 次のループへ
        End If

        ' 新しいメールアイテムを作成
        Set OutMail = OutApp.CreateItem(0) ' 0 = olMailItem

        ' 件名が設定されているか確認
        If Subject = "" Then
            Subject = "件名を入力してください" ' デフォルト件名
        End If

        ' 本文が設定されているか確認
        If Body = "" Then
            Body = "本文を入力してください" ' デフォルト本文
        End If

        ' メールアイテムに情報を設定
        With OutMail
            .To = MailAddress
            .Subject = Subject
            .Body = Body
            .Attachments.Add AttachmentFolderPath & AttachmentPath ' 添付ファイルを追加
            ' .Display ' メールを表示する場合 (送信前に確認したい場合)
            .Send ' メールを送信する場合
        End With

        ' メール送信後、Outlookオブジェクトを解放
        Set OutMail = Nothing

        ' Excelオブジェクトの処理を一時停止 (必要に応じて)
        DoEvents

NextIteration:
    Next i

    ' Excelファイルを保存せずに閉じる
    ExcelWb.Close SaveChanges:=False
    ExcelApp.Quit

    ' オブジェクトの解放
    Set ExcelWs = Nothing
    Set ExcelWb = Nothing
    Set ExcelApp = Nothing
    Set OutApp = Nothing

    MsgBox "メール送信処理が完了しました。", vbInformation

End Sub
  • コード内の設定項目を編集する
    貼り付けたVBAコードの「設定項目」部分を、ご自身の環境に合わせて編集します。
  • Excelファイルのフルパスを指定: `Const ExcelFilePath As String = “C:\Path\To\Your\ExcelFile.xlsx”` の部分を、作成したExcelファイルの実際のパスに書き換えます。
  • Excelシート名を指定: `Const SheetName As String = “Sheet1″` の部分を、使用するExcelシートの名前に書き換えます。
  • 添付ファイルフォルダのパスを指定: `Const AttachmentFolderPath As String = “C:\Path\To\Your\Attachments\”` の部分を、添付ファイルが保存されているフォルダの実際のパスに書き換えます。パスの末尾には必ず円マーク(\)を付けてください。
  • VBAプロジェクトを保存する
    VBAエディターのメニューから「ファイル」→「保存」を選択し、プロジェクトに名前を付けて保存します。
  • マクロのセキュリティ設定を確認する
    Outlookの「ファイル」→「オプション」→「トラストセンター」→「トラストセンターの設定」→「マクロの設定」で、「すべてのマクロを通知せずに無効にする」以外を選択していることを確認してください。一般的には、「すべてのマクロを無効にする、ただしデジタル署名されたマクロは除く」または「すべてのマクロを通知して有効にする」が推奨されます。
  • VBAスクリプトを実行する
    Outlookに戻り、Alt + F8 キーを押して「マクロ」ダイアログボックスを開きます。
  • 実行したいマクロを選択: 作成したマクロ名(例: `SendMailsWithIndividualAttachments`)を選択し、「実行」ボタンをクリックします。
  • 実行の確認
    セキュリティ警告が表示される場合があります。内容を確認し、信頼できる場合は「有効にする」または「実行」をクリックしてください。
  • 処理の完了を確認
    スクリプトが実行され、Excelファイルの情報に基づいてメールが送信されます。完了すると「メール送信処理が完了しました。」というメッセージが表示されます。
  • 新しいTeams(v2)と従来Teamsの機能比較

    ※このセクションは、Outlookの差し込み印刷に関する記事のため、Teamsの機能比較は該当しません。

    ADVERTISEMENT

    新しいOutlookと従来Outlookの違い

    ※このセクションは、Outlookの差し込み印刷に関する記事のため、新しいOutlookと従来Outlookの機能比較は該当しません。

    Outlook差し込み印刷で添付ファイルを個別に変更する際の注意点

    このVBAスクリプトを使用する際には、いくつかの注意点と、よくある失敗パターンがあります。これらを理解しておくことで、スムーズに運用できます。

    添付ファイルパスが間違っている

    最も一般的な問題は、Excelファイルに記載した添付ファイルパスが間違っているケースです。パスが間違っていると、指定されたファイルが見つからず、添付が失敗します。

    確認手順:

    1. Excelファイル内のパスを確認する
      Excelシートの「ファイル名」列に記載されているパスが、`AttachmentFolderPath` で指定したフォルダ内に正しく存在するか確認してください。
    2. ファイル名の大文字・小文字を区別する
      Windowsでは通常ファイル名の大文字・小文字は区別されませんが、念のため正確に一致しているか確認しましょう。
    3. パスの区切り文字を確認する
      VBAコード内の `AttachmentFolderPath` の末尾には、必ず円マーク(\)が必要です。Excelファイル内のパスも、この形式に合わせると間違いが少ないです。

    Excelファイルが開けない・シート名が違う

    指定したExcelファイルが存在しない、またはシート名が一致しない場合もエラーの原因となります。

    確認手順:

    1. Excelファイルのパスとファイル名を確認する
      VBAコードの `ExcelFilePath` で指定したパスとファイル名が正しいか、再度確認してください。ファイルが移動したり、名前が変更されたりしていないか注意しましょう。
    2. Excelシート名を確認する
      VBAコードの `SheetName` で指定したシート名が、Excelファイル内の実際のシート名と完全に一致しているか確認してください。
    3. Excelファイルがロックされていないか確認する
      他のユーザーがExcelファイルを開いている、またはパスワードで保護されている場合、VBAから開けないことがあります。

    マクロのセキュリティ設定で実行がブロックされる

    Outlookのマクロセキュリティ設定によっては、スクリプトの実行がブロックされることがあります。

    確認手順:

    1. Outlookのトラストセンター設定を確認する
      前述の「マクロのセキュリティ設定を確認する」手順に従い、マクロが有効になっているか確認してください。
    2. デジタル署名を確認する(上級者向け)
      組織によっては、マクロにデジタル署名が必須の場合があります。その場合は、信頼できる発行元からのマクロのみ実行できるように設定されているか確認してください。

    添付ファイルが大きすぎる

    添付ファイルのサイズが大きすぎると、Outlookの送信制限に引っかかり、メールが送信できない場合があります。Exchange Onlineなどのメールサーバーには、添付ファイルのサイズ上限が設定されています。

    確認手順:

    1. 組織のメールサーバーの添付ファイルサイズ上限を確認する
      IT管理者などに確認し、組織で定められている添付ファイルの最大サイズを確認してください。
    2. 添付ファイルのサイズを小さくする
      必要であれば、PDFの圧縮や、ファイル形式の変更などでサイズを小さくしてください。
    3. 代替手段を検討する
      サイズが大きい場合は、OneDriveやSharePointなどのファイル共有サービスを利用し、共有リンクをメール本文に記載するなどの代替手段を検討してください。

    メール送信が完了しない(エラーメッセージが表示される)

    上記以外にも、OutlookやExchange Onlineの設定、ネットワーク環境など、様々な要因でメール送信が失敗する可能性があります。

    確認手順:

    1. Outlookの「送信トレイ」を確認する
      送信に失敗したメールが「送信トレイ」に残っていないか確認してください。エラーメッセージが表示されている場合は、その内容を記録しておきましょう。
    2. Outlookのイベントログを確認する(管理者向け)
      IT管理者であれば、WindowsのイベントビューアーでOutlookに関連するエラーログを確認することで、原因特定の手がかりが得られる場合があります。
    3. VBAコードのデバッグ機能を利用する
      VBAエディターで「デバッグ」→「ステップ実行」や「イミディエイトウィンドウ」を活用し、コードのどの部分で問題が発生しているかを特定します。`Debug.Print` 文をコードの各所に挿入し、変数の値などを確認することも有効です。

    Mac版・モバイル版・Web版での違い

    このVBAスクリプトは、Windows版のMicrosoft Outlookで動作することを前提としています。Mac版Outlook、Outlook on the web (Web版Outlook)、およびモバイル版Outlookでは、VBAがサポートされていない、または動作が異なるため、このスクリプトをそのまま使用することはできません。

    Mac版Outlookでは、AppleScriptなど別の自動化ツールを使用することで、同様の機能を実現できる可能性がありますが、VBAとは記述方法や実行環境が異なります。Web版Outlookやモバイル版Outlookでは、標準機能やPower Automateなどのクラウドベースの自動化サービスを利用することを検討する必要があります。

    特に、Power Automateを利用すれば、Excel OnlineやSharePoint上のファイルと連携し、Outlookへの添付ファイルを自動化することが可能です。これは、VBAが利用できない環境での代替手段として非常に有効です。

    まとめ

    この記事では、Outlookの差し込み印刷機能で、宛先ごとに異なる添付ファイルを自動送信するためのVBAスクリプトとその設定手順を解説しました。

    Excelで宛先リストと添付ファイルパスを管理し、VBAコードを適切に設定・実行することで、手作業によるミスを減らし、業務効率を大幅に向上させることができます。

    今後は、Excelファイルのパスや添付ファイルパスをより柔軟に管理する方法(例: SharePointやOneDriveとの連携)や、エラーハンドリングを強化したスクリプトの作成などを検討すると、さらに活用範囲が広がります。

    👥
    Teams/Outlookトラブル完全解決データベース サインイン、接続エラー、メール送受信の不具合など、特有のトラブル解決策を網羅。困った時の逆引きに活用してください。

    ADVERTISEMENT

    この記事の監修者
    🌐

    超解決 リモートワーク研究班

    Microsoft 365の導入・保守を専門とするエンジニアグループ。通信障害やサインイン不具合など、ビジネスインフラのトラブル対応に精通しています。