2014-09-03 2 views
5

나는 다음과 같은 두 가지 방법이 있습니다전달 변형 배열은 생산 "형식 불일치"오류

Sub Start() 
    Dim x As Dictionary 
    Set x = New Dictionary 
    Call x.Add("first", 1) 
    MsgBox TypeName(x.Items) 'Displays "Variant()" 
    Call Test(x.Items) 
End Sub 

Sub Test(withArray() As Variant) 

End Sub 

내 프로젝트는 위에서 사용 된 Dictionary 클래스를 제공하기 위해 "마이크로 소프트 런타임 스크립팅"을 참조한다.

유형 불일치 : x.ItemsMsgBox TypeName(x.Items)에 의해 입증으로 Variant()이 (내가 Call Test(x.Items)에 다음과 같은 컴파일 오류가있어 반환하는 사실에도 불구하고 배열 또는 사용자 정의 형식

예상 무엇이 잘못 ?

참고 :

Sub Test(withArray) 
    MsgBox TypeName(withArray) 
End Sub 
: 나는에 Test 방법을 변경하는 경우

성공하고 Variant()을 표시합니다. 인수를 Variant() 유형으로 명시 적으로 선언 할 수없는 이유는 무엇입니까?

+1

니스 질문 좋은 [힌트] (http://stackoverflow.com/questions/1537819/byref-and-byval-in-vbscript) @mehow. 나는 루틴이 호출된다는 것을 한눈에 알 수 있기 때문에 항상 '호출'을 사용합니다. 또한 인수 목록은 괄호로 묶어야하기 때문에 (괄호없이 많은 인수가있는 루틴을 호출하고 쉼표는 내 눈을 너무 이상하게 만듭니다.) 이제는 괄호 뒤에있는 이유를 모두 알았습니다. 감사합니다! – feelthhis

+0

나는 위대한 질문과 훌륭한 대답에 동의합니다. 나는 2 일 만에이 현상금을 줄 것이다 –

+1

예, 어디에서 @ mehow : –

답변

8

Items은 선언되지 않은 유형의 컴파일러에 관한 한 런타임에서 전혀 아닐 수도 있습니다. 즉, 반드시 배열 일 필요는 없습니다. 물론 우리는 사전의 일부이기 때문에 배열이 될 것이지만 선언 된 유형이 없으므로 (Object Browser는 반환 유형이없는 함수임을 나타냄) 기본적으로 Variant로 지정됩니다. 컴파일러는 런타임에 배열이 될 것이라고 보장 할 수 없으므로 Test() proc에서 시도하는 선언을 허용하지 않습니다. 런타임에서 , 그것은 배열되고, 그래서 TypeName()은 VBA가 변형 배열에 할당을 허용하지 흥미롭게 Variant()

로 보여줍니다, 그래서 이것은 작동합니다

Sub Start() 
    Dim x As Dictionary 
    Dim y() As Variant 
    Set x = New Dictionary 
    Call x.Add("first", 1) 
    MsgBox TypeName(x.Items) 'Displays "Variant()" 
    y = x.Items ' this is fine 
    Call Test(y) 'this works 
End Sub 

Sub Test(withArray() As Variant) 

End Sub 
+0

완벽하니, 고마워요! –