2013-05-28 93 views
1

我是一个具有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通过供应商特定的系统,VBA版本6.5.1054。

回答

1

为了让你的代码工作,你需要做很小的改进。您需要在foo class内完全初始化bar 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子那么你abar variable必须是公开的。

在评论之后编辑 现在我对你的需求有了更好的理解,所以我会建议这样解决它。

  1. 保持不变bar class
  2. Foo class需要额外的方法,它允许在需要时进行初始化​​。完整Foo class代码:

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

    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 
    

正如你所看到的初始化仍然保持内foo class但只有在需要时才调用BarInit method

+0

我有意不在foo内初始化bar,因为在某些情况下,bar不存在,我测试它是否是无用的。 Foo实际上包含三个不同的小节,我希望能够推广一些可以在所有三个小节中调用的方法,方法是传递相应的小节。看起来这可能是不可能的。 – lfrandom

+0

这是可能的...在编辑后查看我的答案。 –