我对VBA很新,并且正在寻找有关如何手动控制下面的更改事件的任何建议。 列“F”有一个返回“失败”或“0”的Vlookup,而当F列中的单个单元格变为0时,让每个单独的代码隐藏行,我发现下面的工作效果最好。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRow As Long
If Target.Column = 6 Then
' Loop through rows 5-160
For myRow = 5 To 160
' Hide row in entry in column F is "0"
Rows(myRow).Hidden = (Cells(myRow, "F") = "0")
Next myRow
End If
End Sub
我尝试使用下面的事件更改,但它崩溃了程序并始终重新启动。任何建议都将不胜感激。谢谢!
Private Sub Worksheet_Calculate()
Worksheet_Change Range("F:F")
End Sub
答案 0 :(得分:0)
这是我想要完成的版本。如果F5:F160中的公式返回的值发生更改,则更改的值将被Worksheet_Calculate捕获,并且只有那些更改的值由Worksheet_Change处理。
警告:当易失性函数在工作簿中时,这种从公式捕获更改值的方法不能很好地工作。易失性函数包括TODAY(),NOW(),OFFSET(...)等。
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("F5:F160")) Is Nothing Then
Application.EnableEvents = False
On Error GoTo meh
Dim t As Range
Debug.Print "chg: " & Intersect(Target, Range("F5:F160")).Address(0, 0)
For Each t In Intersect(Target, Range("F5:F160"))
't.EntireRow Hidden = CBool(LCase(t.Value2) = "fail" or t.Value2=0)
t.EntireRow.Hidden = CBool(LCase(t.Value2) = "fail")
Next t
End If
meh:
Application.EnableEvents = True
End Sub
Private Sub Worksheet_Calculate()
Static effs As Variant
Dim f As Long, t As Range
If IsEmpty(effs) Then
effs = Range("F1:F160").Value2
For f = 5 To 160
If IsError(effs(f, 1)) Then effs(f, 1) = vbNullString
Next f
Else
For f = 5 To 160
If Not IsError(Cells(f, "F")) Then
If effs(f, 1) <> Cells(f, "F").Value2 Then
If Not t Is Nothing Then
Set t = Union(t, Cells(f, "F"))
Else
Set t = Cells(f, "F")
End If
effs(f, 1) = Cells(f, "F").Value2
End If
End If
Next f
If Not t Is Nothing Then
Debug.Print "calc: " & t.Address(0, 0)
Worksheet_Change t
End If
End If
End Sub
这似乎在测试工作簿上运行良好。在您自己的情况下,可能需要额外的错误和循环控制。