【问题标题】:VBA: Dictionary items to string array?VBA:字典项目到字符串数组?
【发布时间】:2015-01-16 18:30:33
【问题描述】:

我正在尝试做的事情相当简单。我想获取Dictionary 中所有项目(值)的列表,并将它们保存在字符串数组中。

我猜这个代码会起作用:

Sub PrintFilters(ByVal crit As Dictionary)
    Dim i() As String
    i = crit.Items()
    ' Do stuff with i
End Sub

但是,我在第三行发现类型不匹配。我猜crit.Items() 的返回值是某种列表,而不是数组。不过,MSDN 页面并未提及此方法的返回值类型是什么。

有没有合适的方法来做到这一点?

【问题讨论】:

    标签: arrays vba dictionary type-conversion


    【解决方案1】:

    请在以下 2 个选项中找到实现相同结果的方法,方法是直接将转换作为主例程的一部分进行处理,或者将字典传递给返回字符串数组的函数; VBA Locals 窗口中的检查表明arrString 是“字符串(0 到 2)”类型的变量。请注意,可以使用字典 .Keys.Items 构建数组。

    在第一个示例中,Join 函数创建了一个字符串,其中包含由"|" 字符分隔的所有aDict.Items。然后Split 函数将该字符串分解为一个字符串数组,其中"|" 充当用于创建每个数组元素的分隔符。

    在这两个示例中,从 Dictionary 到 String Array 的实际转换都是用 1 行代码实现的。

    选项 #1 - 作为主程序的一部分

    Sub Dictionary_to_StringArray()
    
       Dim aDict As Scripting.Dictionary
       Dim arrString() As String
    
       Set aDict = New Scripting.Dictionary
       aDict.Add "United Kingdom", "London"
       aDict.Add "France", "Paris"
       aDict.Add "United States of America", "Washington, D.C."
    
       arrString = Split(Join(aDict.Items, "|"), "|") 'this works equally with .Items & .Keys
    
       Set aDict = Nothing
       Erase arrString
    
    End Sub
    

    选项 #2 - 由专用函数处理的转换

    Sub CallingProc()
    
       Dim aDict As Scripting.Dictionary
       Dim arrString() As String
    
       Set aDict = New Scripting.Dictionary
       aDict.Add "United Kingdom", "London"
       aDict.Add "France", "Paris"
       aDict.Add "United States of America", "Washington, D.C."
    
       arrString = Make_StringArray_From_Dictionary(aDict)
    
       Set aDict = Nothing
       Erase arrString
    
    End Sub
    
    Function Make_StringArray_From_Dictionary(ByVal SubmitDict As Scripting.Dictionary) As String()
    
       Make_StringArray_From_Dictionary = Split(Join(SubmitDict.Items, "|"), "|")
    
    End Function
    

    【讨论】:

    • 如果你的字符串 "|" 这会中断包含在键或项中。
    【解决方案2】:

    如果您需要一个字符串数组,您需要手动构建一个,因为.Itemsvariant()

    Sub PrintFilters(crit As Dictionary)
        Dim key As Variant, i As Long
    
        ReDim items(crit.Count - 1) As String
    
        For Each key In crit.Keys()
            items(i) = crit(key)
            i = i + 1
        Next
    
        Debug.Print Join(items, ", ")
    End Sub
    

    【讨论】:

    • 我猜 OP 并不是真的在寻找 String,而是在寻找 Variant 数组:P
    【解决方案3】:

    我认为是 Variant 类型所以试试这个:

    Sub PrintFilters(ByVal crit As Dictionary)
        Dim i As Variant
        i = crit.Items()
        ' Do stuff with i
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 2013-03-17
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 2013-07-28
      相关资源
      最近更新 更多