найти максимальное / минимальное значение в словарных значениях в VBA - PullRequest
0 голосов
/ 25 января 2019

Я использую VBA для сохранения ключа и значения, связанного с ключом, в словаре.

Sub Dict_Example()

Set dict = CreateObject("Scripting.Dictionary")

For i = 1 to 5
    dict.Add i, some number
Next i

Я хотел бы найти самое высокое значение и связанный с ним ключ в dict.

Например, если dict = {1: 5, 2: 10, 3: 6, 4: 11, 5: 3}, где 1,2,3,4,5 - ключи, а 5, 10, 6, 11, 3Значения должны возвращать 4: 11.

Как мне это сделать в VBA?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Я бы сгенерировал массив из dict.items и использовал бы функцию Max / Min. Затем зациклите ключи и сравните элементы с этим.

Option Explicit    
Public Sub Dict_Example()
    Dim dict As Object, max As Long, min As Long, arr(), key As Variant, i As Long
    Set dict = CreateObject("Scripting.Dictionary")

    For i = 1 To 5
        dict.Add i, i * Application.WorksheetFunction.RandBetween(0, 100)
    Next i

    max = Application.max(dict.items)
    min = Application.min(dict.items)

    For Each key In dict
        Debug.Print key, dict(key)
        If dict(key) = max Then Debug.Print "max= " & dict(key) & vbTab & "key= " & key
    Next
    Stop
End Sub
0 голосов
/ 25 января 2019

Вы можете сделать это, используя пару массивов для временного хранения ваших высоких и низких значений и связанных ключей, когда вы выполняете итерацию по словарю следующим образом:

Sub test()
Dim dict As New Dictionary
Dim low(1 To 2)
Dim high(1 To 2)
Dim i As Long
Dim key

For i = 1 To 5
    dict.Add i, 'some number
Next i

low(1) = dict.Keys(0)
low(2) = dict(dict.Keys(0))
high(1) = dict.Keys(0)
high(2) = dict(dict.Keys(0))

For i = 0 To dict.Count - 1
    If dict(dict.Keys(i)) < low(2) Then
        low(1) = dict.Keys(i)
        low(2) = dict(dict.Keys(i))
    ElseIf dict(dict.Keys(i)) > high(2) Then
        high(1) = dict.Keys(i)
        high(2) = dict(dict.Keys(i))
    End If
Next i

Debug.Print low(1) & ":" & low(2) & vbCrLf & high(1) & ":" & high(2)

End Sub

Но сортировка, подобная этой, будет работать правильно только для числовых значений. Комментарий @Ryan Wildry - это способ общей сортировки словаря, тогда вы можете получить значения, используя dict(dict.Keys(0)) и dict(dict.Keys(dict.Count - 1)) соответственно, где dict ссылается на ваш отсортированный словарь.

EDIT:

Вам нужно добавить библиотечную ссылку к Microsoft Scripting Runtime, чтобы это работало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...