Попробуйте это:
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Dim xRg As Range, xCell As Range, bHide As Boolean
Application.ScreenUpdating = False
For Each xRg In Range("G24:G71, N24:N71").Rows
bHide = True
For Each xCell In xRg.Cells
If IsEmpty(xRg.Value) = False Then
bHide = False
End If
Next xCell
xRg.EntireRow.Hidden = bHide
Next xRg
Application.ScreenUpdating = True
End Sub
Объяснение ошибки: ваш код перебирает все ячейки и принимает решение на основе отдельных ячеек. Это неверно, потому что вы хотите знать, являются ли обе ячейки в строке пустыми.
Решение. Таким образом, вы должны перебирать строки во внешнем цикле, а ячейки внутри данной строки во внутреннем цикле. Обратите внимание на наличие непустой ячейки и примите решение о скрытии строки, основываясь на этом.
Обновление
Извините, мой код не работал, потому что Range("G24:G71, N24:N71")
состоит из 2 .Areas,
и хотя .Rows.Count
возвращает 48, For Each
перечисляет 96 "строк", каждая из которых состоит из 1 ячейки (48 строк для каждой области).
Я изменил код, чтобы учесть Области:
Private Sub Worksheet_PivotTableUpdate()
Application.ScreenUpdating = False
With Range("G24:G71,N24:N71")
Dim r As Long: For r = 1 To .Areas(1).Rows.Count
Dim bHide As Boolean: bHide = True
Dim xArea As Range: For Each xArea In .Areas
If IsEmpty(xArea.Cells(r, 1).Value) = False Then
bHide = False
End If
Next xArea
.Rows(r).EntireRow.Hidden = bHide
Next r
End With
Application.ScreenUpdating = True
End Sub