根据不同的列数据范围隐藏行

时间:2019-03-06 12:34:39

标签: excel vba

我对使用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列,识别出具有较大数据范围并隐藏超出该点的行。

在此先感谢您的帮助。

2 个答案:

答案 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