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

Excel VBA VBA
スポンサーリンク

VBA拡張版:複数グラフを1枚の画像にまとめて送信(チャート合成)

これまで「複数グラフを個別にHTMLメールへ埋め込む」方法を紹介しました。今回はさらに拡張して、複数のチャートを1枚の画像にまとめて送信するテンプレートです。メール本文がシンプルになり、ダッシュボード風のレポートを1枚で共有できます。


手順の流れ

  1. 複数グラフを作成(例:売上推移+エラー件数)
  2. グラフを画像化して一時保存
  3. 画像を1枚のシートに貼り付けて合成
  4. 合成画像を再度保存
  5. HTMLメールに埋め込み

サンプルコード

Option Explicit

Sub SendCombinedChartMailHTML()
    Dim ws As Worksheet
    Dim chartObj1 As ChartObject, chartObj2 As ChartObject
    Dim chartFilePath1 As String, chartFilePath2 As String
    Dim combinedFilePath As String
    
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    '=== グラフ1: 売上推移 ===
    Set chartObj1 = ws.ChartObjects.Add(Left:=50, Top:=50, Width:=400, Height:=300)
    chartObj1.Chart.SetSourceData Source:=ws.Range("A1:B6") ' A列=月, B列=売上
    chartObj1.Chart.ChartType = xlLine
    chartFilePath1 = ThisWorkbook.Path & "\sales_chart.png"
    chartObj1.Chart.Export Filename:=chartFilePath1, FilterName:="PNG"
    
    '=== グラフ2: エラー件数 ===
    Set chartObj2 = ws.ChartObjects.Add(Left:=500, Top:=50, Width:=400, Height:=300)
    chartObj2.Chart.SetSourceData Source:=ws.Range("D1:E6") ' D列=月, E列=エラー件数
    chartObj2.Chart.ChartType = xlColumnClustered
    chartFilePath2 = ThisWorkbook.Path & "\error_chart.png"
    chartObj2.Chart.Export Filename:=chartFilePath2, FilterName:="PNG"
    
    '=== 合成用シートに画像貼り付け ===
    Dim wsTemp As Worksheet
    Set wsTemp = ThisWorkbook.Sheets.Add
    wsTemp.Name = "TempChart"
    
    wsTemp.Pictures.Insert(chartFilePath1).Top = 10
    wsTemp.Pictures.Insert(chartFilePath1).Left = 10
    
    wsTemp.Pictures.Insert(chartFilePath2).Top = 320
    wsTemp.Pictures.Insert(chartFilePath2).Left = 10
    
    '=== 合成画像を保存 ===
    combinedFilePath = ThisWorkbook.Path & "\combined_chart.png"
    wsTemp.Range("A1:H40").ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & "\combined_chart.pdf"
    ' PDF出力を画像化する場合は外部ツールが必要だが、簡易的にはCopyPictureで画像化可能
    wsTemp.Range("A1:H40").CopyPicture Appearance:=xlScreen, Format:=xlPicture
    wsTemp.Paste
    wsTemp.Shapes(wsTemp.Shapes.Count).Export combinedFilePath, "PNG"
    
    '=== メール送信 ===
    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タスク通知】複数グラフ合成レポート"
        
        ' 添付ファイルを本文に埋め込み
        .AddAttachment combinedFilePath
        
        ' HTML本文に合成画像を埋め込み
        .HTMLBody = _
            "<html><body>" & _
            "<h2 style='color:blue;'>📊 複数グラフ合成レポート</h2>" & _
            "<p>以下は売上推移とエラー件数をまとめたグラフです。</p>" & _
            "<img src='cid:combined_chart.png'>" & _
            "</body></html>"
        
        .Send
    End With
    
    MsgBox "複数グラフを合成したHTMLメールを送信しました", vbInformation
End Sub
VB

この拡張版のポイント

  • 複数グラフを1枚にまとめる → メール本文がシンプルに
  • CopyPicture+Export を利用して合成画像を生成
  • HTMLメールに1枚のダッシュボード画像を埋め込み

実務でのメリット

  • ダッシュボード風通知メール → 管理者が一目で全体を把握
  • ファイルサイズ削減 → 複数画像よりも軽量
  • 報告書や監査に便利 → 1枚の画像で全体を説明可能

✅ まとめ

  • 複数グラフを合成して1枚の画像にまとめる
  • HTMLメールに埋め込むことで「ダッシュボード風通知」が完成
  • タスクスケジューラと組み合わせれば「毎月の業務レポート」を完全自動化
タイトルとURLをコピーしました