2012-02-22 16 views
13

Nuevo en vba. Cómo pasar el objeto del diccionario a otra función.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 

da un error de compilación: tipo definido usuario no definido


Además,

Set dict = CreateObject("Scripting.Dictionary") 

obras, sino

Dim dict As New Scripting.Dictionary 

da, de "tipo definido por el usuario no definido "

que utiliza Excel 2010

Respuesta

12

Cuando utiliza CreateObject, está vinculando el objeto en tiempo de ejecución (es decir, enlace tardío). Cuando usa As Scripting.Dictionary, el objeto está vinculado en tiempo de compilación (es decir, enlace anticipado).

Si desea realizar el enlace anticipado, deberá establecer una referencia a la biblioteca correcta. Para ello, vaya a Herramientas -> Referencias ... y seleccione "Microsoft Scripting Runtime"

+0

¿Dónde es esto "Microsoft Scripting Runtime" en Excel 2016? – compski

5

Para evitar el error de añadir el Microsoft Scripting Runtime (en Herramientas -> Referencias).
ejemplo simplificado:

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

es necesario agregar una referencia a la biblioteca Microsoft Scripting Runtime para su macro para ser capaz de reconocer los tipos. Ir a Herramientas-> Referencias y comprobar Microsoft Scripting Runtime.

3

que revisaría esta respuesta tardía a utilizar solamente la unión, y el uso de un parámetro de objeto:

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

Bienvenido a Stackoverflow. No está claro qué trae esa nueva respuesta. Usted dice que usaría la vinculación tardía solamente, pero no dice por qué. – manuell

+1

El código es más reutilizable en situaciones nuevas sin referencias indebidas que pueden interferir con la portabilidad. Algunas bibliotecas no son versiones idénticas y no siempre se encuentran en otro sistema. La vinculación tardía solo mantiene abiertas las opciones y menos problemas potenciales entre lanzamientos, si no necesita intellisense. – mrbillbenson

+2

Si la biblioteca no está en el otro sistema, la vinculación tardía se romperá de todos modos. La biblioteca 'Scripting' es bastante omnipresente, y no ha cambiado la versión en un * long * time. Declarar como 'Objeto' obligará a las llamadas con destino tardío al objeto, que será más lento. No obtendrá Intellisense y no obtendrá la verificación de errores en tiempo de compilación. A veces hay usos válidos para las bibliotecas con límite de tiempo, pero 'Scripting.Runtime' definitivamente no es uno de ellos. – ThunderFrame

0

Después que la adición de la "Herramientas-> Referencias-> Microsoft Scripting Runtime" probar este

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