我在Excel 2007中有几个VBA例程。有一个模板工作表被复制(并相应地更改)最多50次。现在,此模板包含一个名为“HideRows”的范围,因此在所有这些新工作表中会多次复制此范围。我想隐藏“HideRows”范围内包含值0
的所有行。并非所有行都应隐藏,只有那些包含值0
的行。这是我到目前为止所得到的:
Option Explicit
Sub HideEmptyRows()
Dim rngName As Range
Dim cell As Range
Application.ScreenUpdating = False
For Each rngName In ActiveWorkbook.Names
If rngName.Name = "HideRows" Then
With cell
For Each cell In rngName
If .Value = 0 Then
.EntireRow.Hidden = True
End If
Next cell
End With
End If
Next rngName
这里有什么问题,我需要做些什么才能让它发挥作用?
答案 0 :(得分:0)
您可以直接寻址指定范围而无需循环。没有测试这个命名范围是否存在,根据您的描述,可以安全地假设 其次,不要在设置引用变量的循环之外使用“with”语句。试试这个:
a <- 1
b <- 2
修改强>
如果工作簿包含多个相同的工作表,其中每个工作表可能包含此命名范围,则必须循环。此代码不会遍历所有名称,而是遍历所有工作表,并测试每个工作表中指定范围的存在:
Option Explicit
Sub HideEmptyRows()
Dim rngName As Range
Dim cell As Range
Application.ScreenUpdating = False
For Each cell In range("HideRows")
If cell.Value = 0 Then
cell.EntireRow.Hidden = True
End If
Next cell
Application.ScreenUpdating = True
必须在分配之前显式重置范围变量,否则如果范围不存在则跳过此步骤。以下Sub HideEmptyRows()
Dim sh As Sheets
Dim rng As Range, cell As Range
For Each sh In ActiveWorkbook.Sheets
Set rng = Nothing ' this is crucial!
On Error Resume Next
Set rng = sh.Names("HideRows")
On Error GoTo 0
If Not rng Is Nothing Then
For Each cell In rng
cell.EntireRow.Hidden = (cell.Value = 0)
Next cell
End If
Next sh
End Sub
将使用最后分配的值,这将是错误的。