Excel VBA | 実務用 VBA コード集(テンプレ付き)

Excel VBA VBA
スポンサーリンク

VBA拡張版:複数ブックをまとめて1つのPDFにしてメール添付

これまで「複数シートをまとめてPDF化」する方法を紹介しました。今回はさらに拡張して、複数のExcelブックをまとめて1つのPDFにしてメール添付するテンプレートです。これにより、異なるファイルのレポートを一括配信できます。


手順の流れ

  1. 対象ブックを開く(例:Sales.xlsx、Error.xlsx、Stock.xlsx)
  2. 各ブックの対象シートをPDF化(一時ファイルとして保存)
  3. PDFを結合(簡易的には「複数PDFを1つにまとめる」外部ツールが必要ですが、VBAでは「複数シートを1つのPDFにまとめる」方法を応用)
  4. CDO.Messageでメール送信
    • PDFファイルを添付
    • HTML本文に説明を記載

サンプルコード(複数ブック → PDF → 添付)

Option Explicit

Sub SendMultiWorkbookPDFMail()
    Dim wbSales As Workbook, wbError As Workbook, wbStock As Workbook
    Dim pdfFilePath As String
    
    '=== 複数ブックを開く ===
    Set wbSales = Workbooks.Open(ThisWorkbook.Path & "\Sales.xlsx")
    Set wbError = Workbooks.Open(ThisWorkbook.Path & "\Error.xlsx")
    Set wbStock = Workbooks.Open(ThisWorkbook.Path & "\Stock.xlsx")
    
    '=== PDFファイルパス ===
    pdfFilePath = ThisWorkbook.Path & "\multi_workbook_report.pdf"
    
    '=== 複数ブックのシートをまとめてPDF化 ===
    ' → VBA単体では「複数ブックを直接まとめる」機能はないため、
    '    一度「一時的にコピーシートを1つのブックに集約」してからPDF化する
    
    Dim wbTemp As Workbook
    Set wbTemp = Workbooks.Add
    
    wbSales.Sheets(1).Copy After:=wbTemp.Sheets(wbTemp.Sheets.Count)
    wbError.Sheets(1).Copy After:=wbTemp.Sheets(wbTemp.Sheets.Count)
    wbStock.Sheets(1).Copy After:=wbTemp.Sheets(wbTemp.Sheets.Count)
    
    ' 最初に作られる空白シートを削除
    Application.DisplayAlerts = False
    wbTemp.Sheets(1).Delete
    Application.DisplayAlerts = True
    
    ' PDFとして保存
    wbTemp.Sheets.Select
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfFilePath, Quality:=xlQualityStandard
    
    wbTemp.Close SaveChanges:=False
    wbSales.Close SaveChanges:=False
    wbError.Close SaveChanges:=False
    wbStock.Close SaveChanges:=False
    
    '=== メール送信 ===
    Dim objMsg As Object, objConf As Object
    Set objMsg = CreateObject("CDO.Message")
    Set objConf = CreateObject("CDO.Configuration")
    
    ' SMTP設定(例:Office365)
    With objConf.Fields
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.office365.com"
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "your_account@domain.com"
        .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "your_password"
        .Update
    End With
    
    With objMsg
        Set .Configuration = objConf
        .From = "your_account@domain.com"
        .To = "admin@domain.com"
        .Subject = "【VBAタスク通知】複数ブックレポート(PDF添付)"
        
        ' PDFファイルを添付
        .AddAttachment pdfFilePath
        
        ' HTML本文
        .HTMLBody = _
            "<html><body>" & _
            "<h2 style='color:blue;'>📊 複数ブックレポート</h2>" & _
            "<p>Sales.xlsx・Error.xlsx・Stock.xlsx をまとめたPDFレポートを添付しました。</p>" & _
            "<p>添付ファイルをご確認ください。</p>" & _
            "</body></html>"
        
        .Send
    End With
    
    MsgBox "複数ブックをまとめたPDFを添付したメールを送信しました", vbInformation
End Sub
VB

この拡張版のポイント

  • 複数ブックを一時的に1つのブックに集約 → まとめてPDF化可能
  • CDO.Messageで添付送信 → PDFをメールに添付
  • HTML本文は簡潔に → 添付ファイルを主役に

実務でのメリット

  • 異なるファイルのレポートを一括配信 → 部門別ファイルをまとめて送信
  • 印刷や保存に適した形式 → PDFは改ざんされにくく、監査にも最適
  • 完全自動化可能 → タスクスケジューラと組み合わせれば「毎月の総合レポート」を自動送信

✅ まとめ

  • 複数ブックを一時的に集約 → PDF化
  • メールに添付して一括配信
  • 部門別や複数ファイルをまとめた「総合レポート」を自動送信可能
タイトルとURLをコピーしました