自动激活宏,而无需单击目标单元格

时间:2018-09-12 17:47:44

标签: excel-vba

我有一个宏,当单元格中的值更改时,该宏可隐藏某些行。但是,除非您输入目标单元格并单击它,否则此宏将不会运行。我尝试了几种替代方法,但没有一种适合我。

表格

Private Sub Worksheet_Change(ByVal Target As Range)
If Range("$b$156").Value = 1 Then Call oculta_4
If Range("$b$156").Value = 2 Then Call oculta_5
If Range("$b$156").Value = 3 Then Call oculta_6
If Range("$b$156").Value = 4 Then Call oculta_7
End Sub

Sub oculta_4()
Rows("158:176").EntireRow.Hidden = False
Range("$c$158").Select
For Each celda In Range("$c$158:$c$176")
If celda.Value = 0 Then
ActiveCell.EntireRow.Hidden = True
End If
ActiveCell.Offset(1).Select
Next
End Sub

1 个答案:

答案 0 :(得分:1)

正如其他人所说,要响应由公式更改的值,您需要使用Worksheet_Calculate

由于Worksheet_Calculate没有Target属性,因此您需要创建自己的某些单元格变化检测。使用Static变量来跟踪最后一个值。

您还应该声明所有其他变量。

重复引用同一单元格速度很慢,并使代码更难更新。一次将其放入变量,然后访问该变量

Select Case避免了使用许多If

不要使用Call,这是不必要且过时的。

添加Application.ScreenUpdating = False将使您的代码更加生动,而不会闪烁

写行的隐藏状态比读它要花很多时间。因此,仅在需要时才编写。

这样的事情(将所有这些代码放在工作表的代码后面(Hoja1,对吧?)

Private Sub Worksheet_Calculate()
    Static LastValue As Variant
    Dim rng As Range

    Set rng = Me.Range("B156")

    If rng.Value2 <> LastValue Then
        LastValue = rng.Value2
        Select Case LastValue 
            Case 1: oculta_4
            Case 2: oculta_5
            Case 3: oculta_6
            Case 4: oculta_7
        End Select
    End If
End Sub


Sub oculta_4()
    Dim celda As Range
    Application.ScreenUpdating = False
    For Each celda In Me.Range("C158:C176")
        With celda.EntireRow
            If celda.Value = 0 Then
                If Not .Hidden Then .Hidden = True
            Else
                If .Hidden Then .Hidden = False
            End If
        End With
    Next
    Application.ScreenUpdating = True
End Sub