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

Ответ 1

Вам нужно будет использовать ключевое слово 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, а затем сразу же его заменили другим. Вы можете просто пропустить этот шаг.

Ответ 2

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

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

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

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