通过方法初始化子类

时间:2013-05-28 15:54:53

标签: vba

我是一个有foo类的例程。类foo包含类栏,但不初始化它。在我的例程中,我将父方法的foo类栏作为对象传入。接收方法然后将foo的条形初始化为新条形。

出于某种原因,当我稍后引用foo时,bar未初始化。反正有没有在另一种方法中初始化foo的栏?

<Class Foo>
Option Explicit

Public mybar As Bar

<Class Bar>
Option Explicit

Public theText As String

<Main Module>
Public Sub Test()
  Dim myfoo As New foo
  Dim abar As Bar


  Derp myfoo.mybar


  myfoo.mybar.theText = "Test"
End Sub

Public Sub Derp(ByRef mybar As Bar)
  Set mybar = New Bar

End Sub

当代码遇到myfoo.mybar.thetext =“Test”时,我收到错误91,对象变量或With块变量未设置。

我通过供应商特定系统VBA版本6.5.1054使用VBA。

1 个答案:

答案 0 :(得分:1)

为了让您的代码工作,您需要进行很小的改进。您需要在bar class内完全初始化foo class。因此,而不是这一行:

Public mybar As Bar

将其改为这一个:

Public mybar As New Bar

但是,您的Main Module还需要改进一些内容。因此我这样做了它的工作原理:

Public Sub Test()
  Dim myfoo As New foo
  Dim abar As New Bar

  myfoo.mybar.theText = "Test"
End Sub

如果您需要保留Derp sub,那么您的abar variable必须公开。

评论后修改 现在我对你的需求有了更好的了解,因此我建议以这种方式解决它。

  1. 保持bar class不变
  2. Foo class需要其他方法,以便在需要时初始化boo class。完成Foo class代码:

    Option Explicit
    
    Public mybar As Bar
    
    Sub BarInit()
        Set mybar = New Bar
    End Sub
    
  3. 您的Main module应该看起来不像下面的代码(看看Sub中的评论):

    Public Sub Test()
    
    
        Dim myfoo As New Foo
    
        'this will not work at this stage, _
        kept to show the problem, Error 91, _
        please remove it after test
        myfoo.mybar.theText = "test"
    
        'initialize Bar class within Foo class _
        using Foo class method
        myfoo.BarInit
    
        'now will work as it's initialized
        myfoo.mybar.theText = "test"
        Debug.Print myfoo.mybar.theText
    End Sub
    
  4. 正如您所见,初始化仍然保持在foo class范围内,但只有在需要时才会调用BarInit method