Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 自動化レポートの作成 | テーブルとレポートの自動化
ビジネス自動化のためのExcel VBA

自動化レポートの作成

メニューを表示するにはスワイプしてください

月次レポートのパターン 本コースで扱うすべての自動レポートは、同じ流れに従います:旧データのクリア、データのフィルタまたは集計、ビジュアル出力の更新または再構築、プレゼンテーション用の書式設定、そしてユーザーへの完了通知。

実例:ワンクリック月次レポート

Option Explicit
 
Sub GenerateMonthlyReport()
    Dim ws As Worksheet
    Dim tbl As ListObject
    Dim targetMonth As String
 
    Set ws = ThisWorkbook.Worksheets("Reports")
    Set tbl = ws.ListObjects("tblReports")
    targetMonth = "March"
 
    ' 1. Start from a clean slate
    If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
 
    ' 2. Filter to the month being reported on
    tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth
 
    ' 3. Refresh the summary PivotTable so it reflects current data
    On Error Resume Next
    ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
    On Error GoTo 0
 
    ' 4. Apply export-ready formatting
    With ws.PageSetup
        .Orientation = xlLandscape
        .FitToPagesWide = 1
        .FitToPagesTall = 1
        .PrintArea = tbl.Range.Address
    End With
 
    ' 5. Confirm completion
    MsgBox targetMonth & " report is ready — filtered, " & _
        "refreshed, and print-formatted."
End Sub

5つの番号付きコメントは単なるラベルではなく、このセクションで説明したレポートパターンをそのまま1ステージごとに具現化したものです。特に注目すべき点は以下の通りです:

  • targetMonth As String は、冒頭付近で固定値として設定されており、Taskで「January」に変更するよう指示されている唯一の行です。以降の処理はすべてこの変数を参照するため、Sub内で「March」という文字列が繰り返されることはなく、レポート対象月の変更は1行だけで済みます。
  • ステップ3では、RefreshTableをOn Error Resume Next / On Error GoTo 0で囲んでいます。これはセクション4.3のピボット作成マクロと同じ理由で、もしPivotシートがまだ存在しない場合、この行でエラーが発生しマクロ全体が停止してしまうのを防ぎ、準備ができていないステップだけをスキップします。
  • ステップ4のPrintArea = tbl.Range.Addressは、印刷範囲をテーブルのアドレスに直接紐付けているため、ListRows.Addで行が追加されても印刷範囲が常にデータと一致します。別途印刷範囲を管理する必要がありません。
  • ステップ5のMsgBoxは、targetMonthを確認メッセージに連結することで、実際に処理した月名が常に表示されます。

ダッシュボードの更新

ワークブックに複数のピボットテーブルやグラフがあり、ダッシュボードシートに集約されている場合、RefreshAllを使うとすべてのデータ接続やPivotCacheを一度に再計算できます。これは、GenerateMonthlyReportが単一のピボットテーブルに対して手動で行っている処理の一行バージョンです: ThisWorkbook.RefreshAll

この一行は、GenerateMonthlyReportのステップ3と同じ役割を果たしますが、特定のピボットテーブルではなくワークブック全体を対象としています。ダッシュボードに複数のピボットテーブルや外部データ接続、リンククエリが含まれるようになった場合に有用です。

エクスポート用書式設定

ページ設定以外にも、完成したレポートをExcel外に出力する必要がある場合があります。ExportAsFixedFormatを使うと、コードから直接PDFを生成できます:

ws.ExportAsFixedFormat Type:=xlTypePDF, _
    Filename:=ThisWorkbook.Path & "\March_Report.pdf", _
    Quality:=xlQualityStandard

ThisWorkbook.Pathは現在のワークブックが保存されているフォルダを返します(末尾にバックスラッシュは付きません)。そのため、ファイル名は明示的に"\March_Report.pdf"を連結して作成しています。もしThisWorkbookがまだ保存されていない場合、.Pathは空文字列を返し、この行はカレントドライブ直下に"\March_Report.pdf"として保存しようとします。このパターンを使う場合は、ワークブックが一度は保存されていることを確認しておくとよいでしょう。

