2012-02-22 20 views
13

Новый для vba. Как передать объект словаря другой функции.Pass 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 

дает «Пользовательский тип не определено "

Я использую Excel 2010

ответ

12

Когда вы используете CreateObject, вы привязываете объект во время выполнения (то есть, позднее привязка). Когда вы используете As Scripting.Dictionary, объект привязывается во время компиляции (т. Е. Раннее связывание).

Если вы хотите выполнить раннее связывание, вам нужно будет установить ссылку на нужную библиотеку. Чтобы сделать это, перейдите в меню Сервис -> Ссылки ... и выберите «Microsoft Scripting Runtime»

+0

Где это "Microsoft Scripting Runtime" в Excel 2016? – compski

5

Чтобы избежать ошибки добавить Microsoft Scripting Runtime (в Tools -> References).
Упрощенный пример:

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 Scripting времени выполнения для макроса, чтобы иметь возможность распознавать типы. Перейти к инструментам-> Ссылки и проверить исполнение сценариев 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

Код более многоразовый в новых ситуациях без излишних ссылок, которые могут помешать переносимости. Некоторые библиотеки не являются идентичными версиями и не всегда встречаются в другой системе. Последнее связывание просто открывает возможности для открытых и менее потенциальных проблем между релизами, если вам не нужна intellisense. – mrbillbenson

+2

Если библиотека не находится на другой системе, то последнее связывание все равно сломается. Библиотека 'Scripting' довольно вездесущая и не изменила версию в * длинном * времени. Объявление как «Объект» будет принудительно задерживать вызовы с задержкой, которые будут медленнее. Вы не получите Intellisense, и вы не получите проверку ошибок во время компиляции. Иногда используются допустимые применения для поздних библиотек, но 'Scripting.Runtime' определенно не является одним из них. – ThunderFrame

0

После вы добавив "Tools-> References-> Microsoft Scripting Runtime" попробовать это

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 
Смежные вопросы