2010-02-03 6 views
1

나는 Property Is 및 Let를 통해 VBA에서 모듈 수준의 배열을 처리하는 방법에 대해 꽤 잘 알고 있다고 생각합니다. 속성을 통해 모듈 차원 배열을 ReDim하는 방법이 있습니까?속성을 사용하여 모듈 수준 배열을 ReDim 할 수 있습니까?

마지막 절차 (DoTest)의 ReDim 문에서 다음 코드 오류가 발생합니다.

Private mstrTestArray() As String 

Private Sub Class_Initialize() 
    ReDim mstrTestArray(0) As String 
End Sub 

Private Property Get TestArray() As String() 
    TestArray = mstrTestArray 
End Property 

Private Property Let TestArray(ByRef strTestArray() As String) 
    mstrTestArray = strTestArray 
End Property 

Private Property Get TestArrayValue(d1 As Long) As String 
    TestArrayValue = mstrTestArray(d1) 
End Property 

Private Property Let TestArrayValue(d1 As Long, strValue As String) 
    mstrTestArray(d1) = strValue 
End Property 

Sub DoTest() 
    Dim intCharCode As Integer 
    For intCharCode = 97 To 122 
     If Not Len(TestArrayValue(UBound(TestArray))) > 0 Then 
      TestArrayValue(UBound(TestArray)) = Chr(intCharCode) 
     Else 
      ReDim Preserve TestArray(UBound(TestArray) + 1) As String 
      TestArrayValue(UBound(TestArray)) = Chr(intCharCode) 
     End If 
    Next intCharCode 
    Debug.Print TestArrayValue(LBound(TestArray)) _ 
    & " through " _ 
    & TestArrayValue(UBound(TestArray)) 
End Sub 

고마워요!

답변

2

이것은 좋은 질문입니다. 귀하의 질문에 직접적으로 대답하겠습니다.하지만 VBA의 객체 지향 프로그래밍에 대한 간단한 배경 지식부터 시작합시다. 대부분의 객체 지향 언어에서는 특성 자주 방법 같은 필드 같은하지만 행위을 찾을 것입니다. 이것은 무엇을 의미 하는가?

당신이 클래스의 인스턴스 및 속성에 값을 설정, 그것은 다음과 같습니다 : 위의 코드에서

Sub TestMyClass() 
    Dim mc As MyClass 
    Set mc = new MyClass 
    mc.MyProperty = 1 
End Sub 

MyProperty이 필드처럼 보이는, 맞죠? 그러나 이제이 클래스에 정의되어 방법을 살펴 보자 : pMyProperty는 정수 필드있을 때, 위의 코드에서 볼 수 있듯이

Private pMyProperty As Integer 

Public Property Get MyProperty() As Integer 
    MyProperty = pMyProperty 
End Property 

Public Property Let MyProperty(lMyProperty As Integer) 
    pMyProperty = lMyProperty 
End Property 

MyProperty에 대한 공개 GetSet 방법이 실제로 방법처럼 더 본다. 속성은 필드 주위를 "둘러싸 며"특히 기본 필드에 대한 액세스를 설정하는 데 유용합니다.

예를 들어 ReDim에 배열에 대한 참조를 반환하려고했습니다. 나는 100 % 확신 할 수는 없지만, 참조 배열에 ReDim을 사용할 수 있다고 생각하지 않습니다.

코드를 변경하여 실제 개인 필드 mstrTestArray을 수정하면 정상적으로 작동하는 것으로 보입니다. 그게 당신이 시도 할 수있는 것입니까?

Sub DoTest() 
    Dim intCharCode As Integer 
    For intCharCode = 97 To 122 
     If Not Len(TestArrayValue(UBound(TestArray))) > 0 Then 
      TestArrayValue(UBound(TestArray)) = Chr(intCharCode) 
     Else 
      ReDim Preserve mstrTestArray(UBound(mstrTestArray) + 1) As String 
      TestArrayValue(UBound(TestArray)) = Chr(intCharCode) 
     End If 
    Next intCharCode 
    Debug.Print TestArrayValue(LBound(TestArray)) _ 
    & " through " _ 
    & TestArrayValue(UBound(TestArray)) 
End Sub 
+0

벤,이 정보는 매우 유용합니다. ReDim mstrTestArray'를하지 않았습니다. 실제 모듈 수준의 변수 대신에 속성을 사용하는 것이 "최상의 방법"이라고 생각했기 때문입니다. 하지만 당신이 옳다고 생각합니다. 참조로 반환 된 배열의 ReDim으로가는 길은 없습니다. DoTest에서 로컬 배열 변수를 사용하고 DoArray의 끝에 TestArray = strTestArray를 설정하는 것이 대안이 될 것이라고 생각합니다. 감사! – Kuyenda

+0

저는 VBA 전문가는 아니지만 class * 내에서 * private 변수 mstrTestArray를 사용하여 값을 변경하는 데는 아무런 문제가 없습니다. 나는 누군가가 당신의 객체를 소비하고'mstrTestArray'가 "클래스 내부에서"돌연변이를 일으키면 혼란 스러울 수도 있다고 생각합니다. VBA에서 많은 작업을 수행하려는 경우 ** VBA 개발자 안내서 받기 **를 고려하십시오. http://www.amazon.com/VBA-Developers-Handbook-Ken-Getz/dp/0782119514 –

+0

그 책이 실제로이 물건들을 다루고 있습니까? 나는 이것처럼 철저한 책을 찾을 수 없었습니다 : http://www.cpearson.com/excel/mainpage.aspx. Ben에게 다시 감사합니다! – Kuyenda

관련 문제