vba: вернуть словарь из функции

это обрисовывает в общих чертах то, что я пытаюсь сделать.

у меня это не работает, и непонятно почему.

заранее спасибо за любую помощь.

        Sub mySub()
        dim myDict as Dictionary
            myDict=new Dictionary

                myDict=myFunc()

        End Sub

        Function myFunc()
            dim myDict2
                set myDict2 = new Dictionary

                    'some code that does things and adds to myDict2'

            myFunc=myDict2
        End Function

person jason m    schedule 27.10.2010    source источник


Ответы (2)


Вам нужно будет использовать ключевое слово SET каждый раз, когда вы назначаете объект вместо значения:

    Sub mySub()
        dim myDict as Dictionary
        set myDict = myFunc()
    End Sub

    Function myFunc() as Dictionary
        dim myDict2 as Dictionary
        set myDict2 = new Dictionary
                'some code that does things and adds to myDict2'
        set myFunc=myDict2
    End Function

Ваш исходный код также создавал myDict как новый объект Dictionary, а затем немедленно заменял его другим. Вы можете просто пропустить этот шаг.

person BradC    schedule 27.10.2010
comment
это работает с небольшим изменением, если вы установите myFunc (1) = myDict2. но тогда это создает бесконечный цикл. - person jason m; 28.10.2010
comment
Нет, это не бесконечный цикл. myFunction = Value (или SET myFunction = Object) является эквивалентом RETURN Value в VBA. - person BradC; 28.10.2010
comment
И вам не нужен myFunc(1)=, вы просто хотите myFunc=, иначе вы просто устанавливаете первое значение словаря для всего другого объекта, а это не то, что вам нужно. - person BradC; 28.10.2010
comment
да, Set myFunction = Obj - это бит кода, который требовался. большое спасибо за указатель - person jason m; 28.10.2010
comment
При использовании того же кода ... Я получаю сообщение об ошибке, поскольку пользовательский тип не определен. Пожалуйста, помогите - person user3206357; 27.05.2016
comment
Извините, @ user3206357, я ничего не знаю о библиотеках объектов, которые установил этот исходный пользователь, или о том, является ли Dictionary настраиваемым объектом, который он сам определил. Я просто исправлял синтаксическую ошибку, которая была у него при попытке вернуть этот объект. - person BradC; 27.05.2016
comment
@ user3206357 вам необходимо импортировать среду выполнения сценариев Microsoft. см. stackoverflow.com/questions/ 3233203 / - person jason m; 15.06.2016

Я вижу, что это старый вопрос, но решение с сообщением И помогло мне разобраться в этом, и я поднял его на новый уровень. Это был небольшой прыжок. Спасибо!

Как насчет преобразования вашей функции, которая заполняет словарь именами процессов и идентификаторами, чтобы она возвращала объект словаря? Затем это простая задача - заполнить лист содержимым словаря, что я научился делать из блога. Хотел бы я знать имя автора, но ссылка есть.

Sheet1, конечно, предполагался. Настройте, как хотите. Опять же, это был небольшой скачок по сравнению с тем, что вы оба писали. Абсолютно классная работа, ребята, спасибо!

Sub Test_AllRunningApps()
    Dim apps As Dictionary
    Set apps = AllRunningApps()

    'Populate a sheet with a dictionary - http://exceldevelopmentplatform.blogspot.com/2018/05/vba-writing-dictionaries-to-worksheet.html
    Sheet1.Cells(1, 1).Resize(apps.Count, 1).Value2 = Application.Transpose(apps.Keys)
    Sheet1.Cells(1, 2).Resize(apps.Count, 1).Value2 = Application.Transpose(apps.Items)

    Set apps = Nothing
End Sub

'Similar to: http://msdn.microsoft.com/en-us/library/aa393618%28VS.85%29.aspx
Public Function AllRunningApps() As Dictionary
    Dim strComputer As String
    Dim objServices As Object, objProcessSet As Object, Process As Object
    Dim oDic As Object, oDic2 As Object, a() As Variant

    Set oDic = CreateObject("Scripting.Dictionary")

    strComputer = "."

    Set objServices = GetObject("winmgmts:\\" _
        & strComputer & "\root\CIMV2")
    Set objProcessSet = objServices.ExecQuery _
        ("Select Name, ProcessID FROM Win32_Process", , 48)

    For Each Process In objProcessSet
       If Not oDic.exists(Process.Name) Then
        oDic.Add Key:=Process.Properties_("Name").Value, Item:=Process.Properties_("ProcessID").Value
       End If
    Next

    Set AllRunningApps = oDic

    Set objProcessSet = Nothing
    Set oDic = Nothing
End Function
person HopWorks    schedule 08.09.2019
comment
Я также понял, что способ инициализации словарей требует, чтобы вы включали ссылки в свою книгу / VBA. Я всегда включаю три ... Microsoft Script Control 1.0, Microsoft Scripting Runtime, Microsoft Scriptlet Library - person HopWorks; 08.09.2019