También puede usar los valores ByRef o ByVal en la función. ByVal, el objeto que envía a una función o sub se copia en la memoria privada para ser utilizado dentro de la función y se descarta después de que se completa la función. Por referencia, se hace referencia al objeto que enviaste a una función y todas las manipulaciones que realizas, quitando claves, configurando el objeto, etc., se hace directamente al objeto que enviaste.
E.g.
Sub test
DIM testDict as variant
call setdict(testDict)
testDict.Add "test", "value"
call addValue(testDict, "test2","another value")
msgbox testDict.Count
Set testDict = Nothing
End Sub
Sub setdict(ByRef in_Dict as Variant)
If Typename(in_Dict) <> "Dictionary" Then
SET in_Dict = CreateObject("Scripting.Dictionary")
end if
end sub
sub addValue(ByRef in_Obj as Variant, ByVal in_Key as String, ByVal in_Value as String)
if not in_Obj.Exists(in_Key) then
in_Obj.Add in_Key, in_Value
end if
end sub
El submarino de prueba llama con una variable de tipo variante al subconjunto. En la función Valido el tipo de objeto enviado al sub. Si el tipo de objeto no es un objeto de diccionario (que no lo es), entonces el objeto in_Dict que en realidad es el objeto testDict declarado en la prueba secundaria, se establecerá en un objeto de diccionario.
Para demostrar mejor la referencia, también incluí el segundo sub llamado addValue. Paso nuevamente el objeto a la función como referencia y agrego otra clave al objeto del diccionario. En la prueba principal secundaria, publique el recuento. En este caso, hay 2 claves presentes.
Esta pregunta es inquietantemente similar a http://stackoverflow.com/questions/4038021/vba-return-dictionary-from-function preguntado 5 minutos antes que el suyo. – JohnFx
¡guau! (cumpliendo con el requisito de carácter mínimo) – quakkels