Excel 用于隐藏行的慢速VBA循环

Excel 用于隐藏行的慢速VBA循环,excel,vba,loops,hide,Excel,Vba,Loops,Hide,下面的代码用于循环遍历一个范围内的所有行,并根据该单元格中的单元格值隐藏这些行,以及下面的一行。如果两个单元格值均为=“则目的是隐藏整行。一切都很好,但速度非常慢。如果您有任何更快的建议,我们将不胜感激 Sheets("Morning Report Export Sheet").Activate For x = 10 To 108 If Cells(x, 9).Value = "" Then If Cells(x + 1, 9).

下面的代码用于循环遍历一个范围内的所有行,并根据该单元格中的单元格值隐藏这些行,以及下面的一行。如果两个单元格值均为=“则目的是隐藏整行。一切都很好,但速度非常慢。如果您有任何更快的建议,我们将不胜感激

Sheets("Morning Report Export Sheet").Activate

For x = 10 To 108
    If Cells(x, 9).Value = "" Then
        If Cells(x + 1, 9).Value = "" Then
            Cells(x, 9).EntireRow.Hidden = True
        End If
    End If
Next
。。。也尝试了以下方法,但速度同样缓慢

If Cells(x, 9).Value = "" And Cells(x + 1, 9).Value = "" Then

我写了两个版本,因为我很无聊

这是@MathieuGuindon提到的数组方法

子HideRowsUsingArrays()
尺寸x与长度相同,隐藏范围相同
朦胧的星空一样长,尾行一样长,山坳一样长
“目标范围
Col=9
StartRow=10
EndRow=108
“目标范围
将sh设置为工作表
设置sh=工作表(“晨报导出工作表”)
Dim vArr()作为变量
'将目标范围内的所有值保存到数组中
vArr=sh.Cells(开始、结束)。调整大小(结束行)。值
'在数组中循环
对于x=LBound(vArr)到UBound(vArr)-1
'如果val或next val为空
如果vArr(x)=“和vArr(x+1)=”那么
'将相应的行添加到HideRows范围
'如果HideRows为空,则Union将导致错误,因此第一次迭代无法使用Union
如果HideRows不算什么
设置HideRows=sh.Rows(x+StartRow-1).EntireRow
其他的
设置HideRows=Union(HideRows,sh.Rows(x+StartRow-1).EntireRow)
如果结束
如果结束
下一个x
“隐藏聚集的行
如果Not HideRows为空,则HideRows.EntireRow.Hidden=True
端接头
这是@TimWilliams链接到的范围方法

Sub-hiderowusingranges()
变暗单元格作为范围,隐藏窗口作为范围
朦胧的星空一样长,尾行一样长,山坳一样长
“目标范围
Col=9
StartRow=10
EndRow=108
“目标范围
将sh设置为工作表
设置sh=工作表(“晨报导出工作表”)
调光范围
'保存目标范围
设置r=sh.Cells(开始、结束)。调整大小(结束行)
'在范围的每个单元格中循环
对于r中的每个单元格
'如果val或next val为空
如果cell.Value=“”和cell.Offset(1).Value=“”则
'将相应的行添加到HideRows范围
'如果HideRows为空,则Union将导致错误,因此第一次迭代无法使用Union
如果HideRows不算什么
设置HideRows=单元格
其他的
设置HideRows=Union(HideRows,单元格)
如果结束
如果结束
下一个细胞
“隐藏聚集的行
如果Not HideRows为空,则HideRows.EntireRow.Hidden=True
端接头

将第9列的范围拉入一个变量数组(您必须将其转换为一个一维数组),然后迭代该数组的值,当满足条件时,将相应的
范围
合并到内存中的单元格范围中,速度会快得多(注意:循环除了使用所有相关单元格构建联合范围对象外,没有其他作用);循环完成后,您将进入UnionRange.EntireRow.Hidden=True,如果您刚刚在一次操作中隐藏了所有需要隐藏的行,则从工作表中读取一次,然后向工作表写入一次。或者,您可以通过关闭
Application.ScreenUpdate来掩盖问题并继续点击工作表在循环之前启用
并在循环之后重新启用,但我敢打赌,如果您使用联合方法,甚至不需要它。底部选项工作得更快,谢谢。顶部选项无法运行,并且超出了在线范围:
如果vArr(x)。Value=“”和vArr(x+1)。Value=“”然后
噢,哎呀,那些
.Value
不应该在那里。我会把它们拿走的