【问题标题】:VBA: Use a variable as a reference to a user defined typeVBA:使用变量作为对用户定义类型的引用
【发布时间】:2013-02-25 00:41:35
【问题描述】:

如何在不创建类型实例副本的情况下使用局部变量引用用户定义的类型?

例如,在下面的代码中,我最想做的是在 MySub3 中创建一个局部变量 MT,并引用嵌套在另一个结构中的数据结构......但是VBA 不允许这样做。它允许它用于对象,但不允许用于用户定义的类型(arrggg!)......而且没有明显的原因......它只是不允许它。

MySub1 展示了如何以冗长笨拙的方式引用嵌套结构。 MySub2 展示了如何通过传入嵌套结构来做到这一点,但这会使调用例程变得混乱,并且拥有多个这样的嵌套结构会变得很丑。

MySub2 演示了 VBA 可以 做我想做的事,只是它似乎没有提供一种方法来做到这一点。我希望有一种我没有偶然发现的方法。

请注意,我的实际代码比这个例子复杂得多,多个独立的结构体为许多数组提供索引作为结构体元素。使用这些本地引用变量将使代码更具可读性和可管理性。

还请注意,我知道“with”语句,它确实有帮助,但一次只能用于一个结构。

还请注意,我知道我可以使用实际的对象类。我的代码开始使用对象,但我很快发现 VBA 对作为属性成员的数组设置了限制……这是用户定义类型没有的限制。

Type tMyType
    VariableA As Single
End Type

Type tMyOtherType
    MyTypeArray() As tMyType
End Type

Type tOneMoreType
    MyOtherType As tMyOtherType
End Type

Dim GlobalIndex As Integer

Sub TopLevel()
    Dim TopLevelType As tOneMoreType

    ReDim TopLevelType.MyOtherType.MyTypeArray(0 To 10)
    Call MySub1(TopLevelType)
    Call MySub2(TopLevelType.MyOtherType.MyTypeArray(GlobalIndex))
    Call MySub3(TopLevelType)
End Sub

Sub MySub1(OMT As tOneMoreType)
    Dim VarA As Single

    VarA = OMT.MyOtherType.MyTypeArray(GlobalIndex).VariableA
End Sub

Sub MySub2(MT As tMyType)
    Dim VarA As Single

    VarA = MT.VariableA
End Sub

Sub MySub3(OMT As tOneMoreType)
    Dim VarA As Single
    Dim MT

    Set MT = OMT.MyOtherType.MyTypeArray(GlobalIndex)
    VarA = MT.VariableA
End Sub

【问题讨论】:

    标签: excel user-defined-types vba


    【解决方案1】:

    从我的角度来看,你让它变得复杂了。但我相信你是有原因的。 您提交的示例生成您提到的错误。但是,当我更改一些行时,没有错误。我不确定我的建议是否是您所期望的结果(虽然问题对我来说并不完全清楚),但请尝试这个而不是您的 MySub3:

    Sub MySub3(OMT As tOneMoreType)
    Dim VarA As Single
    Dim MT
    
    MT = OMT.MyOtherType.MyTypeArray(GlobalIndex).VariableA
    
    VarA = MT
    
    End Sub
    

    通常,通过这种方式,我可以读取从 TopLevel 传递的任何元素 im MySub3。 如果不是答案,请进一步澄清。

    【讨论】:

    • 好的,我没注意 :) 一般情况下,如果不引用对象,则不能使用Set。使用Type 定义的任何您自己的变量都不是对象。请再澄清一点...
    • grahamj42 和 Kaz Jaw,感谢您回答我的问题。
    • Kaz Jaw,我只展示了在 MySub3 中使用 Set 来说明我的目标。我在使用包含数组的对象时遇到问题(不记得错误消息)。也许我会再试一次。我对引用数组有完全相同的问题。我想要一个“指向”数组的局部变量,因此不必每次都指定数组的整个嵌套结构。重新表述我的目标,我希望有一个局部变量作为快捷方式,因此引用类型元素不是这么长的字符串(一遍又一遍)。
    • 请重新考虑您的问题,因为您可能会混淆一些概念... 1. 您可以将数组传递给子过程; 2.您可以将自己的类型变量作为简短引用传递您所做的事情,例如Call MySub3(TopLevelType); 3. 你同时通过了 1 和 2; 4. 最后,如果你需要和反对一起工作,你需要用Class module 构造一个,而不是Type 结构。
    • 好吧,我没有混淆概念,VBA 根本不允许看似简单的关联。我意识到您在此处列出的所有内容,但没有一个可以帮助我。我不“需要”一个对象,我需要引用一个结构,就像 VBA 允许引用一个对象一样。相比之下,在 C 中,这只是通过指向用户定义类型的指针来完成,或者在数组的情况下,使用指向数组类型的指针。 VBA 允许对对象进行此操作,但出于某些深不可测的原因,用户定义的类型不允许这样做。两者以完全相同的方式访问其成员。
    【解决方案2】:

    我认为您已经达到了 VBA 的限制之一。我不知道嵌套用户类型的部分取消引用的限制。

    我认为您最好使用包含具有 getter 和 setter 函数的私有数组的类(遗憾的是,VBA 也没有运算符重载)。

    【讨论】:

    • 是的(叹气)我认为你是对的,令人沮丧。我最初开始使用一个类,但遇到了成员属性是数组的问题。我与这些问题斗争了一段时间,并得出结论认为 VBA 不允许我对数组做我想做的事情,但如果我使用结构就没有问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    相关资源
    最近更新 更多