【问题标题】:Hide and Unhide Blank Rows With the Same Button使用相同的按钮隐藏和取消隐藏空白行
【发布时间】:2013-08-25 02:54:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    简单的答案是切换找到每个空白行的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
    

    【讨论】:

    • 您的代码运行良好,我非常感激。解决方案比我预期的要复杂,我必须研究这些新概念,尤其是你关于循环速度的观点,因为我正在运行许多循环。再次感谢。
    • 不错的克里斯。我想,我有一个使用SpecialCells 的解决方案,但我(再次)意识到xlCellTypeBlanks 无法识别导致空白的公式。
    • 感谢 Doug,我一直忘记SpecialCells。我的代码也无法识别返回空白的公式。 (但可以改为使用.Formula 而不是默认的.Value
    • 道格,刚看到这个。感谢您的输入。 SpecialCells 是我需要理解的其他东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    相关资源
    最近更新 更多