VBA中类的自终止
我正在用VBA for Excel编写一个类。我有一个userform,它打开并初始化该类,然后该类用于导航特定的文件布局。我已经实现了基本功能,但是如果有人在其他类型的文件上运行宏,我希望有一种简单的方式优雅地退出 当类初始化时,它会查找特定的单元格/值,并将这些范围设置为成员变量,因此,例如,如果在空白文件上运行宏,它会因类型不匹配错误而崩溃 我不想进行复杂的错误处理,也不想经常检查每个范围是否存在,因为此宏仅设计用于处理此特定布局,我希望如果它找不到所有这些范围,它会显示一个消息框,说明文件布局看起来有错,并提供继续(可能崩溃)或退出的选项VBA中类的自终止,vba,excel,Vba,Excel,我正在用VBA for Excel编写一个类。我有一个userform,它打开并初始化该类,然后该类用于导航特定的文件布局。我已经实现了基本功能,但是如果有人在其他类型的文件上运行宏,我希望有一种简单的方式优雅地退出 当类初始化时,它会查找特定的单元格/值,并将这些范围设置为成员变量,因此,例如,如果在空白文件上运行宏,它会因类型不匹配错误而崩溃 我不想进行复杂的错误处理,也不想经常检查每个范围是否存在,因为此宏仅设计用于处理此特定布局,我希望如果它找不到所有这些范围,它会显示一个消息框,说明文
我试着调用类\ u Terminate sub,Me.Terminate并设置Me=Nothing。在Google上搜索,这里没有找到任何有用的东西。我不能100%确定您想要什么,但如果我理解正确,那么这是不可能的,因为VBA是如何使用基于引用的垃圾收集的。可以有任意数量的变量引用类的实例。当引用类实例的所有变量设置为零或超出范围时,类实例将被销毁。如果类的实例将自身设置为零,那么指向它的所有内容都将成为悬空指针。为了使引用计数保持同步,VBA需要做一些事情,比如找到引用对象的所有内容并将它们设置为零——这是一件非常麻烦的事情。创建引用的调用方应该是销毁引用的调用方——其他任何操作都会破坏内存管理 另一方面,@rdhs可能是正确的,您只是在寻找语句
Unload Me
。这将破坏创建类实例的用户表单,因此将破坏类实例本身。如果类的代码中有Unload
语句,您可以尝试类似Unload Userform1
(或用户表单的名称)。选项一:
使用End
。但是,正如您在运行示例代码时所注意到的,这是一种突然退出的方式。唯一的输出将是来自Class\u Initialize()
的Debug.Print
。它实际上是在拔掉你代码的插头
(在名为“CommandButton1”的命令按钮的用户窗体中)
在类别1中:
Option Explicit
Private Sub Class_Initialize()
Debug.Print "Couldn't validate."
End '<-- this is what you're looking for.
End Sub
在课堂上:
Option Explicit
Private Sub Class_Initialize()
Debug.Print "Couldn't validate."
Unload UserForm1
End Sub
输出:
无法验证这也会执行,但不会在您预期的时间执行
这将执行
你在找
卸载我吗
?谢谢,但是没有,我在尝试时遇到了“无法加载或卸载此对象”错误。我认为Unload Me终止了一个userform,但它在类上似乎不起作用。在这些情况下,如果初始化/设置由于某种原因失败,可以使用类中定义的Init()
方法返回False
。如果返回False,则退出调用它的子类,可能会显示相应的错误消息(或者该类可能负责显示该消息)。我怀疑从类实例卸载userform可能会有一点延迟(可能是因为userform在其一个事件处理程序运行时无法卸载)但很高兴看到一个例子。你的选项一可能是OP想要的,但看起来并不优雅。也许蒂姆·威廉在评论中的建议是最好的方式。谢谢共产国际,“结束”是我想要的,尽管正如你和其他人指出的,它可能并不十分优雅。从类中卸载userform也很有趣,尽管如果我把它放在“class_Initialize”函数中,该函数的其余部分似乎会被执行,因此如果布局不正确,它仍然会导致它崩溃。我认为最好的解决方案可能是在初始化类之前返回并在userform中执行一些检查。感谢所有回复的人。
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