タスク

  1. GenerateMonthlyReportを上記の通り正確に入力し(前章で作成したPivotシートが必要です)、実行してください。テーブルがMarchでフィルタされ、ピボットが更新されることを確認します。
  2. targetMonthを"January"に変更して再実行し、新しい月の内容にレポートが更新されることを確認します。
  3. Subの最後、MsgBoxの前に、上記のExportAsFixedFormatを使ってReportsシートをPDFとしてエクスポートする1行を追加してください。
ヒント
expand arrow

1. GenerateMonthlyReportのそのまま実行

  • まず、前章のタスクで作成したPivotシートとptProfitByRegionピボットテーブルが実際に存在することを確認してください。このSubは既存のピボットテーブルを更新するもので、新規作成は行いません。
  • 手順通りにプロシージャを入力し、実行して2点を確認します:ReportsテーブルがMarch行のみ表示されていること、Pivotシートの数値がそれを反映していること(ただしピボット自体はReportsのフィルタに関係なく全月を集計します。PivotCacheはフィルタ後ではなく全範囲を参照するためです)。

2. targetMonthをJanuaryに変更

  • 変更が必要なのは1行だけです。冒頭付近のtargetMonth = "March"の代入行です。
  • Sub全体を再実行し、Reportsテーブルが今度はJanuaryでフィルタされていることを確認します。

3. PDFエクスポート行の追加

  • これは章の前半で紹介したExportAsFixedFormatと全く同じ行です。エクスポート対象はワークブック全体ではなくwsワークシートです。
  • ファイル名の作り方も、章の請求書生成例と同様に、ThisWorkbook.PathtargetMonthを組み合わせて、毎回異なる名前のファイルが生成されるようにします(同じファイルを上書きしないように)。
  • 記述位置も重要です。フィルタ・更新・書式設定が終わった後、最終的なMsgBoxによる完了通知の前に追加してください。そうしないと、確認メッセージがファイル生成前に表示されてしまいます。
解答例
expand arrow
Option Explicit

Sub GenerateMonthlyReport()
    Dim ws As Worksheet
    Dim tbl As ListObject
    Dim chtObj As ChartObject
    Dim printRange As Range
    Dim targetMonth As String

    Set ws = ThisWorkbook.Worksheets("Reports")
    Set tbl = ws.ListObjects("tblReports")
    targetMonth = "January"

    ' 1. Start from a clean slate
    If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData

    ' 2. Filter to the month being reported on
    tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth

    ' 3. Refresh the summary PivotTable so it reflects current data
    On Error Resume Next
    ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
    On Error GoTo 0

    ' 4. Build a print area that covers the table AND the chart
    On Error Resume Next
    Set chtObj = ws.ChartObjects(1)
    If Not chtObj Is Nothing Then
        Set printRange = Union(tbl.Range, ws.Range(chtObj.TopLeftCell.Address, _
            chtObj.BottomRightCell.Address))
    Else
        Set printRange = tbl.Range
    End If
    On Error GoTo 0

    On Error Resume Next
    With ws.PageSetup
        .Orientation = xlLandscape
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = 1
        .PrintArea = printRange.Address
    End With
    On Error GoTo 0

    ' 5. Export the filtered report to PDF
    ws.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=ThisWorkbook.Path & "\" & targetMonth & "_Report.pdf", _
        Quality:=xlQualityStandard

    ' 6. Confirm completion
    MsgBox targetMonth & " report is ready — filtered, refreshed, and exported."
End Sub

targetMonth = "March"で一度、"January"で一度実行してください。ワークブックと同じ場所にMarch_Report.pdfJanuary_Report.pdfの2つのPDFが生成され、それぞれ実行時点のフィルタ済みデータが反映されているはずです。

Note
注意

ダイアログが表示されてプリンターの選択を求められた場合(コードが即座に失敗しない場合)、利用可能なオプションをいずれか選択してください。「Microsoft Print to PDF」や「Microsoft XPS Document Writer」、またはリストにある他のプリンターやFAXドライバーでも問題ありません。ここでは選択するプリンター自体は重要ではなく、VBAが PageSetup/エクスポート処理を満たすために何らかのプリンターが選択されている必要があります。Excelはこれらの操作を、どのプリンターがアクティブかに関係なく、内部的にプリンターサブシステムを経由して実行します。

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 4.  5

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

