2011-04-10 3 views
12

배열 참조로 반환하는 경우가 아닌 다음 작업 않는 이유 : VBA에서VBA - 속성에서 반환 배열을 가져

'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 

답변

10

, 배열은 참조로 반환되지 않습니다 그들이 ByRef 매개 변수를 통해 반환하지 않는. 또한 =을 사용하여 배열에 변수를 할당 할 때마다 프로 시저 내부의 ByRef 인수에 할당하더라도 어레이의 새 복사본을 만들었으므로 거의 운이 좋지 않습니다. 이 일을하려고 노력합니다.

어떤 대안이 ...

  • 사용하십시오 VBA.Collection 대신 배열.
  • 배열을 캡슐화하는 고유 한 클래스를 만들고 내부 배열에 간접적으로 액세스하고 조작하는 절차를 제공합니다.
+0

나는이 부분에 집중한다고 생각합니다. 그것은 내가 본 것을 일치시킵니다. 그러나 나는이 것들이 더 잘 문서화 되었으면 좋겠다. 이런 자료가 철자가 맞지 않는 좋은 출처가 있습니까? – jtolle

+0

Excel 컨설턴트이자 MVP 인 Chip Person은 자신의 사이트에서 "배열은 항상 참조로 전달됩니다"라고 말하면서 http://www.cpearson.com/excel/byrefbyval.aspx 실수라고 생각합니까? – ThomasMcLeod

+0

그의 사이트는 확실히 좋습니다. 나는 더 많은 "공식적인"소스를 의미했었다. 예를 들어 도움, VB 용 오래된 MS 매뉴얼 등. "할당 배열 ="복사 배열 "과 같은 기본 정보는 MVP가 제공 할 수 있도록 남겨둔다. 실험을 통해 발견하십시오. – jtolle

23

let 속성이 없습니다. 또한 get 속성은 문제의 요소가 아니라 전체 배열을 반환합니다. 속성의 반환 형식을 Double()에서 일반 Double로 가져옵니다. 속성 추가. 두 개의 입력이 필요하지만 하나만 전달됩니다. 마지막 변수 (이 경우에는 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 
+2

이것은 받아 들인 대답보다 훨씬 더 유용한 대답입니다. 감사 :) –

관련 문제