2013-01-16 64 views
0

我在這裏有這個模塊有工作簿子程序。我無法理解GenerateLimitSummary如何運行?有人可以在這裏闡述流程流程嗎?SheetCalculate - 這個子例程如何運行?

Private LimitBool As Boolean 

Private Sub Workbook_SheetCalculate(ByVal Sh As Object) 

    If LimitBool Then Exit Sub 

    ' use conditional formatting to highlight limit breaches 
    ApplyConditionalFormatting 

    ' regenerate the summary limits sheet 
    LimitBool = True 
    GenerateLimitSummary 
    LimitBool = False 

End Sub 
+0

代碼首先運行,'LimitBool'爲'False',所以代碼進入下一行並處理'ApplyConditionalFormatting'。一旦完成,它將移動到下一行,並將布爾值設置爲「True」,然後運行「GenerateLimitSummary」。布爾值再次設置爲「False」,以便「Workbook_SheetCalculate」不會進入循環。您可能想要關閉事件而不是使用布爾變量。 –

回答

1

作者使用LimitBool防止無限循環/堆棧溢出:

  • 最初,LimitBoolFalse,因此執行的Workbook_SheetCalculate其餘現在
  • LimitBool設爲True (確認後不是True
  • GenerateLimitSummary被執行。如果此例程現在由於某些原因而強制工作簿重新計算,則Workbook_SheetCalculate將再次觸發。但是,由於LimitBool現在是True *,所以此過程的第二次調用現在在第一次檢查後退出。如果它不會有這樣的檢查,它會再打電話GenerateLimitSummary,那麼這將觸發重計算,等...
  • GenerateLimitSummary跑,LimitBool重新設置爲False,因此,它可以再次

(*) - 它具有一個模塊範圍的範圍,即它在不同的調用中保持它的值,而程序範圍的範圍(=在子集中變暗)會爲每個調用創建一個新變量