自動化レポートの作成

月次レポートのパターン 本コースで扱うすべての自動レポートは、同じ流れに従います:旧データのクリア、データのフィルタまたは集計、ビジュアル出力の更新または再構築、プレゼンテーション用の書式設定、そしてユーザーへの完了通知。

実例:ワンクリック月次レポート

Option Explicit
 
Sub GenerateMonthlyReport()
    Dim ws As Worksheet
    Dim tbl As ListObject
    Dim targetMonth As String
 
    Set ws = ThisWorkbook.Worksheets("Reports")
    Set tbl = ws.ListObjects("tblReports")
    targetMonth = "March"
 
    ' 1. Start from a clean slate
    If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
 
    ' 2. Filter to the month being reported on
    tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth
 
    ' 3. Refresh the summary PivotTable so it reflects current data
    On Error Resume Next
    ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
    On Error GoTo 0
 
    ' 4. Apply export-ready formatting
    With ws.PageSetup
        .Orientation = xlLandscape
        .FitToPagesWide = 1
        .FitToPagesTall = 1
        .PrintArea = tbl.Range.Address
    End With
 
    ' 5. Confirm completion
    MsgBox targetMonth & " report is ready — filtered, " & _
        "refreshed, and print-formatted."
End Sub

5つの番号付きコメントは単なるラベルではなく、このセクションで説明したレポートパターンをそのまま1ステージごとに具現化したものです。特に注目すべき点は以下の通りです:

  • targetMonth As String は、冒頭付近で固定値として設定されており、Taskで「January」に変更するよう指示されている唯一の行です。以降の処理はすべてこの変数を参照するため、Sub内で「March」という文字列が繰り返されることはなく、レポート対象月の変更は1行だけで済みます。
  • ステップ3では、RefreshTableをOn Error Resume Next / On Error GoTo 0で囲んでいます。これはセクション4.3のピボット作成マクロと同じ理由で、もしPivotシートがまだ存在しない場合、この行でエラーが発生しマクロ全体が停止してしまうのを防ぎ、準備ができていないステップだけをスキップします。
  • ステップ4のPrintArea = tbl.Range.Addressは、印刷範囲をテーブルのアドレスに直接紐付けているため、ListRows.Addで行が追加されても印刷範囲が常にデータと一致します。別途印刷範囲を管理する必要がありません。
  • ステップ5のMsgBoxは、targetMonthを確認メッセージに連結することで、実際に処理した月名が常に表示されます。

ダッシュボードの更新

ワークブックに複数のピボットテーブルやグラフがあり、ダッシュボードシートに集約されている場合、RefreshAllを使うとすべてのデータ接続やPivotCacheを一度に再計算できます。これは、GenerateMonthlyReportが単一のピボットテーブルに対して手動で行っている処理の一行バージョンです: ThisWorkbook.RefreshAll

この一行は、GenerateMonthlyReportのステップ3と同じ役割を果たしますが、特定のピボットテーブルではなくワークブック全体を対象としています。ダッシュボードに複数のピボットテーブルや外部データ接続、リンククエリが含まれるようになった場合に有用です。

エクスポート用書式設定

ページ設定以外にも、完成したレポートをExcel外に出力する必要がある場合があります。ExportAsFixedFormatを使うと、コードから直接PDFを生成できます:

ws.ExportAsFixedFormat Type:=xlTypePDF, _
    Filename:=ThisWorkbook.Path & "\March_Report.pdf", _
    Quality:=xlQualityStandard

ThisWorkbook.Pathは現在のワークブックが保存されているフォルダを返します(末尾にバックスラッシュは付きません)。そのため、ファイル名は明示的に"\March_Report.pdf"を連結して作成しています。もしThisWorkbookがまだ保存されていない場合、.Pathは空文字列を返し、この行はカレントドライブ直下に"\March_Report.pdf"として保存しようとします。このパターンを使う場合は、ワークブックが一度は保存されていることを確認しておくとよいでしょう。

