我正在用VBA for Excel编写一个类。我有一个用户窗体打开并启动该类,然后该类用于导航特定的文件布局。我已经实现了基础知识,但是如果有人在另一种类型的文件上运行宏,我想要一种简单的退出方式。
当类初始化时,它会查找特定的单元格/值并将这些范围设置为成员变量,因此,例如,如果在空白文件上运行宏,则会因类型不匹配错误而崩溃。
我不想要复杂的错误处理或者不断检查每个范围是否存在,因为这个宏只设计用于这个特定的布局,我想如果它找不到所有这些范围它会显示一个消息框说文件布局看起来错误,并提供继续(并可能崩溃)或退出的选项。
我尝试过调用Class_Terminate子,Me.Terminate和Set Me = Nothing。在Google上搜索,这里没有提到我发现有用的任何内容。
答案 0 :(得分:1)
我不是100%确定你想要什么,但如果我理解正确,那么由于VBA如何使用基于参考的垃圾收集,它是不可能的。可以有任意数量的变量引用类的实例。当引用它们的所有变量都设置为空或超出范围时,类实例将被销毁。如果一个类的实例设置自己等于什么都没有,那么指向它的所有内容都会成为悬空指针。为了保持引用计数同步,VBA需要做一些事情,比如查找引用该对象的所有内容并将它们设置为空 - 比它的价值更麻烦。创建引用的调用者应该是破坏引用的调用者 - 其他任何东西都会破坏内存管理。
另一方面,@rdhs可能是正确的,你只是在寻找语句Unload Me
。这会破坏创建类实例的userform,因此会破坏类实例本身。如果Unload
语句在类的代码中,您可以尝试Unload Userform1
之类的内容(或者用户形式的名称)。
答案 1 :(得分:1)
使用 Select * From stock s Join sub_product sp On s.sub_productid = sp.sub_productid Join product p On p.productid = sp.productid
Where s.counte > 0 And s.date_insert in (Select MAX(date_insert) as d From stock ss
where s.sub_productid = ss.sub_productid group by sub_productid)
。这是一种突然的退出方式,正如您在运行示例代码时会注意到的那样。唯一的输出是来自End
的{{1}}。它实际上是在插入你的代码。
(在具有名为“CommandButton1”的命令按钮的UserForm中)
Debug.Print
在Class1中:
Class_Initialize()
输出:
无法验证。
让班级卸载表格。这提供了一个更“干净”的退出,并允许您运行表单需要关闭的任何代码。请注意,尽管执行顺序可能不是您所期望的,但堆栈会放松。
表格形式:
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
在课堂上:
Option Explicit
Private Sub Class_Initialize()
Debug.Print "Couldn't validate."
End '<-- this is what you're looking for.
End Sub
输出:
无法验证。
这也将执行,但不会在您预期时执行。
这将执行。