VBA手动工作表计算变更事件

时间:2018-04-23 05:37:21

标签: excel vba

我对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

1 个答案:

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

这似乎在测试工作簿上运行良好。在您自己的情况下,可能需要额外的错误和循环控制。