2013-01-16 47 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,因此,它可以再次

(*) - 它具有一个模块范围的范围,即它在不同的调用中保持它的值,而程序范围的范围(=在子集中变暗)会为每个调用创建一个新变量