Пропустить словарь 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