16

配列が参照によって返される場合、次のように動作しないのはなぜですか。

'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
4

3 に答える 3

34

let プロパティがありません。また、get プロパティは、問題の要素だけでなく、配列全体を返します。Property Get の戻り値の型を Double() から単純な Double に変更します。プロパティ Let を追加します。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  
于 2013-05-31T19:19:44.277 に答える
14

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

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

  • 配列の代わりにVBA.Collectionを使用します。
  • 配列をカプセル化し、内部配列に間接的にアクセスして操作するためのプロシージャを公開する独自のクラスを作成します。
于 2011-04-10T18:23:24.557 に答える