2017-03-20 44 views
1

我已經在不同的方式加載了這個宏兩天,試圖防止重複步驟,但範圍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 
+4

您正在相應地更改工作表,因此每次調用子工具。你需要讀通過這個http://www.ozgrid.com/forum/showthread.php?t=37042 on'enableevents' –

回答

1

您的代碼在Worksheet_Change event。每次工作表被改變了這一事件觸發,包括當你的代碼改變它

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

因此你被困在一個潛在的無限循環。爲了使您可能需要啓用或禁用你調用過的潛艇內的事件進行任何更改

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 

之前避免這種disable events

順便說一句我會檢查你是否真的需要那些退出子,如果不是,你可以在開始時禁用一次事件,並在最後重新啓用。

+0

我不知何故錯過了重新啓用事件的路線。你可以編輯,這樣我可以收回我的倒票嗎? (它目前被鎖定,直到編輯發生) – Jeeped

+0

完成。我假設代碼適合你? – Absinthe

+0

完成。我假設代碼有效(它當然看起來是正確的),但我用自己的版本做了一個稍微不同的路線。 – Jeeped

2

您的Worksheet_Change已經屈服於事件驅動的工作表/工作簿子過程中最常見的三個錯誤。

  • 您在對工作表進行修改時並未禁用事件。每次更改都會觸發另一個事件,並且Worksheet_Change嘗試一遍又一遍地重複運行,直到它崩潰。
  • 目標可能是單個單元格或多個單元格。你需要通過使用Intersect來處理目標被多個單元格處理的可能性,以便在你的可能範圍內獲得受影響的單元格。
  • 如果您因任何原因禁用事件,請務必提供錯誤控制,以便在所有事情都向南時再次啓用事件。通常,這可以在退出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