程序执行之间是否可以存在对象实例?

时间:2013-10-23 04:46:32

标签: vba excel-vba excel

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

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

重置项目并销毁所有对象(或至少任何公共变量引用)时会出现问题。有几种方法可以重置VBA项目。我们可以忽略涉及用户明确重置它的那些。这会留下未处理的代码错误。可以在您自己的代码中将顶级错误处理程序作为catch all并防止错误显示给用户。但是,无法处理其他人员代码中的错误。这仍然会导致完整的代码重置,从而破坏您的类对象。

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

2 个答案:

答案 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/