我正在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
答案 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
的最后使用行。