关于在VBA中使用类对象,我有一个更哲学的问题。我想更多地使用类对象,但有一些明显的局限性。如果社区能找到克服它们的方法,我会喜欢它。
当您在单个方法或多个方法中创建和使用类时,类很有效,这些方法都是代码序列的一部分。问题在于,如果您希望它们持续到下次触发代码。为了保持它们,你需要保持对象的引用。通常这将是一个全球参考(如果有更好的方法来做到这一点,我很想知道)。
重置项目并销毁所有对象(或至少任何公共变量引用)时会出现问题。有几种方法可以重置VBA项目。我们可以忽略涉及用户明确重置它的那些。这会留下未处理的代码错误。可以在您自己的代码中将顶级错误处理程序作为catch all并防止错误显示给用户。但是,无法处理其他人员代码中的错误。这仍然会导致完整的代码重置,从而破坏您的类对象。
有关如何克服这些问题的任何建议?
答案 0 :(得分:0)
对象的所有“状态”信息都保存在Object Properties
中。只要您谈论自己的课程,我就假设您谈论您创建的数量有限的Object Properties
。如果是这样,您可以尝试捕获每个属性更改并将其写入某处 - log sheet
或任何类型的外部文件,如txt或dat。当然,如果您经常更改Object Properties
值,那么您的代码将耗费大量时间。但是,如果发生了任何您无法预测的事情,您将能够从日志中读取Object Properties
的最后一个值。
此外,您可以尝试在Windows系统注册表中保留Object Properties
值,但我不知道它会对您的程序效率产生多大影响。
答案 1 :(得分:0)
我对这个有点羞怯。由于经过更多测试后,似乎VBA编辑器只重置Active Project,所有其他项目保持不变!因此,通过良好的错误处理可以避免大多数问题。用户仍然可以手动重置您的程序,但如果他们愿意这样做,他们可能是一个精明的用户,如果他们采取这种行动,应该会发生错误。
我有一些代码用于测试它以供参考:
Private ABoolValue As Boolean
Private AClass As Class1 ' Note this is just an empty class I added.
Public Sub Init()
ABoolValue = True
Set AClass = New Class1
End Sub
Public Sub TestValuesOfGlobals()
' Reset VBA.
End
' Check that our variables are not initialised.
Debug.Assert ABoolValue = False
Debug.Assert AClass Is Nothing
' Reinitialise the variables.
Init
' Check they are initialised.
Debug.Assert ABoolValue = True
Debug.Assert Not AClass Is Nothing
End Sub
Public Sub PrintValues()
Debug.Print "The boolean variable is: " & CStr(ABoolValue)
If AClass Is Nothing Then
Debug.Print "The Class is Nothing"
Else
Debug.Print "The Class is NOT Nothing"
End If
End Sub
只需粘贴到Excel工作簿的ThisWorkbook类中,然后创建一个名为Class1的虚拟类模块。运行Init方法以实例化变量,然后导航到新的VBA项目并尝试重置VBA编辑器。您可以使用PrintValues方法确定全局变量的值。
我也将此帖子发布到我们的博客:http://www.gravitycomputing.co.nz/resetting-vba-affects-active-project/