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