标签:VBA
使用Excel VBA隐藏行的简单方法是使用联合区域。通常,如果要使用VBA快速隐藏行,可以选择自动筛选工具,使用一行代码可快速隐藏数千行。然而,如果需要在同一区域内为其他目的使用自动筛选,那就必须单独处理每个单元格。如果了解VBA,当程序必须在多个单元格上循环时,它可能会较慢,尤其是在每次迭代后需要执行操作时。
下面,我们将使用Union方法,联合要操作的行,这将只需要一行代码就能隐藏行,大大减少了代码的运行时间。假设列A中包含有“Hide”和“Show”,其中显示为hide的行将被隐藏,显示为show的行将可见,如下图1所示。
图1
隐藏行的程序需要设置起点、终点,然后设置从起点到终点的循环。我们设置了两个区域: Rng代表整个使用的列,r代表当前单元格。然后遍历Rng区域,并将连接的区域赋值给第3个区域(称为JoinR)。Union用于联合区域,联合区域是由多个通常不连续的区域组成的区域。然后,我们使用联合区域隐藏所有含有“Hide”的行。
程序代码如下:
代码语言:javascript复制Sub HideRows()
Dim JoinR As Range
Dim Rng As Range
Dim sh As Worksheet
Dim r As Range
Dim lr As Long
'要处理的工作表
Set sh = Sheet1
lr = sh.Range("A" & Rows.Count).End(xlUp).Row
Set Rng = sh.Range("A2:A" & lr)
For Each r In Rng.Rows
'If WorksheetFunction.CountIf(r,"Hide") Then
If r.Value = "Hide" Then
If Not JoinR Is Nothing Then
Set JoinR = Application.Union(JoinR, r)
Else
'含有"Hide"的第一个单元格
Set JoinR = r
End If
End If
Next r
JoinR.EntireRow.Hidden = True
End Sub
Sheet1是名为Hide的工作表的工作表代码名称。lr代表工作表中最后使用的行的行号。最后,Rng变量是第一个使用的行到最后一个使用的行之间的区域。
Set sh = Sheet1
lr = sh.Range("A" & Rows.Count).End(xlUp).Row
Set Rng = sh.Range("A2:A" & lr)
接下来要做的是创建一个循环构造。对于区域内的每个单元格,检查该单元格是否包含“Hide”。因此,从第2行开始,以最后使用的区域结束。变量由r表示当前单元格。
For Each r In Rng
检查r中的值是否为“Hide”:
If r.Value = "Hide" Then
下面是关键。为一个称为JoinR的联合区域引入一个变量,需要检查变量JoinR中是否有任何内容。如果它不是空的,那么希望通过简单的添加来增加区域JoinR。
下面的代码检查JoinR是否为非空:
If Not JoinR Is Nothing Then
如果不为空,则会将JoinR的区域设置为自身加上由r代表的单元格,从而在每次遇到“Hide”单元格时,都会增加区域JoinR。如果JoinR为空且单元格值等于“Hide”,则将按如下方式为JoinR指定其第一个单元格:
Set JoinR = r
其中,JoinR等于r。现在,JoinR附带了一个可验证的区域,上面检查非空白范围的行将开始并持续添加到联合区域JoinR。
最后,在遍历和If语句完成后,该过程将一次性隐藏联合区域,然后该过程结束。
JoinR.EntireRow.Hidden = True
通过一次隐藏行,而不是一行一行地隐藏,节省了大量时间。
注:本文学习整理自thesmallman.com,有兴趣的朋友可到该网站下载原始示例工作表,或者到知识星球App完美Excel社群下载。