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