1

我编写了以下代码来隐藏工作表使用范围内的空白行。代码工作得很好。我已将此宏分配给工作表上的一个按钮。单击该按钮可隐藏已使用范围内的空白行。

问题:如何修改代码以便单击同一个按钮执行相反的操作?如果空白行未隐藏,则单击按钮将其隐藏;如果它们被隐藏,那么单击相同的按钮会取消隐藏它们吗?我想用一个按钮执行这两个过程。

Sub HideLLRows()
'This sub un/hides blank rows in EIRP LL

Application.ScreenUpdating = False

Dim LastRow As Long
Set EIRPLL = Sheets("EIRP LL")

LastRow = EIRPLL.UsedRange.Rows.Count

For i = 6 To LastRow
    If EIRPLL.Range("B" & i) = "" Then
        EIRPLL.Rows(i).Hidden = True
    End If
Next

Application.ScreenUpdating = True
End Sub
4

1 回答 1

3

简单的答案是在找到每个空白行时切换它的状态Hidden

EIRPLL.Rows(i).Hidden = Not EIRPLL.Rows(i).Hidden

这样做的缺点是,如果用户更改了一个或多个空白行的隐藏状态,那么此宏不会让您恢复到全部隐藏或全部可见。

另一种方法是根据找到的第一个空白设置可见性。

这是重构的代码,并进行了一些额外的优化:

  • Dim 你所有的变量
  • 循环一个可变数组,而不是一个范围。这快得多
  • 一次性设置Hidden所有行的属性

Sub HideLLRows()
    'This sub un/hides blank rows in EIRP LL

    Application.ScreenUpdating = False
    Dim i As Long
    Dim EIRPLL As Worksheet
    Dim NewState As VbTriState
    Dim dat As Variant
    Dim rws As Range

    Dim LastRow As Long
    Set EIRPLL = Sheets("EIRP LL")

    With EIRPLL.UsedRange
        LastRow = .Rows.Count - .Row + 1 ' in case used range doesn't start at row 1
        dat = .Columns(2).Resize(LastRow, 1)
    End With

    NewState = vbUseDefault
    With EIRPLL
        For i = 6 To LastRow
            If dat(i, 1) = "" Then
                If NewState = vbUseDefault Then
                    NewState = Not .Rows(i).Hidden
                End If
                If rws Is Nothing Then
                    Set rws = Cells(i, 1)
                Else
                    Set rws = Union(rws, Cells(i, 1))
                End If
            End If
        Next
    End With
    rws.EntireRow.Hidden = NewState

    Application.ScreenUpdating = True
End Sub
于 2013-08-25T03:30:26.410 回答