web-dev-qa-db-ja.com

VBA-プロパティGetから配列を返す

配列が参照によって返される場合、なぜ次のことが機能しないのですか?

'Class1 class module
Private v() As Double
Public Property Get Vec() As Double()
    Vec = v()
End Property
Private Sub Class_Initialize()
    ReDim v(0 To 3)
End Sub
' end class module

Sub Test1()
    Dim c As Class1
    Set c = New Class1
    Debug.Print c.Vec()(1) ' prints 0 as expected
    c.Vec()(1) = 5.6
    Debug.Print c.Vec()(1) ' still prints 0
End Sub
15
ThomasMcLeod

VBAでは、配列はByRefパラメータを介して返されない限り、参照によって返されることはありません。さらに、=を使用して配列を変数に割り当てるときはいつでも、プロシージャ内のByRef引数に配列を割り当てている場合でも、配列の新しいコピーを作成しているので、かなりきれいです。この仕事をしようとして運が悪かった。

いくつかの選択肢は...

  • 配列の代わりにVBA.Collectionを使用します。
  • 配列をカプセル化し、内部配列に間接的にアクセスして操作するためのプロシージャを公開する独自のクラスを作成します。
12
Steve Jorgensen

Letプロパティがありません。また、getプロパティは、問題の要素だけでなく、配列全体を返します。 Property Getの戻り値の型をDouble()から単なるDoubleに変更します。プロパティレットを追加します。 2つの入力を取りますが、1つだけが渡されることに注意してください。最後の変数(この場合はMyValue)は、=記号の後の値から値を取得すると想定されます。 Test1()の早い段階でブレークポイントを設定し、[ローカル]ウィンドウで値がどのように影響を受けるかを確認します。元のコードと私のコードによって作成された変数を比較します。

'Class1 class module
Private v() As Double
Public Property Get Vec(index As Long) As Double
    Vec = v(index)
End Property
Public Property Let Vec(index As Long, MyValue As Double)
    v(index) = MyValue
End Property
Private Sub Class_Initialize()
    ReDim v(0 To 3)
End Sub
' end class module

'Begin module
Sub Test1()
    Dim c As Class1
    Set c = New Class1
    Debug.Print c.Vec(1) ' prints 0 as expected
    c.Vec(1) = 5.6
    Debug.Print c.Vec(1) ' prints 5.6
End Sub
'End module  
28
Clayton S

Vec(index As Long、MyValue As Double)

ここでindexキーワードは何をしますか?この配列関連のインデックスについて学ぶことができるWebページに私を向けてください。

0
coderH