2017-03-20 6 views
1

Ich habe dieses Makro für zwei Tage in einer Last von verschiedenen Möglichkeiten überarbeitet, um zu versuchen, Schritte zu verhindern, aber der Bereich G2 Schritt scheint 3 oder 4 mal und der Bereich G3 2 oder 3 mal zu laufen. Hat jemand irgendwelche Ideen ??Arbeitsblatt Ändern sich wiederholende Schritte

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 
+4

Sie ändern das Blatt entsprechend, also das Sub, jedes Mal anrufend. Sie müssen diese http://www.ozgrid.com/forum/showthread.php?t=37042 über 'enableevents' durchlesen –

Antwort

1

Ihr Code ist in der Worksheet_Change event. Jedes Mal, wird das Arbeitsblatt dieses Ereignis ausgelöst wird geändert, auch wenn der Code ändert es

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

So sind Sie in einer potentiell unendlichen Schleife stecken. Um dies zu vermeiden disable events bevor Sie Änderungen

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 

Unter Umständen müssen Sie aktivieren oder deaktivieren Ereignisse innerhalb der U-Boote auch Sie anrufen.

BTW Ich würde prüfen, ob Sie wirklich diese Exit Subs benötigen, wenn nicht, können Sie einfach einmal am Anfang Ereignisse deaktivieren und am Ende wieder aktivieren.

+0

Ich habe irgendwie die Zeilen verpasst, die Ereignisse wieder aktivieren. Könnten Sie bearbeiten, damit ich meine Down-Abstimmung zurückziehen kann? (es ist derzeit gesperrt, bis eine Bearbeitung stattfindet) – Jeeped

+0

Fertig. Ich nehme an, dass der Code für Sie funktioniert hat? – Absinthe

+0

Fertig. Ich gehe davon aus, dass der Code funktioniert (es sieht sicherlich korrekt aus), aber ich habe eine etwas andere Route mit meiner eigenen Version genommen. – Jeeped

2

Ihr Worksheet_Change ist drei der häufigsten Fehler in einer ereignisgesteuerten Arbeitsblatt-/Arbeitsmappen-Unterprozedur erlegen.

  • Sie deaktivieren keine Ereignisse, während Sie Änderungen am Arbeitsblatt vornehmen. Jede Änderung löst ein anderes Ereignis aus, und das Worksheet_Change versucht, immer wieder über sich selbst zu laufen, bis es abstürzt.
  • Ziel könnte eine einzelne Zelle oder viele Zellen sein. Sie müssen sich mit der Möglichkeit befassen, dass Target viele Zellen ist, indem Sie Intersect verwenden, um nur die betroffenen Zellen innerhalb Ihrer Möglichkeiten zu erreichen.
  • Wenn Sie Ereignisse aus irgendeinem Grund deaktivieren, stellen Sie sicher, Fehlerkontrolle bereitzustellen, die sie wieder aktiviert, wenn alles in den Süden geht. In der Regel kann dies kurz vor dem Beenden von Worksheet_Change ausgeführt werden, nicht jedoch, wenn Sie Exit Sub verwenden möchten.

Hier ist meine Version Ihres Verfahrens.

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 
Verwandte Themen