自動化レポートの作成
メニューを表示するにはスワイプしてください
月次レポートのパターン 本コースで扱うすべての自動レポートは、同じ流れに従います:旧データのクリア、データのフィルタまたは集計、ビジュアル出力の更新または再構築、プレゼンテーション用の書式設定、そしてユーザーへの完了通知。
実例:ワンクリック月次レポート
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"として保存しようとします。このパターンを使う場合は、ワークブックが一度は保存されていることを確認しておくとよいでしょう。
タスク
GenerateMonthlyReportを上記の通り正確に入力し(前章で作成したPivotシートが必要です)、実行してください。テーブルがMarchでフィルタされ、ピボットが更新されることを確認します。- targetMonthを"January"に変更して再実行し、新しい月の内容にレポートが更新されることを確認します。
- Subの最後、MsgBoxの前に、上記のExportAsFixedFormatを使ってReportsシートをPDFとしてエクスポートする1行を追加してください。
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.PathとtargetMonthを組み合わせて、毎回異なる名前のファイルが生成されるようにします(同じファイルを上書きしないように)。 - 記述位置も重要です。フィルタ・更新・書式設定が終わった後、最終的な
MsgBoxによる完了通知の前に追加してください。そうしないと、確認メッセージがファイル生成前に表示されてしまいます。
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.pdfとJanuary_Report.pdfの2つのPDFが生成され、それぞれ実行時点のフィルタ済みデータが反映されているはずです。
ダイアログが表示されてプリンターの選択を求められた場合(コードが即座に失敗しない場合)、利用可能なオプションをいずれか選択してください。「Microsoft Print to PDF」や「Microsoft XPS Document Writer」、またはリストにある他のプリンターやFAXドライバーでも問題ありません。ここでは選択するプリンター自体は重要ではなく、VBAが PageSetup/エクスポート処理を満たすために何らかのプリンターが選択されている必要があります。Excelはこれらの操作を、どのプリンターがアクティブかに関係なく、内部的にプリンターサブシステムを経由して実行します。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の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"として保存しようとします。このパターンを使う場合は、ワークブックが一度は保存されていることを確認しておくとよいでしょう。
タスク
GenerateMonthlyReportを上記の通り正確に入力し(前章で作成したPivotシートが必要です)、実行してください。テーブルがMarchでフィルタされ、ピボットが更新されることを確認します。- targetMonthを"January"に変更して再実行し、新しい月の内容にレポートが更新されることを確認します。
- Subの最後、MsgBoxの前に、上記のExportAsFixedFormatを使ってReportsシートをPDFとしてエクスポートする1行を追加してください。
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.PathとtargetMonthを組み合わせて、毎回異なる名前のファイルが生成されるようにします(同じファイルを上書きしないように)。 - 記述位置も重要です。フィルタ・更新・書式設定が終わった後、最終的な
MsgBoxによる完了通知の前に追加してください。そうしないと、確認メッセージがファイル生成前に表示されてしまいます。
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.pdfとJanuary_Report.pdfの2つのPDFが生成され、それぞれ実行時点のフィルタ済みデータが反映されているはずです。
ダイアログが表示されてプリンターの選択を求められた場合(コードが即座に失敗しない場合)、利用可能なオプションをいずれか選択してください。「Microsoft Print to PDF」や「Microsoft XPS Document Writer」、またはリストにある他のプリンターやFAXドライバーでも問題ありません。ここでは選択するプリンター自体は重要ではなく、VBAが PageSetup/エクスポート処理を満たすために何らかのプリンターが選択されている必要があります。Excelはこれらの操作を、どのプリンターがアクティブかに関係なく、内部的にプリンターサブシステムを経由して実行します。
フィードバックありがとうございます!