Article

Excelマクロで定型作業を効率化する方法

高田晃太郎
Excelマクロで定型作業を効率化する方法

現場での簡易計測に基づく一例として、手作業で数十分かかっていた約1万行規模のデータ整形とレポート作成が、未最適化のマクロでは数分台、画面更新と再計算の制御に加えて配列処理へ書き換えると数分未満まで短縮できるケースがあります。¹³ 操作のばらつきを抑えるために複数回測定して平均で比較すると、セル単位で書き込む処理に対して配列一括書き込みは、一桁から二桁の速度差が出ることが一般に知られています。³ VBAという枯れた技術でも、設計と実装の要点を押さえれば、業務の律速を現実的に解消できます。現場の事例でも、日次の定型バッチをマクロ化することで担当者単位の時間短縮が継続的に報告され、属人化を抑えながら品質のばらつきを減らす効果が期待できます。ここでは、単なる記録マクロに留まらず、CTOやエンジニアリーダーがチーム規模で展開できる実装指針とコード、運用・セキュリティ、ROIの観点までを一気通貫で示します。

Excelマクロで効率化すべき領域の見極め

効率化の効果が出やすいのは、入力形式がほぼ固定され、処理手順が明確に定義でき、例外数が事前に把握できる領域です。具体的には、CSVや受け渡しブックのレイアウトが安定した受注実績の集約、月次レポートのテンプレート反映、複数部門からの単票の統合、定義済みのピボットやグラフの更新などが該当します。逆に、毎回レイアウトが変わる、自由記述の清書が多い、ビジネスルールが日替わりで更新されるような業務は、要件の固定化やインターフェース設計を先に行わないと、マクロが例外処理だらけになって保守コストが跳ね上がります。私はまず対象データのサンプルを最低でも一週間分集め、列名の揺れ、空白行や欠損の頻度、日付と数値の型崩れの傾向を点検します。次に、期待する出力のイメージをテンプレートで固定し、差分を吸収する正規化のルールを文書化します。こうした「入力の揺れ」を前提にした正規化・フォーマット統一は、現場の集計効率化で反復的に効く基本戦術です。⁴ ここまで整えば、VBAで十分に耐用年数の長い自動化が可能になります。

高速で壊れにくいVBA設計と実装

マクロの速度はアルゴリズムとI/O(入出力。シートとの読み書きやファイル操作)の最適化で決まります。画面描画と再計算を抑制し、¹ セル単位の読み書きを避け、Variant配列(任意型を格納できる二次元配列)に一括で読み込んでから処理し、最後に一括で書き戻すだけで桁違いに速くなります。³ また、Range.Value より Range.Value2 を用いると高速で、Excelによる値の変換を避けられるため実行時間と安定性の両面で有利です。² 設計面では、エラー処理と復旧、ログ出力、設定の集中管理、テストデータの分離を最初から入れておくと、あとから機能を足しても壊れにくくなります。以下は、どのマクロにも共通に組み込む基盤コードです。状態の退避と復元、タイマー計測、シンプルなログ出力を担います。

Option Explicit

' 基盤: 高速化スイッチと状態退避
Private Type ExcelState
    ScreenUpdating As Boolean
    EnableEvents As Boolean
    Calc As XlCalculation
    DisplayAlerts As Boolean
End Type

Private Sub BeginFast(ByRef s As ExcelState)
    With Application
        s.ScreenUpdating = .ScreenUpdating
        s.EnableEvents = .EnableEvents
        s.Calc = .Calculation
        s.DisplayAlerts = .DisplayAlerts
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
        .DisplayAlerts = False
    End With
End Sub

Private Sub EndFast(ByRef s As ExcelState)
    With Application
        .ScreenUpdating = s.ScreenUpdating
        .EnableEvents = s.EnableEvents
        .Calculation = s.Calc
        .DisplayAlerts = s.DisplayAlerts
    End With
End Sub

' 基盤: 計測とログ
Private Function NowTicks() As Double
    NowTicks = Timer
End Function

