Pass VBA словарь - PullRequest
       7

Pass VBA словарь

13 голосов
/ 22 февраля 2012

плохо знаком с 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

Ответы [ 5 ]

13 голосов
/ 22 февраля 2012

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

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

6 голосов
/ 22 февраля 2012

Чтобы избежать ошибки, добавьте 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
4 голосов
/ 20 февраля 2014

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

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

Sub process(dict As Object)
    MsgBox dict.Count
End Sub
3 голосов
/ 22 февраля 2012

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

0 голосов
/ 21 апреля 2015

После добавления «Инструменты-> Ссылки-> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...