2013-03-09 3 views
3

형식 인스턴스의 복사본을 만들지 않고 로컬 변수를 사용하여 사용자 정의 형식을 참조하려면 어떻게해야합니까?VBA : 사용자 정의 형식에 대한 참조로 변수 사용

예를 들어, 다음 코드에서 MySub3은 로컬 변수 인 MT을 만들고 다른 구조체 안에 중첩 된 데이터 구조를 참조합니다. 그러나 VBA는 그렇지 않습니다. 이것을 허용하십시오. 그것은 객체를 허용하지만 사용자 정의 된 유형은 아닙니다 (arrggg!) ... 명백한 이유없이 ... 단지 허용하지 않습니다.

MySub1은 중첩 된 구조체를 긴 clunky 방식으로 참조하는 방법을 보여줍니다. MySub2는 중첩 된 구조체를 전달하여이 작업을 수행하는 방법을 보여 주지만 호출하는 루틴을 복잡하게 만들고 중첩 된 구조체가 여러 개 있으면 추악 해집니다.

MySub2는 VBA 이 원하는대로 처리 할 수 ​​있음을 보여 주며,이를 수행하는 방법을 제공하지 않는 것 같습니다. 나는 방금 비틀 거리지 않은 방법이 있기를 바라고 있습니다.

실제 코드는 여러 개의 독립 구조체가 구조체 요소로 많은 배열에 인덱스를 제공하는이 예제보다 훨씬 복잡합니다. 이러한 로컬 참조 변수를 사용하면 코드가 훨씬 읽기 쉽고 관리하기 쉬워집니다.

또한 "with"문을 알고 있고 도움이되지만 한 번에 하나의 구조체에서만 사용할 수 있습니다.

또한 실제 개체 클래스를 사용할 수 있다는 것을 알고 있습니다. 내 코드는 객체를 사용하여 시작했지만 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 

답변

0

내 견해로는 복잡해졌습니다. 하지만 그 이유가 있다고 생각합니다. 제출 한 예에서 언급 한 오류가 생성됩니다. 그러나 일부 줄을 바꿀 때 오류가 없습니다. 일반적으로

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

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

VarA = MT 

End Sub 

, 내가 어떤을 읽을 수있어이 방법을 : 내 제안을 당신이 (질문은 나에게 완전히 명확하지 않다 동안) 대신 당신의 MySub3의이 시도 예상 결과가 아닌 경우 확신 요소 im MySub3TopLevel에서 전달되었습니다. 대답이 아닌 경우 자세히 알아보십시오.

+0

당신은 MySub1을 다시 만들었습니다. – grahamj42

+0

괜찮습니다. 나는 그것을 알아 채지 못했습니다. :) 일반적으로 객체를 참조하지 않으면'Set'을 사용할 수 없습니다. 'Type'으로 정의 된 자신의 변수는 모두 object가 아닙니다. 조금 더 명확히하십시오 ... –

+0

grahamj42 및 Kaz Jaw, 제 질문에 응답 해 주셔서 감사합니다. –

0

여기 VBA의 한계 중 하나에 부딪혔다 고 생각합니다. 중첩 된 사용자 유형의 부분 역 참조에 대한 제한을 둘러 볼 방법이 없습니다.

나는 getter와 setter 함수가있는 개인 배열을 포함하는 클래스를 사용하는 것이 가장 좋을 것이라고 생각한다. (슬프게도 VBA에는 연산자 오버로딩이 없다.)

+0

예 (한숨) 나는 당신이 옳다 고 생각합니다. 원래 클래스를 사용하여 설정했지만 배열 인 멤버 속성이있는 문제가 발생했습니다. 나는이 문제에 잠시 동안 씨름을했고, VBA가 내가 배열로 원하는 것을 할 수는 없다고 결론을 내렸지 만, 구조를 사용하면 문제가 없었습니다. 감사합니다. . –

관련 문제