タスク

  1. GenerateMonthlyReportを上記の通り正確に入力し(前章で作成したPivotシートが必要です)、実行してください。テーブルがMarchでフィルタされ、ピボットが更新されることを確認します。
  2. targetMonthを"January"に変更して再実行し、新しい月の内容にレポートが更新されることを確認します。
  3. Subの最後、MsgBoxの前に、上記のExportAsFixedFormatを使ってReportsシートをPDFとしてエクスポートする1行を追加してください。
ヒント
expand arrow

1. GenerateMonthlyReportのそのまま実行

  • まず、前章のタスクで作成したPivotシートとptProfitByRegionピボットテーブルが実際に存在することを確認してください。このSubは既存のピボットテーブルを更新するもので、新規作成は行いません。
  • 手順通りにプロシージャを入力し、実行して2点を確認します:ReportsテーブルがMarch行のみ表示されていること、Pivotシートの数値がそれを反映していること(ただしピボット自体はReportsのフィルタに関係なく全月を集計します。PivotCacheはフィルタ後ではなく全範囲を参照するためです)。

2. targetMonthをJanuaryに変更

  • 変更が必要なのは1行だけです。冒頭付近のtargetMonth = "March"の代入行です。
  • Sub全体を再実行し、Reportsテーブルが今度はJanuaryでフィルタされていることを確認します。

3. PDFエクスポート行の追加

  • これは章の前半で紹介したExportAsFixedFormatと全く同じ行です。エクスポート対象はワークブック全体ではなくwsワークシートです。
  • ファイル名の作り方も、章の請求書生成例と同様に、ThisWorkbook.PathtargetMonthを組み合わせて、毎回異なる名前のファイルが生成されるようにします(同じファイルを上書きしないように)。
  • 記述位置も重要です。フィルタ・更新・書式設定が終わった後、最終的なMsgBoxによる完了通知の前に追加してください。そうしないと、確認メッセージがファイル生成前に表示されてしまいます。
解答例
expand arrow
Option Explicit

Sub GenerateMonthlyReport()
    Dim ws As Worksheet
    Dim tbl As ListObject
    Dim chtObj As ChartObject
    Dim printRange As Range
    Dim targetMonth As String

    Set ws = ThisWorkbook.Worksheets("Reports")
    Set tbl = ws.ListObjects("tblReports")
    targetMonth = "January"

    ' 1. Start from a clean slate
    If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData

    ' 2. Filter to the month being reported on
    tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth

    ' 3. Refresh the summary PivotTable so it reflects current data
    On Error Resume Next
    ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
    On Error GoTo 0

    ' 4. Build a print area that covers the table AND the chart
    On Error Resume Next
    Set chtObj = ws.ChartObjects(1)
    If Not chtObj Is Nothing Then
        Set printRange = Union(tbl.Range, ws.Range(chtObj.TopLeftCell.Address, _
            chtObj.BottomRightCell.Address))
    Else
        Set printRange = tbl.Range
    End If
    On Error GoTo 0

    On Error Resume Next
    With ws.PageSetup
        .Orientation = xlLandscape
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = 1
        .PrintArea = printRange.Address
    End With
    On Error GoTo 0

    ' 5. Export the filtered report to PDF
    ws.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=ThisWorkbook.Path & "\" & targetMonth & "_Report.pdf", _
        Quality:=xlQualityStandard

    ' 6. Confirm completion
    MsgBox targetMonth & " report is ready — filtered, refreshed, and exported."
End Sub

targetMonth = "March"で一度、"January"で一度実行してください。ワークブックと同じ場所にMarch_Report.pdfJanuary_Report.pdfの2つのPDFが生成され、それぞれ実行時点のフィルタ済みデータが反映されているはずです。

Note
注意

ダイアログが表示されてプリンターの選択を求められた場合(コードが即座に失敗しない場合)、利用可能なオプションをいずれか選択してください。「Microsoft Print to PDF」や「Microsoft XPS Document Writer」、またはリストにある他のプリンターやFAXドライバーでも問題ありません。ここでは選択するプリンター自体は重要ではなく、VBAが PageSetup/エクスポート処理を満たすために何らかのプリンターが選択されている必要があります。Excelはこれらの操作を、どのプリンターがアクティブかに関係なく、内部的にプリンターサブシステムを経由して実行します。

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 4.  5
some-alt