まったく同じ問題を解決する必要がありましたが、ピボットテーブルのフィルタリングが変更されたとき、またはデータが更新されたときに行が自動的に非表示になるようにしたかったため、ピボットテーブルを保持しているシートの「Worksheet_PivotTableUpdate」イベントから呼び出される関数を作成しましたが、必要に応じて、ボタンからそれを駆動することもできます。これは最初に、ピボットテーブルの各行をスキャンし、表示されていて必要がない場合は非表示にし (行の最初のセルが「(空白)」だったため)、非表示の場合は表示することでジョブを実行しました。それ以外の場合は、それを非表示または表示のままにしておくだけです。
ただし、関数の実行が非常に遅いことがわかったので、最初にピボットテーブルのすべての行を非表示にしてから、最初の列のすべての空白セルを見つけて範囲オブジェクトに追加してから、次の試みを行います。その範囲内のすべてのセルの行全体を非表示にします。このバージョンは約 10 倍速く動作します :-)
ピボットテーブルが存在するシートの名前、ピボットテーブルの名前、および非表示にする必要がある行で検索するオプションの文字列を渡します。これは、呼び出し元の関数によって提供されない場合、デフォルトで「(空白)」になります。
私が誰かの変数や関数の命名規則に違反した場合は、あらかじめお詫び申し上げます (私はただのハッカーです ;-))
Sub FixBlankPivotRowsV2(ByVal SheetName As String, ByVal PivotName As String, Optional HideDefn as String = "(blank)")
Dim CurrPivot As PivotTable
Dim CurrRow As Range
Dim BlankRange As Range 'NB This is where we'll build the range of things to hide, which will initially be Nothing, as we never initialise it.
Dim oldStatusBar As Boolean
'Show a nice message in the status bar
oldStatusBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True
Application.StatusBar = "Hiding blank entries in " & SheetName & ", back in a sec..."
Application.ScreenUpdating = False
'Get the pivottable to work with
Set CurrPivot = ActiveWorkbook.Sheets(SheetName).PivotTables(PivotName)
'Unhide all of the pivot rows first
CurrPivot.RowRange.Rows.EntireRow.Hidden = False
'Loop around each row in the pivottable
For Each CurrRow In CurrPivot.RowRange.Rows
If CurrRow.Offset(0, 0).value = HideDefn Then
If BlankRange Is Nothing Then
'This is the first blank row we've found, so just set the range up to be the first cell of that range
Set BlankRange = CurrRow.Offset(0, 0)
Else
'Add the newly found blank row to the range using a Union
Set BlankRange = Union(BlankRange, CurrRow.Offset(0, 0))
End If
End If
Next
'Only hide things if there's anything to hide!
If BlankRange Is Nothing Then
Debug.Print "Nothing to hide!"
Else
BlankRange.EntireRow.Hidden = True
End If
'Set the status bar back the way it was
Application.ScreenUpdating = True
Application.StatusBar = False
Application.DisplayStatusBar = oldStatusBar
End Sub
Go To Special タイプの機能の 1 つを使用して、最初の列のすべての「空白」セルを選択する方法を探しましたが、法案に適合するものは見つかりませんでした。方法を知っている場合はお知らせください。これをさらにスピードアップするようなことをしてください。
これが誰かに役立つことを願っています!