2012-02-22 13 views
13

Nowość w vba. Jak przekazać obiekt słownika do innej funkcji.Pass vba Dictionary

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 

daje błąd kompilacji: zdefiniowane przez użytkownika typ niezdefiniowane


Również

Set dict = CreateObject("Scripting.Dictionary") 

prace, ale

Dim dict As New Scripting.Dictionary 

daje, „typ użytkownika zdefiniowane nie określono "

używam Excel 2010

Odpowiedz

12

Podczas używania obiektu CreateObject wiążemy obiekt w czasie wykonywania (tj. Późne wiązanie). Podczas korzystania z obiektu As Scripting.Dictionary obiekt jest wiązany podczas kompilacji (tj. Wczesne wiązanie).

Jeśli chcesz wcześnie wiązać, musisz ustawić odniesienie do właściwej biblioteki. Aby to zrobić, przejdź do Narzędzia -> Referencje ... i wybierz "Microsoft Scripting Runtime"

+0

Gdzie jest to "Microsoft Scripting Runtime" w programie Excel 2016? – compski

5

Aby uniknąć błędu dodać Microsoft Scripting Runtime (w Narzędzia -> referencje).
uproszczony przykład:

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

Trzeba dodać odwołanie do biblioteki Microsoft Scripting Runtime dla makra, aby móc rozpoznawać typy. Goto Narzędzia-> Odnośniki i sprawdź Microsoft Runtime Runtime.

3

Chciałbym zrewidować tę odpowiedź użyć późnego wiązania tylko i używać parametru obiektu:

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

Witamy w Stackoverflow. Nie jest jasne, co przynosi ta nowa odpowiedź. Mówisz, że używałbyś tylko Late Binding, ale nie mów dlaczego. – manuell

+1

Kod jest bardziej nadający się do ponownego użycia w nowych sytuacjach bez zbędnych odniesień, które mogą zakłócać przenośność. Niektóre biblioteki nie są identycznymi wersjami i nie zawsze można je znaleźć w innym systemie, późniejsze powiązanie powoduje, że opcje pozostają otwarte i mniej potencjalnych problemów między wydaniami, jeśli nie potrzebujesz intellisense. – mrbillbenson

+2

Jeśli biblioteka nie znajduje się w innym systemie, późniejsze wiązanie i tak się zepsuje. Biblioteka 'Scripting' jest dość wszechobecna i nie zmieniła wersji w * długim * czasie. Zgłaszanie jako 'Object' wymusza późniejsze wywołania obiektu, który będzie wolniejszy. Nie dostaniesz Intellisense i nie dostaniesz sprawdzania błędów podczas kompilacji. Czasami istnieją poprawne zastosowania bibliotek z opóźnionym wiązaniem, ale 'Scripting.Runtime' zdecydowanie nie jest jednym z nich. – ThunderFrame

0

Po Ci dodanie "Narzędzia-> References-> Microsoft Scripting Runtime" spróbować

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