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模式 。 在你的情况下,为App
variables创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