2012-02-22 3 views
13

vba의 새로운 기능. 사전 개체를 다른 함수로 전달하는 방법. vba 사전 전달

Sub aaa(dict As Object) 
Set dict = CreateObject("Scripting.Dictionary") 
... 
process dict 
End Sub 

Sub process(dict As Scripting.Dictionary) 
    MsgBox dict.Count 
End Sub 

컴파일 오류를 제공합니다 : 사용자 정의 유형,

또한

정의

Set dict = CreateObject("Scripting.Dictionary") 

작동하지만

Dim dict As New Scripting.Dictionary 

은, "사용자 정의 유형을 제공하지 정의되지 않음 "0 나는 오류가 (-> 참조 도구의)은 Microsoft 스크립팅 런타임을 추가 피하기 위해

답변

12

CreateObject을 사용하면 런타임에 오브젝트를 바인딩합니다 (예 : 후기 바인딩). As Scripting.Dictionary을 사용할 때 객체는 컴파일 타임에 바인딩됩니다 (즉, 초기 바인딩).

초기 바인딩을 수행하려면 올바른 라이브러리에 대한 참조를 설정해야합니다. 도구로 이동이 작업을 수행하려면 - "마이크로 소프트 스크립팅 런타임을"> 참조 ... 선택하는 것은

+0

경우 2016 Excel에서이 "마이크로 소프트 런타임 스크립팅"는 무엇입니까? – compski

5

엑셀 2010을 사용합니다.
간단한 예 : 유형을 인식 할 수

Sub test_dict() 
    Dim dict As New Scripting.Dictionary 
    Call process(dict) 
End Sub 

Sub process_dict(dict As Scripting.Dictionary) 
    MsgBox dict.Count 
End Sub 
3

당신은 매크로에 대한 Microsoft 스크립팅 런타임 라이브러리에 대한 참조를 추가해야합니다. 도구 -> 참조로 이동하여 Microsoft Scripting Runtime을 확인하십시오.

3

나는 후기 바인딩 만 사용이 답변을 수정하고, 개체 매개 변수를 사용합니다 :

Sub aaa(dict As Object) 
Set dict = CreateObject("Scripting.Dictionary") 
... 
process dict 
End Sub 

Sub process(dict As Object) 
    MsgBox dict.Count 
End Sub 
+1

Stackoverflow에 오신 것을 환영합니다. 새로운 대답이 가져 오는 것이 명확하지 않습니다. Late Binding 만 사용 하겠지만 이유는 말하지 마십시오. – manuell

+1

새로운 상황에서 코드가 과도한 참조없이 더 재사용되어 이식성을 방해 할 수 있습니다. 일부 라이브러리는 동일한 버전이 아니며 항상 다른 시스템에서 발견되는 것은 아닙니다. 후기 바인딩은 인텔리 센스가 필요하지 않은 경우 옵션을 열어두고 릴리스 간의 잠재적 인 문제를 줄입니다. – mrbillbenson

+2

라이브러리가 다른 시스템에없는 경우 후기 바인딩은 어쨌든 중단됩니다. 'Scripting' 라이브러리는 꽤 유비쿼터스이며, * long * 시간에 버전을 변경하지 않았습니다. 'Object'로 선언하면 객체에 대한 늦은 바인딩 호출이 강제 실행됩니다. 느리게 수행됩니다. Intellisense를 얻지 못할 것이며 컴파일 타임 오류 검사를받지 못할 것입니다. 후기 바인딩 라이브러리의 경우 때때로 유효한 사용법이 있지만,'Scripting.Runtime'은 가장 확실한 것은 아닙니다. – ThunderFrame

0

후를 당신은 시도 "도구 -> References-> 마이크로 소프트 런타임 스크립팅"을 추가이

Private Sub CommandButton1_Click() 

    Dim myLocalDictionary As New Dictionary 
    myLocalDictionary.Add "a", "aaa" 
    myLocalDictionary.Add "b", "bbb" 
    myLocalDictionary.Add "c", "ccc" 

    Call testPassDictionary(myLocalDictionary) 

End Sub 

Sub testPassDictionary(myDictionary As Dictionary) 
    MsgBox myDictionary.Count 
End Sub