VBA拡張版:複数グラフを1枚の画像にまとめて送信(チャート合成)
これまで「複数グラフを個別にHTMLメールへ埋め込む」方法を紹介しました。今回はさらに拡張して、複数のチャートを1枚の画像にまとめて送信するテンプレートです。メール本文がシンプルになり、ダッシュボード風のレポートを1枚で共有できます。
手順の流れ
- 複数グラフを作成(例:売上推移+エラー件数)
- グラフを画像化して一時保存
- 画像を1枚のシートに貼り付けて合成
- 合成画像を再度保存
- 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メールに埋め込むことで「ダッシュボード風通知」が完成
- タスクスケジューラと組み合わせれば「毎月の業務レポート」を完全自動化


