2012-02-22 11 views
13

Nuovo a vba. Come passare l'oggetto dizionario ad un'altra funzione.Passa dizionario 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 

dà un errore di compilazione: tipo definito Utente non definito


Inoltre,

Set dict = CreateObject("Scripting.Dictionary") 

opere, ma

Dim dict As New Scripting.Dictionary 

dà, "tipo definito dall'utente non definito "

Io uso Excel 2010

risposta

12

Quando si utilizza CreateObject si sta vincolando l'oggetto in fase di esecuzione (ad esempio, associazione in ritardo). Quando si utilizza As Scripting.Dictionary, l'oggetto è vincolato in fase di compilazione (ovvero, associazione anticipata).

Se si desidera eseguire il binding anticipato, è necessario impostare un riferimento alla libreria corretta. Per fare questo, andare in Strumenti -> Riferimenti ... e selezionare "Microsoft Scripting Runtime"

+0

Dove si trova questo "Microsoft Scripting Runtime" in Excel 2016? – compski

5

Per evitare l'errore aggiungere il Microsoft Scripting Runtime (in Strumenti -> Riferimenti).
esempio semplificato:

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

è necessario aggiungere un riferimento alla libreria Microsoft Scripting Runtime per la macro per essere in grado di riconoscere i tipi. Goto Tools-> Riferimenti e verifica di Microsoft Scripting Runtime.

3

vorrei rivedere questa risposta a utilizzare l'associazione tardiva solo, e utilizzare un parametro di oggetto:

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

Benvenuti in Stackoverflow. Non è chiaro cosa porti questa nuova risposta. Tu dici che useresti solo Late Binding, ma non dire perché. – manuell

+1

Il codice è più riutilizzabile in nuove situazioni senza riferimenti indebiti che possono interferire con la portabilità. Alcune librerie non sono versioni identiche e non sempre si trovano su un altro sistema. L'associazione tardiva mantiene solo le opzioni aperte e meno problemi potenziali tra le versioni, se non si ha bisogno di intellisense. – mrbillbenson

+2

Se la libreria non si trova sull'altro sistema, l'associazione tardiva si interromperà comunque. La libreria 'Scripting' è piuttosto onnipresente e non ha cambiato la versione in un * lungo * tempo. Dichiarare come 'Object' costringerà le chiamate late-bound all'oggetto, che sarà più lento. Non otterrai Intellisense e non riceverai il controllo degli errori in fase di compilazione. A volte esistono usi validi per le librerie late-bound, ma 'Scripting.Runtime' non è sicuramente uno di questi. – ThunderFrame

0

Dopo si aggiunge il "Strumenti-> References-> Microsoft Scripting Runtime" provare questo

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