Сортировка словаря по ключу в VBA
Я создал словарь в VBA с помощью CreateObject("Scripting.Dictionary")
который сопоставляет исходные слова целевым словам, которые нужно заменить в некотором тексте (это фактически для обфускации).
К сожалению, когда я выполняю фактическую замену в соответствии с приведенным ниже кодом, он заменит исходные слова в том порядке, в котором они были добавлены в словарь. Если у меня тогда есть, например, «Синий», а затем «Синяя ягода», «Синяя» часть в «Синей ящерице» заменяется первой мишенью, а «Берри» остается такой, какая была.
'This is where I replace the values For Each curKey In dctRepl.keys() largeTxt = Replace(largeTxt, curKey, dctRepl(curKey)) Next
Я думаю, что я мог бы решить эту проблему, сначала отсортировав ключи словаря от самой длинной длины до самой короткой длины, а затем выполнив замену, как указано выше. Проблема в том, что я не знаю, как сортировать ключи таким образом.
- Доступ к определенному полю в произвольно вложенных данных JSON
- .NET ObservableDictionary
- Объединение словарей в C #
- Использовать функциональные комбинаторы на Scala Tuples?
- Как получить доступ к глубоко вложенным словарям в Swift
- Удаление элемента из словаря
- .NET - блокировка словаря против ConcurrentDictionary
- Как я могу инициализировать статическую карту?
- Запрос LINQ для возврата словаря
- .NET HashTable Vs Dictionary - Может ли словарь быть таким же быстрым?
- Есть ли общеansible словарь для чтения, ansible в .NET?
- Кортежи (или массивы) в качестве словарных ключей в C #
- Сортировка словаря по ключам
Похоже, я сам это понял. Я создал следующую функцию, которая, как представляется, выполняет эту работу:
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) 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
Я искал простую функцию VBA для сортировки словарей по возрастанию значения ключа в Microsoft Excel.
Я внес некоторые незначительные изменения в код Neelsg в соответствии с моей целью (см. Следующие '//
комментарии для деталей изменений):
'/* Wrapper (accurate function name) */ Public Function funcSortDictByKeyAscending(dctList As Object) As Object Set funcSortDictByKeyAscending = funcSortKeysByLengthDesc(dctList) End Function '/* neelsg's code (modified) */ Public Function funcSortKeysByLengthDesc(dctList As Object) As Object '// Dim arrTemp() As String Dim arrTemp() As Variant ... ... ... '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 If arrTemp(itX) > arrTemp(itY) Then ... ... ... 'Create the new dictionary '// Set funcSortKeysByLengthDesc = CreateObject("Scripting.Dictionary") Set d = CreateObject("Scripting.Dictionary") For itX = 0 To (dctList.Count - 1) '// funcSortKeysByLengthDesc.Add arrTemp(itX), dctList(arrTemp(itX)) d(arrTemp(itX)) = dctList(arrTemp(itX)) Next '// Added: Set funcSortKeysByLengthDesc = d Else Set funcSortKeysByLengthDesc = dctList End If End Function