1

关于在 VBA 中使用类对象,我有一个更哲学的问题。我想更多地使用类对象,但有一些明显的限制。如果社区能够找到克服它们的方法,我会很高兴。

当您在单个方法或多个方法中创建和使用它们时,这些类都可以很好地工作,这些方法都是代码序列的一部分。问题在于,如果您希望它们持续到下一次触发您的代码。要保留它们,您需要持有对该对象的引用。通常这将是一个全球参考(如果有更好的方法可以做到这一点,我很想知道)。

当项目被重置并且所有对象都被销毁(或至少任何公共变量引用)时,就会出现问题。有几种方法可以重置 VBA 项目。我们可以忽略涉及用户显式重置它的那些。这会留下未处理的代码错误。可以在您自己的代码中使用顶级错误处理程序作为包罗万象的方法,并防止向用户显示错误。但是,没有办法处理其他人代码中的错误。这仍然会导致完整的代码重置破坏您的类对象。

关于如何克服这些问题的任何建议?

4

2 回答 2

0

我对这个有点害羞。由于经过更多测试,VBA 编辑器似乎只重置了活动项目,所有其他项目保持不变!因此,似乎大多数问题都可以通过良好的错误处理来避免。用户仍然可以手动重置您的程序,但如果他们愿意这样做,他们可能是一个精明的用户,并且应该预料到如果他们执行此操作会发生错误。

我有一些用于测试的代码以供参考:

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/

于 2013-12-08T22:43:49.507 回答
0

对象的所有“状态”信息都保存在Object Properties. 只要您在谈论自己的班级,我就假设您谈论的是您创建的有限数量。Object Properties如果是这样,您可以尝试捕获每个属性更改并将其写入某个log sheet位置或任何类型的外部文件,如 txt 或 dat。当然,这对您的代码来说会很耗时,尤其是在您经常更改Object Properties值的情况下。但是,如果发生了您无法预料的事情,您将能够Object Properties从日志中读取最后一个值。

此外,您可以尝试Object Properties在 Windows 系统注册表中保留值,但我不知道它会对您的程序效率产生多大影响。

于 2013-10-23T07:00:57.627 回答