Private Sub LogInfo(ByVal message As String)
    Debug.Print Format(Now, "yyyy-mm-dd hh:nn:ss"), message
End Sub

Private Sub LogError(ByVal whereAt As String, ByVal errMsg As String)
    Debug.Print "[ERROR]", whereAt, errMsg
End Sub

この基盤の上に、配列処理とテンプレート反映を積み上げます。次の例では、CSVの取り込みから整形、テンプレートへの展開までを一気通貫で行い、処理時間を計測して可視化します。書き込みは高速な Range.Value2 を使用します。²

CSV取り込みとテンプレート反映の実装例

Option Explicit

Public Sub ImportCsvToTemplate()
    Dim s As ExcelState
    Dim t0 As Double: t0 = NowTicks()
    On Error GoTo EH
    BeginFast s

    Dim csvPath As String: csvPath = ThisWorkbook.Path & "\input\daily.csv"
    Dim wsOut As Worksheet: Set wsOut = ThisWorkbook.Worksheets("Normalized")
    wsOut.Cells.ClearContents

    Dim f As Integer: f = FreeFile
    Open csvPath For Input As #f

    Dim lines() As String
    Dim content As String
    content = Input$(LOF(f), f)
    Close #f
    lines = Split(content, vbCrLf)

    Dim r As Long, c As Long
    Dim cols As Long
    Dim parts() As String

    ' 列数を先頭行から推定
    If UBound(lines) >= 0 Then
        parts = Split(lines(0), ",")
        cols = UBound(parts) + 1
    Else
        Err.Raise vbObjectError + 1, , "CSVが空です"
    End If

    Dim rows As Long: rows = UBound(lines) + 1
    Dim data() As Variant
    ReDim data(1 To rows, 1 To cols)

    For r = 1 To rows
        parts = Split(lines(r - 1), ",")
        For c = 1 To cols
            If c - 1 <= UBound(parts) Then
                data(r, c) = parts(c - 1)
            Else
                data(r, c) = vbNullString
            End If
        Next c
    Next r

    wsOut.Range("A1").Resize(rows, cols).Value2 = data

    ' 例: 1列目を日付に正規化、2列目を数値化
    wsOut.Columns(1).NumberFormatLocal = "yyyy-mm-dd"
    wsOut.Columns(2).NumberFormatLocal = "0"

    EndFast s
    LogInfo "ImportCsvToTemplate elapsed: " & Format(NowTicks() - t0, "0.00") & "s"
    Exit Sub
EH:
    EndFast s
    LogError "ImportCsvToTemplate", Err.Description
    Err.Clear
End Sub

同等の処理をセルごとに書き込む実装と比べ、配列一括書き込みは二桁の短縮になる場合があります。整形処理は可能な限りシート関数ではなくVBA側で行い、書き戻しもまとめると効果が伸びます。³ なお、CSVの改行コードや引用符の扱いは環境で異なるため、必要に応じて分割ロジックを調整してください。

フォルダ一括処理と進捗ログの実装例

複数部門から集まる同型のブックを一括処理するケースでは、FileSystemObjectを使ってディレクトリを走査し、各ファイルに対して同じ正規化と集計を適用します。早期バインディング(参照設定で型情報を事前に取り込む方式)を使う場合は、Microsoft Scripting Runtimeへの参照設定が必要です。

Option Explicit

Public Sub BatchNormalize()
    Dim s As ExcelState
    Dim t0 As Double: t0 = NowTicks()
    On Error GoTo EH
    BeginFast s

    Dim fso As Scripting.FileSystemObject
    Set fso = New Scripting.FileSystemObject

    Dim folderPath As String: folderPath = ThisWorkbook.Path & "\inbound"
    Dim f As Scripting.File

    Dim cnt As Long: cnt = 0
    For Each f In fso.GetFolder(folderPath).Files
        If LCase(fso.GetExtensionName(f.Path)) = "xlsx" Then
            cnt = cnt + 1
            LogInfo "Processing: " & f.Name
            Dim wb As Workbook
            Set wb = Application.Workbooks.Open(Filename:=f.Path, UpdateLinks:=False, ReadOnly:=True)
            ' 必要なシートからデータを抽出し、Normalizedへ追記する処理を書きます
            ' 例: wb.Worksheets("Export").UsedRange を配列で読み取り、集約先に追記
            Dim arr As Variant
            arr = wb.Worksheets(1).UsedRange.Value2
            AppendToNormalized arr
            wb.Close SaveChanges:=False
        End If
    Next f

    EndFast s
    LogInfo "BatchNormalize files=" & cnt & ", elapsed=" & Format(NowTicks() - t0, "0.00") & "s"
    Exit Sub
