如果VBA for Excel中的单元格区域中的所有可见单元格都为空白,如何隐藏行?

时间:2019-04-30 23:09:20

标签: excel vba

我正在Excel电子表格中运行一些VBA宏,以帮助我从视图中消除不相关的数据,然后允许我导出/复制所拥有的全部数据中的一部分。我的电子表格大小是Columns(A:BN)和Rows(1:4693),我想这是一个不错的大小数据集。列(A:G)将始终保持可见。我只想隐藏Columns(H:BN)中的内容。

首先,如果要使该列保持可见状态,请将列值设置为“ Y”,然后单击“隐藏列”按钮,方法是将此子例程附加到按钮上:

Sub Hidecolumn()
Dim p As Range
    For Each p In Range("H1:BN1").Cells
        If p.Value = "N" Then
            p.EntireColumn.Hidden = True          
        End If
    Next p  
End Sub

这很好用。

我还有一个“显示所有列”按钮,使所有隐藏的列重新出现,我这样做是:

Sub Unhidecolumn()
Dim p As Range
    For Each p In Range("H1:BN1").Cells
        If p.Value = "Y" Or p.Value = "N" Then
            p.EntireColumn.Hidden = False    
        End If
    Next p   
End Sub

现在我有了想要的列,现在我需要隐藏所有不需要的行。如果存在该行-列关系,则每个单元格中都将有一个“ Y”。如果没有关系,它将为空白。我想隐藏所有在单元格区域中所有可见单元格都为空白的行。单元格范围内的所有单元格都必须为空白。

一旦我隐藏了所有不需要的行,那么我就可以复制剩余的/可见的数据并将其复制到新的工作簿以与其他人共享,因为他们只需要与他们相关的数据。

最后,就像我能够取消隐藏所有隐藏的列一样,我也需要能够取消隐藏所有隐藏的行。

最后,我要在工作表上放置4个按钮。
1.隐藏列 2.取消隐藏列 3.隐藏行 4.取消隐藏行

我已经有前2个,现在我需要后2个。请帮助。

更新:解决方案-谢谢@ K.Davis!

Sub HideRowsSecond()

    Dim srcRng As Range, ws As Worksheet
    Set ws = ActiveSheet
    Set srcRng = ws.Rows("5:" & ws.Cells(ws.Rows.Count, 4).End(xlUp).Row)

    Dim R As Range, hideRng As Range
    For Each R In srcRng
        If Application.CountA(R.Columns("H:BN").SpecialCells(xlCellTypeVisible)) = 0 Then
            If hideRng Is Nothing Then
                Set hideRng = R.EntireRow
            Else
                Set hideRng = Application.Union(hideRng, R.EntireRow)
            End If
        End If
    Next R

    If Not hideRng Is Nothing Then hideRng.EntireRow.Hidden = True
    MsgBox ("Complete")
End Sub

1 个答案:

答案 0 :(得分:2)

您可以使用预先构建的CountA()工作表函数来计算其中包含数据的单元格的数量。如果整行为空白,则此计数将返回0的值。

我会使用UsedRange,因此您不必不必要地计算过去的数据。我还希望合并要隐藏的范围并一次全部隐藏它们,而不是一次隐藏一个以获得更好的性能。

Sub HideRows()

    Dim r As Range, hideRng As Range

    For Each r In ActiveSheet.UsedRange.Rows
        If Application.CountA(r.EntireRow) = 0 Then
            If hideRng Is Nothing Then
                Set hideRng = r.EntireRow
            Else
                Set hideRng = Application.Union(hideRng, r.EntireRow)
            End If
        End If
    Next r

    If not hideRng is nothing then hideRng.EntireRow.Hidden = True

End Sub

您不需要使行的隐藏变得过于复杂。这将取消隐藏行而不循环。

Sub UnHideRows()

    ActiveSheet.Cells.EntireRow.Hidden = False

End Sub

感谢克里斯·尼尔森(Chris Neilsen)指出,您可能只想检查可见列是否有任何数据,您可以使用它代替第一个代码:

Sub HideRows()

    Dim r As Range, hideRng As Range

    UnHideRows

    For Each r In ActiveSheet.UsedRange.Rows
        If Application.CountA(r.EntireRow.SpecialCells(xlCellTypeVisible)) = 0 Then
            If hideRng Is Nothing Then
                Set hideRng = r.EntireRow
            Else
                Set hideRng = Application.Union(hideRng, r.EntireRow)
            End If
        End If
    Next r

    If Not hideRng Is Nothing Then hideRng.EntireRow.Hidden = True

End Sub



每个OP仅希望查看H:BN列之间的可见行中的响应,您可以使用以下命令来完成此操作:

Sub HideRows()

    Dim srcRng As Range, ws As Worksheet
    Set ws = ActiveSheet
    Set srcRng = ws.Rows("1:" & ws.Cells(ws.Rows.Count, 1).End(xlUp).Row)

    UnHideRows

    Dim r As Range, hideRng As Range
    For Each r In srcRng
        If Application.CountA(r.Columns("H:BN").SpecialCells(xlCellTypeVisible)) = 0 Then
            If hideRng Is Nothing Then
                Set hideRng = r.EntireRow
            Else
                Set hideRng = Application.Union(hideRng, r.EntireRow)
            End If
        End If
    Next r

    If Not hideRng Is Nothing Then hideRng.EntireRow.Hidden = True

End Sub

在此函数中,我继续创建了一个新的Range变量srcRng,因为有时将Columns()函数与UsedRange一起使用可能会引起问题。由于我们不再使用UsedRange,因此现在可以找到ws.Cells(ws.Rows.Count, 1).End(xlUp).Row的最后使用行。