如何从函数中返回一个字典?

21
这对我来说不起作用,而且原因也不清楚。
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

如何从函数中返回一个字典?
2个回答

47

每当你要分配一个对象而不是一个时,你需要使用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的新字典对象,然后立即用另一个字典对象替换它。你可以直接跳过这一步。


如果你将myFunc(1)=myDict2稍作修改,这段代码就能正常运行。但是这样会导致无限循环。 - jason m
1
不,这不是一个无限循环。myFunction = Value(或 SET myFunction = Object)是 VBA 中等同于 RETURN Value 的语句。 - BradC
而且你不想要 myFunc(1)=,你只想要 myFunc=,否则你只是把字典的第一个值设置为整个其他对象,这不是你想要的。 - BradC
是的,“Set myFunction=Obj”是所需的代码行。非常感谢您的指引。 - jason m
在使用相同的代码时,我遇到了“用户定义类型未定义”的错误。请帮忙解决。 - user3206357
显示剩余2条评论

0

我看到这是一个旧问题,但是这篇帖子和解决方案帮助了我解决了这个问题,并且我将其提升到了下一个级别。这只是一个小小的飞跃。谢谢!

将填充字典的函数转换为返回字典对象的函数怎么样?然后,只需使用字典内容填充工作表,这是我从一篇博客中学到的。我希望我有作者的名字,但链接已经包含在内。

当然,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

我也意识到,字典的初始化方式要求在工作簿/VBA中包含引用。我总是包括三个:Microsoft Script Control 1.0、Microsoft Scripting Runtime和Microsoft Scriptlet Library。 - HopWorks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接