Сортировка Dictionary на основе вложенного Dictionary Item в VBA
Есть сэмпл данных в Excel (таблица):
Пытаюсь получить ТОП-3 элемента списка на основании "Salary" и ТОП-3 на основании "Revenue" программно в VBA.
В Visual Basic (VBA) создал словарь с параметром Name в качестве Key и вложенного Dictionary в качестве Item.
Вложенный Dictionary имеет параметры "Salary", "Revenue" and "Position" как Key. И соответствующие значения из таблицы как Items.
Создал Dictionary:
Dim MainDict As New Scripting.Dictionary
Dim NestedDict As Scripting.Dictionary
Dim rngRange As Range
Set rngRange = wsMainWorkSheet.Range("B2:E8")
Dim rowCounter As Long
For rowCounter = 1 To rngRange.Rows.Count
Set NestedDict = New Dictionary
NestedDict.Add key:="Salary", Item:=rngRange(rowCounter, 2)
NestedDict.Add key:="Revenue", Item:=rngRange(rowCounter, 3)
NestedDict.Add key:="Position", Item:=rngRange(rowCounter, 4)
Dim mainKey As String
mainKey = CStr(rngRange(rowCounter, 1))
If MainDict.Exists(mainKey) = False Then
MainDict.Add key:=mainKey, Item:=NestedDict
Else:
MainDict.Item(mainKey)("Salary") = MainDict.Item(mainKey)("Salary") + rngRange(rowCounter, 2)
MainDict.Item(mainKey)("Revenue") = MainDict.Item(mainKey)("Salary") + rngRange(rowCounter, 3)
End If
Next rowCounter
Для печати элементов словаря MainDict использую такой код:
Sub PrintDictionary(dict As Dictionary)
Dim key As Variant, subKey As Variant
For Each key In dict.Keys
Debug.Print vbNewLine; "Name: " & key
For Each subKey In dict(key).Keys
Debug.Print subKey & ": " & dict(key)(subKey)
Next subKey
Next key
End Sub
Результат:
Name: Name1 Salary: 400 Revenue: 5000 Position: Manager
Name: Name2 Salary: 500 Revenue: 25000 Position: Associate
(первые две строки)
Сложность в проведении сортировки словаря на основе вложенного словаря:
Получение ТОП-3 элементов списка (
MainDict) на основании наибольшего показателя "Salary" во вложенном словареNestedDict.Получение ТОП-3 элементов списка (
MainDict) на основании наибольшего показателя "Revenue" во вложенном словареNestedDict.
Может ли кто подсказать как это реализовать без ручной предварительной сортировки самих данных в таблице Excel?
Book1.xlsm (сэмпл данных) доступен в DropBox: Book1.xlsm