EH:
    EndFast s
    LogError "BatchNormalize", Err.Description
End Sub

Private Sub AppendToNormalized(ByRef arr As Variant)
    Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Normalized")
    Dim last As Long: last = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    Dim rows As Long: rows = UBound(arr, 1)
    Dim cols As Long: cols = UBound(arr, 2)
    ws.Range("A" & last + 1).Resize(rows, cols).Value2 = arr
End Sub

フォルダ内のブックを開閉する操作はI/Oのボトルネックになります。集計先は一つに固定し、開くファイルの数を減らす、あるいは週次のアーカイブで不要ファイルを別ディレクトリに退避すると、総処理時間がさらに安定します。³

ピボットレポート自動生成の実装例

集計の最後にレポートを自動生成すると、担当者は更新ボタンを押すだけで配布可能な成果物が得られます。ピボットキャッシュ(ピボットの元データを保持する仕組み)を使ってピボットテーブルとグラフを更新する最小構成を示します。⁵

Option Explicit

Public Sub BuildReport()
    On Error GoTo EH
    Dim s As ExcelState
    BeginFast s

    Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Normalized")
    Dim rng As Range: Set rng = ws.UsedRange

    Dim pc As PivotCache
    Set pc = ThisWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rng)

    Dim rpt As Worksheet
    Set rpt = ThisWorkbook.Worksheets("Report")
    rpt.Cells.Clear

    Dim pt As PivotTable
    Set pt = pc.CreatePivotTable(TableDestination:=rpt.Range("A3"), TableName:="T_Pivot")

    With pt
        .PivotFields(1).Orientation = xlRowField
        .PivotFields(2).Orientation = xlColumnField
        .AddDataField .PivotFields(3), "合計", xlSum
        .RowGrand = True
        .ColumnGrand = True
    End With

    Dim ch As ChartObject
    Set ch = rpt.ChartObjects.Add(Left:=300, Top:=20, Width:=500, Height:=300)
    ch.Chart.SetSourceData Source:=pt.TableRange1
    ch.Chart.ChartType = xlColumnClustered

    EndFast s
    Exit Sub
EH:
    EndFast s
    LogError "BuildReport", Err.Description
End Sub

テンプレートを事前に整え、書式や軸の設定を固定しておくと、マクロはデータの差し替えと最小限の更新だけに集中できます。集計キーの揺れに対しては、正規化段でマスタ参照を行うのが堅実です。⁴

実装例とベンチマーク:計測で意思決定する

高速化は勘と経験に頼らず、計測で判断します。³ セルへの逐次書き込み、行単位の貼り付け、配列一括の三つで同一処理を比較すると、テストデータでは配列一括が最も安定して速く、状況によっては二桁の短縮になることもあります。画面更新と再計算を抑制した上で配列化した処理は、分散が小さく、夜間バッチでも安心して流せます。¹ 次のスニペットは、パターンごとの計測を一括で回すドライバーです。

Option Explicit

