在VBA中自行终止一个类

我正在为VBA编写一个Excel类。 我有一个用户窗体打开并启动类,然后类用于导航特定的文件布局。 我已经实现了基本的,但是我想要一个简单的退出方式,如果有人在另一种types的文件上运行macros。

当类初始化时,它会查找特定的单元格/值,并将这些范围设置为成员variables,例如,如果在空白文件上运行macros,则会崩溃,并显示types不匹配错误。

我不想复杂的error handling,或者不断地检查是否每个范围存在,因为这个macros只是devise用于这个特定的布局,我想,如果它不能find所有这些范围,它显示一个消息框说,文件布局看起来不对,并给出select继续(可能崩溃)或退出。

我试过调用Class_Terminate子,Me.Terminate和Set Me = Nothing。 search谷歌,这里不会提出任何我觉得有用的东西。

scheme一:

使用End 。 这是一种突然退出的方式,正如您在运行示例代码时会注意到的那样。 唯一的输出将是Class_Initialize()Debug.Print 。 这是字面上拉你的代码插件。

(在名为“CommandButton1”的命令button的UserForm中)

 Option Explicit Private Sub CommandButton1_Click() Dim example As Class1 Set example = New Class1 Debug.Print "This will not execute." End Sub Private Sub UserForm_Terminate() Debug.Print "This will not execute." End Sub 

在Class1中:

 Option Explicit Private Sub Class_Initialize() Debug.Print "Couldn't validate." End '<-- this is what you're looking for. End Sub 

输出:

无法validation。

选项二:

让class级卸载表格。 这提供了一个“更干净”的退出,并允许您运行窗体需要closures的任何代码。 但请注意,执行的顺序可能不是你期望的,因为堆栈展开了。

forms如下:

 Option Explicit Private Sub CommandButton1_Click() Dim example As Class1 Set example = New Class1 Debug.Print "This will execute." End Sub Private Sub UserForm_Terminate() Debug.Print "This will also execute, but not when you expect." End Sub 

在课堂里:

 Option Explicit Private Sub Class_Initialize() Debug.Print "Couldn't validate." Unload UserForm1 End Sub 

输出:

无法validation。
这也将执行,但不是当你期望。
这将执行。

我不是100%确定你想要什么,但是如果我正确地理解了你,那么这是不可能的,因为VBA如何使用基于引用的垃圾回收。 可以有任何数量的variables引用一个类的实例。 当所有引用它们的variables都被设置为空或者超出范围时,类实例被销毁。 如果一个类的实例设置自己等于没有,那么指向它的所有东西都将成为悬挂指针。 为了保持同步的引用计数,VBA需要做一些事情,比如定位引用这个对象的所有东西,并把它们设置为空,比它更值钱。 创build引用的调用者应该是销毁引用的调用者 – 其他任何事情都会对内存pipe理造成严重破坏。

另一方面,@rdhs可能是正确的,你只是在寻找Unload Me语句。 这会破坏创build类实例的用户窗体,因此会破坏类实例本身。 如果Unload语句在类的代码中,您可以尝试类似Unload Userform1 (或任何用户Unload Userform1的名称)。