← コード一覧へ戻る
基本セル・範囲

特定のデータだけコピーする

ピボットテーブルから集計値の部分だけを取り出し、J1以降へ値としてコピーします。

実行前に確認

  • 出力先の値・数式を上書きします。書式やピボット機能はコピーしません。
  • 総計もDataBodyRangeに含まれる場合があります。抽出したい商品1件だけならGetPivotDataを使います。

1サンプルコード

Sub Example1202()
    Dim ws As Worksheet
    Dim pt As PivotTable
    Dim r As Range
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    If ws.PivotTables.Count = 0 Then
        MsgBox "Sheet1にピボットテーブルを作ってください。"
        Exit Sub
    End If
    Set pt = ws.PivotTables(1)
    Set r = pt.DataBodyRange
    If r Is Nothing Then
        MsgBox "コピーできる集計値がありません。"
        Exit Sub
    End If
    If r.Rows.Count > 20 Or r.Columns.Count > 5 Then
        MsgBox "この例は20行5列以内の小さなピボット用です。"
        Exit Sub
    End If
    If MsgBox("J1:N20内の出力範囲を上書きします。続けますか?", vbYesNo + vbExclamation) <> vbYes Then Exit Sub
    ws.Range("J1").Resize(r.Rows.Count, r.Columns.Count).Value2 = r.Value2
End Sub
表で見る処理のイメージ実行前・実行後のセルを見比べる

既存ピボットの集計値をJ列へ値としてコピーします。

A・B・Cは列、1・2・3は行です。例えば「B2」はB列の2行目のセルです。この表は説明用のサンプルです。

実行前

Sheet1:コピー先 J1:J3

実行前のサンプル。列記号と行番号でセルの位置を確認できます。
J
1—
2—
3—

実行後

Sheet1:コピー先 J1:J3

実行後のサンプル。列記号と行番号でセルの位置を確認できます。
J
1960(注目セル)
2400(注目セル)
31360(注目セル)

色付きは注目する場所です。「—」は未入力、「(空文字)」は数式などが返す空の文字列を表します。

確認で「はい」を選んだ場合です。Sheet1の最初のピボットのDataBodyRangeが3行1列で、上から960、400、1360(総計)を含む前提です。J1:J3へこの順でコピーされ、ラベルや書式はコピーされません。元のピボットは変更されず、J4:N20全体を消す処理でもありません。ピボットの構成・総計設定でDataBodyRangeの大きさと内容は変わります。

使い方・実行手順を確認する4つの手順で、コードの使い方を確認できます
  1. 1

    練習用のブックを.xlsm形式で保存し、Sheet1という名前のシートを用意します。A1に商品、B1に売上、A2:B5へ順に「りんご・100」「みかん・200」「りんご・150」「みかん・50」を入力します。[挿入]→[ピボットテーブル]で既存のワークシートSheet1のD3へ作成し、「商品」を行、「売上」を値(合計)に配置します。値フィールドの表示名を「売上合計」にします。J1:N20は出力用に空けます。

  2. 2

    Alt+F11でVBEを開き、[挿入]→[標準モジュール]へコードを貼り付けます。

  3. 3

    DataBodyRangeはラベルを除く集計値部分です。J1が出力の起点です。

  4. 4

    マクロ内にカーソルを置いてF5で実行します。集計値だけがJ1以降へコピーされます。

使っている機能の公式ドキュメント(Microsoft Learn)