Public Sub BenchmarkWritePatterns()
    Dim s As ExcelState
    Dim t0 As Double, t1 As Double
    Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Bench")
    Dim rows As Long: rows = 10000
    Dim cols As Long: cols = 10

    Dim data() As Variant
    ReDim data(1 To rows, 1 To cols)
    Dim r As Long, c As Long
    For r = 1 To rows
        For c = 1 To cols
            data(r, c) = r * c
        Next c
    Next r

    ' セル逐次
    BeginFast s: t0 = NowTicks()
    ws.Cells.Clear
    For r = 1 To rows
        For c = 1 To cols
            ws.Cells(r, c).Value2 = data(r, c)
        Next c
    Next r
    t1 = NowTicks(): EndFast s
    LogInfo "Cell-by-cell: " & Format(t1 - t0, "0.00") & "s"

    ' 行単位
    BeginFast s: t0 = NowTicks()
    ws.Cells.Clear
    For r = 1 To rows
        ws.Range(ws.Cells(r, 1), ws.Cells(r, cols)).Value2 = Application.Index(data, r, 0)
    Next r
    t1 = NowTicks(): EndFast s
    LogInfo "Row-wise: " & Format(t1 - t0, "0.00") & "s"

    ' 配列一括
    BeginFast s: t0 = NowTicks()
    ws.Cells.Clear
    ws.Range("A1").Resize(rows, cols).Value2 = data
    t1 = NowTicks(): EndFast s
    LogInfo "Array bulk: " & Format(t1 - t0, "0.00") & "s"
End Sub

この計測をプロジェクトの初期に実施し、目標KPIとして処理時間の上限や夜間バッチの締切を合意しておくと、ビジネス側との期待値のズレを避けられます。また、処理結果件数やスキップ件数のログ化を合わせて行うと、異常検知と原因追跡が容易になります。

Python併用によるバッチ実行と監視

複数ブックに対して同じマクロを回す場合、Excel自身をオーケストレーションに使うよりも、外側から制御した方が堅牢です。Windows環境ではwin32comを使ってExcelをヘッドレスで起動し、同一のVBAエントリーポイントを呼び出す構成が扱いやすく、エラー収集もシンプルになります。以下はフォルダ内のブックに対して、ThisWorkbook内のMainエントリを実行する例です。

import os
import glob
import time
import traceback
import win32com.client as win32


def run_batch(input_dir: str) -> None:
    start = time.time()
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    excel.Visible = False
    excel.DisplayAlerts = False
    processed = 0
    try:
        for path in glob.glob(os.path.join(input_dir, '*.xlsx')):
            print(f'Processing: {os.path.basename(path)}')
            wb = excel.Workbooks.Open(Filename=path, UpdateLinks=False, ReadOnly=False)
            try:
                excel.Run('ThisWorkbook.Main')
                wb.Save()
                processed += 1
            except Exception as e:
                print(f'[ERROR] {os.path.basename(path)}: {e}')
            finally:
                wb.Close(SaveChanges=False)
    finally:
        excel.Quit()
        print(f'Processed={processed}, Elapsed={time.time()-start:.2f}s')


if __name__ == '__main__':
    run_batch(input_dir=r'C:\data\inbound')

この構成にすると、Excel側のマクロは純粋に業務ロジックに専念でき、リトライや失敗のサマリは外側のスクリプトが担えるようになります。社内のジョブスケジューラやWindowsタスクスケジューラに登録すれば、夜間実行とログ監視まで一気にカバーできます。

運用・セキュリティ・ROI:継続的に効く仕組みへ

セキュリティを担保しつつ運用負荷を抑えるために、信頼済みの場所と署名を組み合わせるのが現実解です。社内の共有フォルダを信頼場所として登録し、配布ファイルはその中からのみ開くポリシーにします。配布物はバージョンを明示したファイル名にそろえ、旧版はアーカイブに移して混乱を防ぎます。マクロの更新は、モジュールをテキストでエクスポートしてGitで管理し、レビューと差分確認を通して品質を担保します。最小限でも、基盤コード、業務ロジック、UIエントリをモジュールで分け、変更点がどこに触れているかが一目でわかる構造にしておきます。

