Пропустить словарь vba

Новое в 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

Ответ 1

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

Если вы хотите выполнить раннее связывание, вам нужно будет установить ссылку на правильную библиотеку. Для этого перейдите в Инструменты → Ссылки... и выберите "Microsoft Scripting Runtime"

Ответ 2

Во избежание ошибки добавьте исполняемый файл Microsoft Scripting Runtime (в Инструменты → Ссылки).
Упрощенный пример:

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

Вам нужно добавить ссылку на библиотеку Runtime Microsoft Scripting для вашего макроса, чтобы иметь возможность распознавать типы. Перейти к Tools-> Ссылки и проверить время выполнения сценариев Microsoft Scripting.

Ответ 4

Я бы пересмотрел этот ответ, чтобы использовать только позднюю привязку и использовать параметр объекта:

Sub aaa(dict As Object)
Set dict = CreateObject("Scripting.Dictionary")
...
process dict 
End Sub

Sub process(dict As Object)
    MsgBox dict.Count
End Sub

Ответ 5

После того, как вы добавили "Tools->" Ссылки-> 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