工作表更改重复步骤

时间:2017-03-20 13:56:11

标签: excel vba excel-vba

我已经用不同的方法将这个宏重做了两天,试图阻止步骤重复但是G2步骤似乎运行3或4次,范围G3运行2或3次。有没有人有任何想法?

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Target.Worksheet.Range("G2")) Is Nothing Then
        Range("g4").Value = "Team"
        Range("g3").Value = "Division"
        Call check
        Exit Sub
    End If

    If Not Intersect(Target, Target.Worksheet.Range("G3")) Is Nothing Then
        Range("G4").Value = "Team"
        Call check
        Exit Sub
    End If

    If Not Intersect(Target, Target.Worksheet.Range("G4")) Is Nothing Then
        Call check
        Exit Sub
    End If

    If Not Intersect(Target, Target.Worksheet.Range("D4")) Is Nothing Then
        Call check
        Exit Sub
    End If
End Sub

2 个答案:

答案 0 :(得分:3)

您的Worksheet_Change已经死于事件驱动的工作表/工作簿子过程中最常见的三个错误。

  • 您在修改工作表时没有禁用事件。每次更改都会触发另一个事件,并且Worksheet_Change会一遍又一遍地尝试在其上运行,直到崩溃为止。
  • 目标可以是单个细胞或许多细胞。您需要通过使用Intersect来处理Target为多个单元格的可能性,以便仅在您的可能范围内获取受影响的单元格。
  • 如果您因任何原因禁用了某些事件,请务必提供错误控制,以便在所有内容都向南时重新启用它们。通常,这可以在退出Worksheet_Change之前完成,但如果您要使用Exit Sub则不行。

这是我的程序版本。

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("D4, G2:G4")) Is Nothing Then
        On Error GoTo Safe_Exit
        Application.EnableEvents = False
        Dim trgt As Range
        For Each trgt In Intersect(Target, Range("D4, G2:G4"))
            Select Case trgt.Address(0, 0)
                Case "G2"
                    Range("G3:G4") = Application.Transpose(Array("Division", "Team"))
                    'call check is below
                Case "G3"
                    Range("G4") = "Team"
                    'call check is below
                Case "D4", "G4"
                    'call check is below
            End Select

        Next trgt
        Call check
    End If

Safe_Exit:
    Application.EnableEvents = True
End Sub

答案 1 :(得分:1)

您的代码位于Worksheet_Change http://jwwishart.blogspot.co.at/2011/03/custom-server-and-client-side-required.html中。每次更改工作表时,此事件都会触发,包括代码更改时

Range("g4").Value = "Team"

因此,您陷入了潜在的无限循环中。在进行任何更改之前避免此event

Private Sub Worksheet_Change(ByVal Target As Range)

    Application.EnableEvents = False ' this turns events off

    If Not Intersect(Target, Target.Worksheet.Range("G2")) Is Nothing Then
        Range("g4").Value = "Team"
        Range("g3").Value = "Division"
        Call check
        Application.EnableEvents = True
        Exit Sub
    End If

    If Not Intersect(Target, Target.Worksheet.Range("G3")) Is Nothing Then
        Range("G4").Value = "Team"
        Call check
        Application.EnableEvents = True
        Exit Sub
    End If

    If Not Intersect(Target, Target.Worksheet.Range("G4")) Is Nothing Then
        Call check
        Application.EnableEvents = True
        Exit Sub
    End If

    If Not Intersect(Target, Target.Worksheet.Range("D4")) Is Nothing Then
        Call check
        Application.EnableEvents = True
        Exit Sub
    End If

    Application.EnableEvents = True

End Sub

您可能需要启用或禁用您也要调用的潜水员中的事件。

顺便说一下,我确定你是否真的需要那些退出子系统,如果不是,你可以在开始时禁用一次事件,最后再次重新启用。