excel - 在 VBA 中按键对字典进行排序

标签 excel vba dictionary

我使用 CreateObject("Scripting.Dictionary") 在 VBA 中创建了一个字典,将源单词映射到要在某些文本中替换的目标单词(这实际上是为了混淆)。

不幸的是,当我按照下面的代码进行实际替换时,它将按照源单词添加到词典中的顺序替换源单词。例如,如果我先有“蓝色”,然后有“蓝色浆果”,则“蓝色浆果”中的“蓝色”部分将被第一个目标替换,并且“浆果”保持原样。

'This is where I replace the values
For Each curKey In dctRepl.keys()
    largeTxt = Replace(largeTxt, curKey, dctRepl(curKey))
Next

我认为我可以通过首先将字典的从最长长度到最短长度进行排序,然后按上述方式进行替换来解决此问题。问题是我不知道如何以这种方式对键进行排序。

最佳答案

看来是我自己想出来的。我创建了以下似乎可以完成这项工作的函数:

Public Function funcSortKeysByLengthDesc(dctList As Object) As Object
    Dim arrTemp() As String
    Dim curKey As Variant
    Dim itX As Integer
    Dim itY As Integer

    'Only sort if more than one item in the dict
    If dctList.Count > 1 Then

        'Populate the array
        ReDim arrTemp(dctList.Count - 1)
        itX = 0
        For Each curKey In dctList
            arrTemp(itX) = curKey
            itX = itX + 1
        Next

        'Do the sort in the array
        For itX = 0 To (dctList.Count - 2)
            For itY = (itX + 1) To (dctList.Count - 1)
                If Len(arrTemp(itX)) < Len(arrTemp(itY)) Then
                    curKey = arrTemp(itY)
                    arrTemp(itY) = arrTemp(itX)
                    arrTemp(itX) = curKey
                End If
            Next
        Next

        'Create the new dictionary
        Set funcSortKeysByLengthDesc = CreateObject("Scripting.Dictionary")
        For itX = 0 To (dctList.Count - 1)
            funcSortKeysByLengthDesc.Add arrTemp(itX), dctList(arrTemp(itX))
        Next

    Else
        Set funcSortKeysByLengthDesc = dctList
    End If
End Function

有关静态数组的更多信息,请参阅:https://excelmacromastery.com/excel-vba-array/#Declaring_an_Array

关于excel - 在 VBA 中按键对字典进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14808104/

相关文章:

excel - 如何从 vba 使用 xtensor?

删除工作表后不再声明 VBA 全局变量

vba - 无法获取 WorksheetFunction 类的 Match 属性

ios - 重置保存的 map 图钉,iOS Swift

python - 将列表的列表转换为字典

vba - VBA 中的 With block 中有超过 1 个单元格范围

用于将过滤器设置为一系列选项的 Excel VBA 代码

excel - 保存并关闭 visio 文档 Visual Basic 宏

c++11 - 为什么 std::map::lower_bound 对于大小为 1 的映射会失败?

excel - 显示垂直对齐的溢出文本