Vba 通过方法初始化子类

Vba 通过方法初始化子类,vba,Vba,我有一个例程,它有一个foo类。类foo包含类bar,但不初始化它。在我的例程中,我将父方法的foo类栏作为对象传入。然后,接收方法将foo的bar初始化为新的bar 由于某些原因,当我稍后引用foo时,bar并没有初始化。在另一个方法中是否有初始化foo的bar的方法 <Class Foo> Option Explicit Public mybar As Bar <Class Bar> Option Explicit Public theText As Strin

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

由于某些原因,当我稍后引用foo时,bar并没有初始化。在另一个方法中是否有初始化foo的bar的方法

<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

选项显式
公共mybar作为酒吧
选项显式
将文本作为字符串公开
公共子测试()
Dim myfoo作为新foo
暗阿巴尔酒吧
Derp myfoo.mybar
myfoo.mybar.theText=“测试”
端接头
公共子Derp(ByRef mybar作为Bar)
设置mybar=新条形图
端接头
当代码遇到myfoo.mybar.thetext=“Test”时,我收到一个错误91,对象变量或未设置块变量


我通过一个特定于供应商的系统使用VBA,VBA版本6.5.1054。

要使代码正常工作,您需要做一些非常小的改进。您需要在
foo类
中完全初始化
bar类
。因此,不是这一行:

Public mybar As Bar
把它换成这个:

Public mybar As New Bar
但是,在
主模块中还有一些需要改进的地方。因此,我这样做了,它起作用了:

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

  myfoo.mybar.theText = "Test"
End Sub
如果需要保留
Derp
sub,则
abar变量必须为public

评论后编辑 现在我对你们的需求有了更好的理解,所以我建议用这种方式来解决

  • 保持
    条形分类
    不变
  • Foo类
    需要额外的方法,允许在需要时初始化
    boo类
    。完成
    Foo类
    代码:

    Option Explicit
    
    Public mybar As Bar
    
    Sub BarInit()
        Set mybar = New Bar
    End Sub
    
  • 您的
    主模块
    应该与下面的代码类似(查看子模块中的注释):


  • 正如您所看到的,初始化仍然保留在
    foo类中,但只有在调用
    BarInit方法时才被调用
    要使代码正常工作,您需要做相当小的改进。您需要在
    foo类
    中完全初始化
    bar类
    。因此,不是这一行:

    Public mybar As Bar
    
    把它换成这个:

    Public mybar As New Bar
    
    但是,在
    主模块中还有一些需要改进的地方。因此,我这样做了,它起作用了:

    Public Sub Test()
      Dim myfoo As New foo
      Dim abar As New Bar
    
      myfoo.mybar.theText = "Test"
    End Sub
    
    如果需要保留
    Derp
    sub,则
    abar变量必须为public

    评论后编辑 现在我对你们的需求有了更好的理解,所以我建议用这种方式来解决

  • 保持
    条形分类
    不变
  • Foo类
    需要额外的方法,允许在需要时初始化
    boo类
    。完成
    Foo类
    代码:

    Option Explicit
    
    Public mybar As Bar
    
    Sub BarInit()
        Set mybar = New Bar
    End Sub
    
  • 您的
    主模块
    应该与下面的代码类似(查看子模块中的注释):


  • 正如您所看到的,初始化仍保留在
    foo类中,但仅在调用
    BarInit方法时调用

    我有意不在foo中初始化bar,因为在某些情况下,bar不存在,我测试它是否为空。Foo实际上包含三个不同的条,我希望我可以通过传递适当的条来概括一些可以在所有三个条上调用的方法。看起来这可能是不可能的。我故意不在foo中初始化bar,因为在某些情况下,bar不存在,我测试它是否为空。Foo实际上包含三个不同的条,我希望我可以通过传递适当的条来概括一些可以在所有三个条上调用的方法。看起来这可能是不可能的。