• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マクロを使ってピポットを実行したい)

マクロを使ってピポットを実行したい

このQ&Aのポイント
  • マクロを使用してピポットを実行したいと考えています。現在自動作成されたマクロがありますが、実行すると予期しない結果になります。行数が異なっても実行できるようにしたいです。また、月に一度作成する資料を担当者別に作成し、ボタンクリックで実行できるようにしたいです。
  • 現在、ピポット実行のためのマクロがありますが、異なる資料に実行するとうまくいかない問題があります。ピポットの形が崩れたり、合計が正しく計算されないなどの問題が発生します。
  • マクロを使用してピポットを実行したいと考えています。行数が異なっても実行できるようにするために、現在のマクロを改善したいと思っています。また、担当者別に資料を作成し、ボタンクリックで実行できるようにすることで効率的な作業を行いたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

すみません、#1で画像を添付し損ねました。 ついでですが。 項目を変動させて柔軟な集計ができるのがPivotTableの長所なので、マクロで固定しなくても良いのになぁ、と思います。 集計方法を変えたり書式を設定したりするのが面倒な場合は、そこをマクロにしてあげればいいのではないかと。 例として、選択したデータフィールドを合計にして書式を設定するサンプル。 Sub try()   Dim r As Range, x   If TypeName(Selection) = "Range" Then     For Each r In Selection       On Error Resume Next       x = r.PivotField.Calculation       On Error GoTo 0       If Not IsEmpty(x) Then         With r.PivotField           .Function = xlSum           .NumberFormat = "#,##0_ ;[red]-#,##0 "           .Caption = .SourceName & " 計"         End With         x = Empty       End If     Next   End If End Sub

その他の回答 (1)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

行数が違っても、データ項目名が不変であれば Sub try1()   Dim Source As Range 'データ範囲を格納する変数   Dim pvt  As PivotTable   'データ範囲がA1セルを起点として連続範囲である事   Set Source = ActiveSheet.Range("A1").CurrentRegion   Set pvt = ActiveWorkbook.PivotCaches.Add( _                SourceType:=xlDatabase, _                SourceData:=Source.Address(External:=True) _                ).CreatePivotTable(TableDestination:="")   pvt.AddFields RowFields:=Array("担当者名", "得意先2", "メーカー名"), _          ColumnFields:="売上年月"   With pvt.PivotFields("売上金額")     .Orientation = xlDataField     .Caption = "合計 / 売上金額"     .Function = xlSum   End With   ActiveWorkbook.ShowPivotTableFieldList = True   Set pvt = Nothing   Set Source = Nothing End Sub ..こんな感じで処理できます。A1セル起点でデータ範囲が連続している事が条件です。 データ項目名が変わる場合は、行フィールド、列フィールド、データフィールドの判定ができないので自動というわけにはいきません。 逆に、フィールド設定の判定ができればいいですけど。 例えば画像のように、データの起点がA2セルからで、1行目に判定文字を入れるとか。 (r:行フィールド、c:列フィールド、d:データフィールド) Sub try2()   Dim Chkrng As Range   Dim Source As Range   Dim r   As Range   Dim pvt  As PivotTable   With ActiveSheet.Range("A1").CurrentRegion     Set Chkrng = .Rows(1).Cells     Set Source = Intersect(.Cells, .Offset(1))   End With   Set pvt = ActiveWorkbook.PivotCaches.Add( _                SourceType:=xlDatabase, _                SourceData:=Source.Address(External:=True) _                ).CreatePivotTable(TableDestination:="")   For Each r In Chkrng     Select Case StrConv(r.Value, vbNarrow + vbLowerCase)     Case "r"       pvt.PivotFields(r.Offset(1).Value).Orientation = xlRowField     Case "c"       pvt.PivotFields(r.Offset(1).Value).Orientation = xlColumnField     Case "d"       With pvt.PivotFields(r.Offset(1).Value)         .Orientation = xlDataField         .Caption = r.Offset(1).Value & " 計"         .Function = xlSum       End With     End Select   Next   ActiveWorkbook.ShowPivotTableFieldList = True   Set pvt = Nothing   Set Chkrng = Nothing   Set Source = Nothing End Sub

関連するQ&A