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

Excel VBA VBA
スポンサーリンク

VBA拡張版:複数シートのデータをまとめて1枚のダッシュボード画像にする

これまで「グラフ+テーブルを同じ画像にまとめる」方法を紹介しました。今回はさらに拡張して、複数シートのデータをまとめて1枚のダッシュボード画像にするテンプレートです。これにより、全社的なレポートを自動配信できるようになります。


手順の流れ

  1. 各シートにデータを配置(例:売上シート、エラーシート、在庫シートなど)
  2. 各シートからグラフを作成
  3. ダッシュボード用シートを作成
  4. 複数グラフやテーブルをダッシュボードシートに貼り付け
  5. ダッシュボードシートを画像化
  6. HTMLメールに埋め込み

サンプルコード

Option Explicit

Sub SendDashboardMailHTML()
    Dim wsSales As Worksheet, wsError As Worksheet, wsStock As Worksheet
    Dim wsDash As Worksheet
    Dim chartObj As ChartObject
    Dim dashFilePath As String
    
    '=== データ準備(例) ===
    Set wsSales = ThisWorkbook.Sheets("Sales")
    Set wsError = ThisWorkbook.Sheets("Error")
    Set wsStock = ThisWorkbook.Sheets("Stock")
    
    '=== ダッシュボード用シート作成 ===
    On Error Resume Next
    Set wsDash = ThisWorkbook.Sheets("Dashboard")
    If wsDash Is Nothing Then
        Set wsDash = ThisWorkbook.Sheets.Add
        wsDash.Name = "Dashboard"
    End If
    On Error GoTo 0
    wsDash.Cells.Clear
    
    '=== 売上グラフ ===
    Set chartObj = wsDash.ChartObjects.Add(Left:=20, Top:=20, Width:=300, Height:=200)
    chartObj.Chart.SetSourceData Source:=wsSales.Range("A1:B6")
    chartObj.Chart.ChartType = xlLine
    chartObj.Chart.HasTitle = True
    chartObj.Chart.ChartTitle.Text = "売上推移"
    
    '=== エラー件数グラフ ===
    Set chartObj = wsDash.ChartObjects.Add(Left:=350, Top:=20, Width:=300, Height:=200)
    chartObj.Chart.SetSourceData Source:=wsError.Range("A1:B6")
    chartObj.Chart.ChartType = xlColumnClustered
    chartObj.Chart.HasTitle = True
    chartObj.Chart.ChartTitle.Text = "エラー件数"
    
    '=== 在庫テーブルをコピー ===
    wsStock.Range("A1:C6").Copy wsDash.Range("A15")
    
    '=== ダッシュボードを画像化 ===
    dashFilePath = ThisWorkbook.Path & "\dashboard.png"
    wsDash.Range("A1:H40").CopyPicture Appearance:=xlScreen, Format:=xlPicture
    wsDash.Paste
    wsDash.Shapes(wsDash.Shapes.Count).Export dashFilePath, "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 dashFilePath
        
        ' HTML本文にダッシュボード画像を埋め込み
        .HTMLBody = _
            "<html><body>" & _
            "<h2 style='color:blue;'>📊 ダッシュボードレポート</h2>" & _
            "<p>以下は複数シートのデータをまとめたダッシュボードです。</p>" & _
            "<img src='cid:dashboard.png'>" & _
            "</body></html>"
        
        .Send
    End With
    
    MsgBox "ダッシュボード画像付きHTMLメールを送信しました", vbInformation
End Sub
VB

この拡張版のポイント

  • 複数シートのデータを集約 → 売上・エラー・在庫などを1枚にまとめる
  • ダッシュボードシートを作成 → グラフ+テーブルを配置
  • CopyPicture+Export → ダッシュボード全体を画像化
  • HTMLメールに埋め込み → 管理者が一目で全体を把握可能

実務でのメリット

  • 全社的なレポートを自動配信 → 複数部門のデータをまとめて通知
  • ダッシュボード風メール → 視覚的に分かりやすい
  • 完全自動化可能 → タスクスケジューラと組み合わせれば「毎月の総合レポート」を自動送信

✅ まとめ

  • 複数シートのデータをダッシュボードに集約
  • 1枚の画像にまとめてHTMLメールで送信
  • 管理者やチームに「全体像」を自動で共有可能
タイトルとURLをコピーしました