Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA中类的自终止_Vba_Excel - Fatal编程技术网

VBA中类的自终止

VBA中类的自终止,vba,excel,Vba,Excel,我正在用VBA for Excel编写一个类。我有一个userform,它打开并初始化该类,然后该类用于导航特定的文件布局。我已经实现了基本功能,但是如果有人在其他类型的文件上运行宏,我希望有一种简单的方式优雅地退出 当类初始化时,它会查找特定的单元格/值,并将这些范围设置为成员变量,因此,例如,如果在空白文件上运行宏,它会因类型不匹配错误而崩溃 我不想进行复杂的错误处理,也不想经常检查每个范围是否存在,因为此宏仅设计用于处理此特定布局,我希望如果它找不到所有这些范围,它会显示一个消息框,说明文

我正在用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