4

型インスタンスのコピーを作成せずに、ローカル変数を使用してユーザー定義型を参照するにはどうすればよいですか?

例として、以下のコードで私が理想的にやりたいことは、ローカル変数MTを作成し、別の構造体内にネストされたデータ構造を参照する MySub3 にありますが、VBA はこれを許可しません。オブジェクトに対しては許可されますが、ユーザー定義型 (arrggg!) に対しては許可されません...そして明らかな理由もなく...単に許可しません。

MySub1 は、ネストされた構造体を長く不格好な方法で参照する方法を示しています。MySub2 は、ネストされた構造体を渡すことによってこれを行う方法を示していますが、これは呼び出しルーチンを混乱させ、そのようなネストされた構造体が複数あると見苦しくなります。

MySub2 は、VBAが私が望むことを実行できることを示していますが、それを実行する方法を提供していないようです。私はまだつまずいていない方法があることを願っています。

私の実際のコードは、この例よりもはるかに複雑であり、複数の独立した構造体が構造体要素として多くの配列にインデックスを提供していることに注意してください。これらのローカル参照変数を使用すると、コードがはるかに読みやすく、管理しやすくなります。

また、「with」ステートメントを認識していることに注意してください。これは役に立ちますが、一度に 1 つの構造体でしか使用できません。

また、実際のオブジェクト クラスを使用できることを認識していることにも注意してください。私のコードはオブジェクトを使用して開始しましたが、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
4

2 に答える 2

1

私の観点からすると、あなたはそれを複雑に変化させました。しかし、私はあなたがその理由を持っていると信じています。あなたが提出した例はあなたが言及したエラーを生成します。しかし、いくつかの行を変更してもエラーはありません。私の提案があなたが期待した結果であるかどうかはわかりませんが(質問は私には完全には明確ではありませんが)、あなたの代わりにこれを試してくださいMySub3

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

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

VarA = MT

End Sub

MySub3一般的に、この方法で、から渡された要素を読み取ることができますTopLevel。それが答えでない場合は、もっと明確にしてください。

于 2013-03-09T19:34:23.683 に答える
0

ここで、VBA の限界の 1 つにぶつかったと思います。ネストされたユーザー型の部分的な逆参照に関する制限を回避する方法がないことを私は知っています。

ゲッター関数とセッター関数を備えたプライベート配列を含むクラスを使用するのが最善だと思います(残念ながら、VBAには演算子のオーバーロードもありません)。

于 2013-03-09T19:42:45.117 に答える