Private Sub App_SheetChange如果在前一个宏中发生错误,则无效

时间:2017-08-07 09:29:16

标签: excel vba excel-vba

我有以下代码在对单元格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并期望上面的宏运行,则没有任何反应。

这是否可以在不显示整个宏的情况下解决?或者它可能是导致问题导致宏的其余部分的内容?

由于

2 个答案:

答案 0 :(得分:0)

在编程中有一些名为设计模式的东西。在您的情况下,为App变量创建 Singleton 非常有用。

以下是VBA的一个很好的例子: How to create common/shared instance in vba

答案 1 :(得分:0)

正如评论中已经提到的:当发生错误并按下end时,整个VBA上下文被重置,全局Vars的内容将丢失(因此您的变量OurEventHandler为{{ 1}})。

如果你无法捕获所有错误以确保没有发生这种重置(我认为你真的不能),也许最容易在工作表本身中实现事件处理程序:

nothing