2013-03-09 108 views
3

如何在不创建类型实例的副本的情况下使用局部变量引用用户定义的类型?作为一个例子,在下面的代码中,我最想要做的是在MySub3中创建一个局部变量,MT,并引用嵌套在另一个结构中的数据结构...但VBA不包含允许这个。它允许它用于对象,但不允许用户定义的类型(arrggg!)......并且没有明显的原因......它只是不允许它。VBA:使用变量作为用户定义类型的引用

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 

回答

0

从我的角度来看,你使它变得复杂。但我相信你有这个理由。 您提交的示例会生成您提到的错误。但是,当我改变一些线条时,没有错误。我不知道如果我的建议是你的预期(而这个问题不完全清楚,我),但是试试这个,而不是你MySub3结果:

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

MT = OMT.MyOtherType.MyTypeArray(GlobalIndex).VariableA 

VarA = MT 

End Sub 

一般来说,这样我能够读取任何元素im MySub3TopLevel传递。 如果它不是答案,请澄清更多。

+0

你已经重新创建了MySub1 – grahamj42 2013-03-09 19:43:27

+0

好的,我没有注意到它:)一般来说,如果你不引用对象,你不能使用'Set'。用'Type'定义的任何你自己的变量都不是对象。请澄清更多... – 2013-03-09 19:53:49

+0

grahamj42和Kaz Jaw,谢谢你回复我的问题。 – 2013-03-09 23:35:08

0

我想在这里你已经达到了VBA的一个限制。我知道无法绕过部分解除嵌套用户类型的限制。

我认为你最好使用包含私有数组的getter和setter函数的类(不幸的是,VBA没有运算符重载)。

+0

是的(叹气)我认为你是对的,令人沮丧。我最初着手使用一个类,但遇到了具有数组成员属性的问题。我花了一段时间解决了这些问题,并得出结论认为VBA不允许我按照我想要的方式来处理数组,但是如果我使用了一个结构就没有问题。 谢谢。 – 2013-03-10 12:44:59