我对使用VBA相当陌生,正在尝试创建一个代码,该代码将查看具有不同数据范围的两个不同列,并隐藏最后一个数据点(引用两个列)之后的行。
此刻我有这个
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
'Updateby Extendoffice 20160913
Dim xRg As Range
Application.ScreenUpdating = False
For Each xRg In Range("G24:G71, N24:N71")
If xRg.Value = "" Then
xRg.EntireRow.Hidden = True
Else
xRg.EntireRow.Hidden = False
End If
Next xRg
Application.ScreenUpdating = True
End Sub
G列和N列是两个单独的数据透视表中的人员名称。因此,根据日期的不同,每个列中的数据范围可能会有所不同(数据透视表具有不同的过滤器)。例如,今天在G列中可能有50行数据,而在N列中可能有40行数据。在这种情况下,上述公式将起作用并隐藏没有数据的第51至71行。但是,如果G列具有40行数据,而Column N有50行,那么它将引用G列并隐藏41-71行,从而从N列中隐藏不需要的数据。
有没有一种方法可以使代码查看G和N列,识别出具有较大数据范围并隐藏超出该点的行。
在此先感谢您的帮助。
答案 0 :(得分:1)
尝试这个:
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
答案 1 :(得分:0)
这是循环透视表的另一种方法。下面的代码在两个不同的列(项目和数量)和隐藏的行中循环:
Option Explicit
Sub Hide()
Dim pvtTable As PivotTable
Dim pvtItem As PivotItem
Dim pvtRow As Long
'Set table with name
Set pvtTable = ThisWorkbook.Worksheets("Sheet1").PivotTables("PivotTable1")
'Loop Items in a specific field
For Each pvtItem In pvtTable.PivotFields("Item").PivotItems
'Check conditions
pvtRow = pvtRow + 1
If pvtItem.Value = "A" Then
pvtTable.DataBodyRange.Rows(pvtRow).EntireRow.Hidden = True
ElseIf pvtItem.Value <> "A" And pvtTable.DataBodyRange.Rows(pvtRow).EntireRow.Hidden = True Then
pvtTable.DataBodyRange.Rows(pvtRow).EntireRow.Hidden = False
End If
Next pvtItem
'Loop Items in a specific field
For Each pvtItem In pvtTable.PivotFields("Quantity").PivotItems
'Check conditions
pvtRow = pvtRow + 1
If pvtItem.Value = "A" Then
pvtTable.DataBodyRange.Rows(pvtRow).EntireRow.Hidden = True
ElseIf pvtItem.Value <> "A" And pvtTable.DataBodyRange.Rows(pvtRow).EntireRow.Hidden = True Then
pvtTable.DataBodyRange.Rows(pvtRow).EntireRow.Hidden = False
End If
Next pvtItem
End Sub