无需单击目标单元格即可自动激活宏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无需单击目标单元格即可自动激活宏相关的知识,希望对你有一定的参考价值。

我有一个宏,当单元格中的值发生变化时会隐藏某些行。但是,除非您输入目标单元格并单击它,否则此宏不会运行。我尝试了几种替代方案,但对我来说都没有用。

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
答案

正如其他人所说,为了响应公式改变的值,你需要使用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

以上是关于无需单击目标单元格即可自动激活宏的主要内容,如果未能解决你的问题,请参考以下文章

将组合框单元格上的双击激活更改为单击?

Excel在单元格按回车触发宏问题

将单元格从一个工作表保存到另一个工作簿中的工作表 - 无需提示即可保存

在单元格更改时自动执行 Excel 宏

自动填充目标创建更长的运行时间

EXCEL单击单元格事件