導入の成否は、効果を計測して意思決定につなげられるかに尽きます。ベースラインとして、対象作業の手作業時間をストップウォッチで計り、1回あたりと週あたりの平均値を記録します。マクロ導入後に同じ条件で再測定し、短縮時間と処理の安定度を報告します。例えば、日次20分の短縮が10名分で積み上がると、月あたりでは数十時間規模の削減になります。時間単価を5,000円と仮定すれば、月は数十万円、年は数百万円規模の削減インパクトという試算が成り立ちます。マクロの設計・実装・レビュー・教育を初期100時間程度と見積もっても、数か月で投資回収が見込めるケースは珍しくありません。さらに、ミスの削減と再検証の手戻りが減る付随効果は集計の正確度を押し上げ、意思決定のリードタイム短縮にも効いてきます。³

エラー対策と利用者教育の勘所

エラーはゼロにはできません。だからこそ、失敗しても速やかに復旧できる仕掛けが重要です。マクロの先頭で状態を退避し、失敗時は確実に元に戻す。例外が起きやすいI/Oと型変換まわりは、トライキャッチと入力検証を厚めに書いておく。ログはコンソールだけでなく、必要に応じてファイルにも残し、処理対象と件数、失敗理由が追えるようにします。最後に、担当者向けには、どのフォルダに何を置けば動くのか、失敗時に見るべきログはどこか、よくある質問を短い手順書にまとめて配布します。これだけで問い合わせの大半は現場で解決できるようになります。

まとめ:現場に根付く自動化を、計測と設計から

Excelマクロはレガシーではなく、正しく設計すれば今も強力な自動化基盤です。画面更新と再計算の制御、¹ 配列一括処理、³ 堅牢なエラーハンドリングという三本柱を押さえ、最初に計測して目標を決め、最後に運用で支えるという順番を守れば、短期間で確実な成果が出ます。あなたのチームが明日から取り組むなら、対象作業の実測、テンプレートの固定化、基盤コードの導入という三つから始めるのが近道です。どの業務を一番に効率化するか、処理時間をどこまで短縮すれば意思決定が変わるのか。次のスプリントのゴールに落とし、まず一つの定型を終わらせましょう。成果が出れば、二つ目、三つ目の自動化は連鎖的に進み、現場の時間は確実に未来の投資へ振り向けられるはずです。

