如果cell = 0,如何遍历范围名称并隐藏行?

时间:2015-09-15 09:26:17

标签: excel vba excel-vba

我在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

这里有什么问题,我需要做些什么才能让它发挥作用?

1 个答案:

答案 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 将使用最后分配的值,这将是错误的。