我有以下代码在对单元格A1进行更改时激活宏
课程模块
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)
If Sh.Name = "S" Then
Dim rngKeyCells As Range
Set rngKeyCells = Sh.Range("A1")
If Intersect(rngKeyCells, Target) Is Nothing Then
Exit Sub
End If
Application.Run "a"
End If
End Sub
This_Workbook Code
Private OurEventHandler As EventHandler
Private Sub Workbook_Open()
'Initiates the data change when the filter is changed
Set OurEventHandler = New EventHandler
End Sub
这通常非常好用,但是如果我在打开VBA后尝试在A1中进行更改,则会出现问题。
它可以在90%的时间内正常工作,但是如果在我之前运行的某个宏之一中出现错误,它将无法正常工作。
示例 - 我运行一个宏,删除活动工作表左侧的工作表。如果活动的左侧没有工作表,则会出错。我按下结束,这没关系。现在,如果我尝试更改单元格A1并期望上面的宏运行,则没有任何反应。
这是否可以在不显示整个宏的情况下解决?或者它可能是导致问题导致宏的其余部分的内容?
由于
答案 0 :(得分:0)
在编程中有一些名为设计模式的东西。在您的情况下,为App
变量创建 Singleton 非常有用。
以下是VBA的一个很好的例子: How to create common/shared instance in vba
答案 1 :(得分:0)
正如评论中已经提到的:当发生错误并按下end
时,整个VBA上下文被重置,全局Vars的内容将丢失(因此您的变量OurEventHandler
为{{ 1}})。
如果你无法捕获所有错误以确保没有发生这种重置(我认为你真的不能),也许最容易在工作表本身中实现事件处理程序:
nothing