参考文献

  1. Microsoft Learn. Excel のパフォーマンス: パフォーマンス低下を最適化するためのヒント(画面更新/再計算の抑制等). https://learn.microsoft.com/ja-jp/office/vba/excel/concepts/excel-performance/excel-tips-for-optimizing-performance-obstructions#:~:text=VBA%20%E3%83%9E%E3%82%AF%E3%83%AD%E3%81%AE%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%82%92%E5%90%91%E4%B8%8A%E3%81%95%E3%81%9B%E3%82%8B%E3%81%AB%E3%81%AF%E3%80%81%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%AE%9F%E8%A1%8C%E4%B8%AD%E3%81%AB%E4%B8%8D%E8%A6%81%E3%81%AA%E6%A9%9F%E8%83%BD%E3%82%92%E6%98%8E%E7%A4%BA%E7%9A%84%E3%81%AB%E3%82%AA%E3%83%95%E3%81%AB%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20%E5%A4%9A%E3%81%8F%E3%81%AE%E5%A0%B4%E5%90%88%E3%80%81%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%AE%9F%E8%A1%8C%E5%BE%8C%E3%81%AB%201%20%E3%81%A4%E3%81%AE%E5%86%8D%E8%A8%88%E7%AE%97%E3%81%BE%E3%81%9F%E3%81%AF,1%20%E3%81%A4%E3%81%AE%E5%86%8D%E6%8F%8F%E7%94%BB%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%A7%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82
  2. Microsoft Learn. Excel パフォーマンスに関するヒント(Range.Value2 は高速で、Excel によるデータ変換を行わない). https://learn.microsoft.com/ja-jp/office/vba/excel/concepts/excel-performance/excel-tips-for-optimizing-performance-obstructions#:~:text=%2A%20.%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%20%E3%81%AF%E3%80%81%E3%82%BB%E3%83%AB%E3%81%AE%E6%9B%B8%E5%BC%8F%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%E5%80%A4%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20%E3%81%93%E3%82%8C%E3%81%AF%E9%81%85%E3%81%8F%E3%81%AF%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%E3%82%BA%E3%83%BC%E3%83%A0%E3%81%99%E3%82%8B%E3%81%A8%20,.Value2%20%E3%81%AF%E9%AB%98%E9%80%9F%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81Excel%20%E3%81%8B%E3%82%89%E5%8F%96%E5%BE%97%E3%81%95%E3%82%8C%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AF%E5%A4%89%E6%9B%B4%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82
  3. Microsoft 365 Blog. Excel VBA performance: Coding best practices (2009-03-12). https://www.microsoft.com/en-us/microsoft-365/blog/2009/03/12/excel-vba-performance-coding-best-practices/#:~:text=This%20optimization%20explicitly%20reduces%20the,to%20store%20values%20as%20needed
  4. WingArc1st MotionBoard ブログ. 集計にかける時間の節約に!Excelレポート集計作業効率化のすすめ. https://www.wingarc.com/product/motionboard/blog/reporting-efficiency.html#:~:text=%E9%9B%86%E8%A8%88%E3%81%AB%E3%81%8B%E3%81%91%E3%82%8B%E6%99%82%E9%96%93%E3%81%AE%E7%AF%80%E7%B4%84%E3%81%AB%EF%BC%81Excel%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E9%9B%86%E8%A8%88%E4%BD%9C%E6%A5%AD%E3%82%92%E5%8A%B9%E7%8E%87%E5%8C%96%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%20%E3%81%9D%E3%82%8C%E3%81%A7%E3%81%AF%E3%80%81Excel%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AE%E9%9B%86%E8%A8%88%E4%BD%9C%E6%A5%AD%E3%82%92%E5%8A%B9%E7%8E%87%E7%9A%84%E3%81%AB%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E6%96%B9%E6%B3%95%E3%81%8C%E8%80%83%E3%81%88%E3%82%89%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%E3%80%82%E4%BB%A5%E4%B8%8B%E3%81%A7%E3%81%AF%20%E3%80%81Excel%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AE%E9%9B%86%E8%A8%88%E4%BD%9C%E6%A5%AD%E3%82%92%E5%8A%B9%E7%8E%87%E5%8C%96%E3%81%99%E3%82%8B%E4%B8%BB%E3%81%AA%E6%96%B9%E6%B3%95%E3%82%92%E7%B4%B9%E4%BB%8B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20,%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E7%B5%B1%E4%B8%80%E5%8C%96%20%E9%9B%86%E8%A8%88%E3%81%AB%E3%81%8A%E3%81%84%E3%81%A6%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E3%81%AE%E3%81%8C%E3%80%81%E5%85%A5%E5%8A%9B%E8%80%85%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E5%85%A5%E5%8A%9B%E5%86%85%E5%AE%B9%E3%82%84%E5%85%A5%E5%8A%9B%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%8C%E7%95%B0%E3%81%AA%20%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E5%95%8F%E9%A1%8C%E3%81%A7%E3%81%99%E3%80%82%E3%81%9F%E3%81%A8%E3%81%88%E3%81%B0%E5%85%A5%E5%8A%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%AE%E9%87%91%E9%A1%8D%E6%AC%84%E3%81%AB%E5%8D%98%E4%BD%8D%E3%81%AE%E6%8C%87%E5%AE%9A%E3%81%8C%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%E3%80%81%E5%85%A5%E5%8A%9B%E3%81%99%E3%82%8B%E6%96%B9%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%81%AF%E3%80%8CXXX%2CXXX%E5%86%86%E3%80%8D%E3%80%8CXXX%E5%8D%83%E5%86%86%E3%80%8D%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E6%A7%98%E3%80%85%E3%81%AA%E5%BD%A2%E5%BC%8F%E3%81%A7%E5%85%A5%E5%8A%9B%E3%81%95%E3%82%8C%E3%81%A6%E3%81%97
  5. Microsoft Learn. Excel.PivotCaches オブジェクト (VBA). https://learn.microsoft.com/en-us/office/vba/api/excel.pivotcaches#:~:text=Use%20the%20PivotCaches%20method%20of,to%20return%20the%20PivotCaches%20collection