- ベストアンサー
マクロを使ってピポットを実行したい
- マクロを使用してピポットを実行したいと考えています。現在自動作成されたマクロがありますが、実行すると予期しない結果になります。行数が異なっても実行できるようにしたいです。また、月に一度作成する資料を担当者別に作成し、ボタンクリックで実行できるようにしたいです。
- 現在、ピポット実行のためのマクロがありますが、異なる資料に実行するとうまくいかない問題があります。ピポットの形が崩れたり、合計が正しく計算されないなどの問題が発生します。
- マクロを使用してピポットを実行したいと考えています。行数が異なっても実行できるようにするために、現在のマクロを改善したいと思っています。また、担当者別に資料を作成し、ボタンクリックで実行できるようにすることで効率的な作業を行いたいです。
- みんなの回答 (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)
行数が違っても、データ項目名が不変であれば 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