Private Sub App_SheetChange如果在以前的macros中发生错误,则不起作用

当对单元格A1进行更改时,我有以下代码来激活一个macros

类模块

Option Explicit Private WithEvents App As Application Private Sub Class_Initialize() Set App = Application End Sub Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range) 'When AIMS cell "A1" changes, this macro is run If Sh.Name = "AIMS" Then Dim rngKeyCells As Range Set rngKeyCells = Sh.Range("A1") If Intersect(rngKeyCells, Target) Is Nothing Then Exit Sub End If Application.Run "AIMS_and_eFEAS_Report.AIMS_Criteria" End If End Sub 

This_Workbook代码

 Private OurEventHandler As AIMSEventHandler Private Sub Workbook_Open() 'Initiates the data change when the filter is changed Set OurEventHandler = New AIMSEventHandler End Sub 

这通常工作绝对好,但是如果我打开VBA后尝试在A1中进行更改会发生问题。

它可以在90%的时间内正常工作,但是如果在我运行的前一个macros中有一个错误,它将不起作用。

示例 – 我运行一个macros,将工作表删除到活动的左侧。 如果没有工作表在活动的左侧,它将会出错。 我按结束,这很好。 现在,如果我尝试更改单元格A1,并期望上面的macros运行,没有任何反应。

这是不能显示整个macros的那种东西吗? 或者它可能是内置于导致问题的macros的其他部分的东西?

谢谢

在编程中有一些名为devise模式 。 在你的情况下,为Appvariables创build一个Singleton将会非常有用。

下面是VBA的一个很好的例子: 如何在 VBA 中创build公共/共享实例

正如在评论中已经提到的那样:当错误发生,按下end ,整个VBA上下文被重置,全局variables的内容丢失(所以你的variablesOurEventHandler nothing )。

如果你不能捕捉到所有的错误,以确保这个重置没有发生(我想你永远不会真的可以),也许这是最容易实现在工作表本身的事件处理程序:

 Private Sub Worksheet_Change(ByVal Target As Range) ' Ne need to check Worksheet as the Hander is valid only for the Worksheet if target.row = 1 and target.column = 1 then Application.Run "AIMS_and_eFEAS_Report.AIMS_Criteria" end if End Sub