[レイアウト(ピボットテーブルウィザード)]でアイテムを非表示にするには

「特定のアイテムだけ表示させて集計したい」ってことありますよね。書式設定をする必要のないマクロ処理なら、

1.フィールドのアイテムを非表示に設定する
2.レイアウトを組む(データエリアに集計するフィールドを置く)

という順番で処理をします。ワークシート上で作業する場合も、[レイアウト]を使う場合でも、集計行を非表示にする処理と同じように「データエリアに集計するフィールドを置く前に非表示にしておく」ということなのですが、マクロの記録でこの処理のコードを作成する時、一般機能で行っている作業をそのまま記録してしまい、1と2の処理を逆に作業してしまっていないでしょうか。

特に、[レイアウト(ピボットテーブルウィザード)]上で操作を記録する時は、1の処理ができないと思い込んで、レイアウトを決めてからワークシート上で表示しないアイテムを選んでいる方が多いのではないかと思います。

 ◇ ◇ ◇ ◇ ◇

例えば、ワークシート上での操作を記録する時は、

1.行/列/ページエリアにフィールドを置く。
2.置いたフィールドから表示しないアイテムを選んでチェックを外す。
3.データエリアにフィールドを置く。

という手順で作業します。
しかし、掲示板で示されたコードを見ていると2と3を逆に作業して書かれているコードが多いようです。つまり、ワークシートに集計結果を表示させてからアイテムを非表示にしているんですね。

では、[レイアウト]では、どうすればいいでしょうか?
[レイアウト]を使う場合は、ページエリアを利用して次のように操作することによりアイテムを絞り込んだ集計表を作成することができます。

1.ページエリアにフィールド(A)を置いてダブルクリックする。
2.表示しないアイテムを選ぶ(反転させる)。
3.(A)を行/列エリアに移動させる。
4.データエリアにフィールドを置く。


 ◇ ◇ ◇ ◇ ◇

ワークシート上に集計結果を表示させてからフィールドのアイテムを非表示にすると、アイテムが非表示になる度に内部での更新以外にワークシート上でも集計データの更新が行なわれて、非表示にするアイテムの数によっては処理が遅くなります。

今回作成したサンプルマクロでは、非表示にするアイテムが少ないので処理時間は大して変わらないかもしれませんが、実務で作成している集計表では、数十のアイテムを非表示にしているものがあり、前に処理するのと後に処理するのでは明らかに処理スピードが違います。

もし、既存のマクロ処理でそのような処理になっているなら、修正するか、もう一度記録し直してみてください。処理スピードの改善や画面のちらつきを軽減させることができます。
なお、更新イベントを使った処理を使っている場合は、画面上の更新はされませんが、内部では更新処理が行われていますのでイベント処理を無効にして処理するといいと思います。

 ◇ ◇ ◇ ◇ ◇

今回のマクロは、レイアウトを表示させてからアイテムを非表示にする(PvtTblItemVisibleAfter)場合と、アイテムを非表示にしてからレイアウトを表示させる(PvtTblItemVisibleBefore)場合の処理を確認するために作ってみました。ステップ実行してワークシート上での集計結果の表示のされ方をみてください。

※データのない方は、(PvtTblDataAndPvtTbl)か、(PvtTblData1)で作成してください。

 ◇ ◇ ◇ ◇ ◇

Sub PvtTblItemVisibleAfter()
'レイアウトを表示させてからアイテムを非表示にする

  Call PvtTblMake
  Call PvtTblItemLayout
  Call PvtTblItemVisibleFalse

End Sub



Sub PvtTblItemVisibleBefore()
'アイテムを非表示にしてからレイアウトを表示させる

  Call PvtTblMake
  Call PvtTblItemVisibleFalse
  Call PvtTblItemLayout

End Sub



Sub PvtTblMake()
'シートの初期化とピボットテーブルキャッシュの作成

  Dim PvtSht As Worksheet

  On Error Resume Next
  Set PvtSht = ActiveWorkbook.Worksheets("PvtSht")
  On Error GoTo 0
  If PvtSht Is Nothing Then
    Set PvtSht = ActiveWorkbook.Worksheets.Add
    PvtSht.Name = "PvtSht"
  Else
    With PvtSht
      .Cells.Clear
      .Cells.ColumnWidth = .StandardWidth
      .Activate
    End With
  End If

  With ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, _
      SourceData:="Database").CreatePivotTable( _
        TableDestination:=PvtSht.Range("A3"))
    .SmallGrid = False
  End With
  Set PvtSht = Nothing

End Sub



Sub PvtTblItemVisibleFalse()
'アイテムの非表示

  With Worksheets("PvtSht").PivotTables(1)
    With .PivotFields("入荷地")
      .PivotItems("横浜").Visible = False
      .PivotItems("成田").Visible = False
      .PivotItems("函館").Visible = False
    End With
    With .PivotFields("品名")
      .PivotItems("オレンジ").Visible = False
      .PivotItems("バナナ").Visible = False
      .PivotItems("グレープフルーツ").Visible = False
    End With
  End With

End Sub



Sub PvtTblItemLayout()
'レイアウト

  With Worksheets("PvtSht").PivotTables(1)
    .AddFields RowFields:="入荷地", ColumnFields:="品名"
    .PivotFields("数量").Orientation = xlDataField
  End With

End Sub
カテゴリ
テーマ
プロフィール

Author:OtenkiAme(Tasan)
正早安楽を目指しながらも、言うことを聞かないExcelに使われている人です。

ブログ内検索
FC2カウンター
最近のコメント
最近のトラックバック
RSSフィード