在 VBA 中的字典值中查找最大值/最小值

Posted

技术标签:

【中文标题】在 VBA 中的字典值中查找最大值/最小值【英文标题】:find max/min value in dictionary values in VBA 【发布时间】:2019-01-25 18:16:32 【问题描述】:

我正在使用 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 中做到这一点?

【问题讨论】:

见:excelmacromastery.com/vba-dictionary/#Sorting_by_values 【参考方案1】:

我会从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

【讨论】:

+1 不知道你可以这样使用.min.max,我会把它藏在脑子里以备将来使用。跨度> 【参考方案2】:

您可以通过使用几个数组来临时存储您的高值和低值以及关联的键,因为您像这样遍历字典:

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 引用您的排序字典。

编辑:

您需要将add a library reference 发送至Microsoft Scripting Runtime 才能正常工作。

【讨论】:

以上是关于在 VBA 中的字典值中查找最大值/最小值的主要内容,如果未能解决你的问题,请参考以下文章

如何从从excel文件派生的大量字典中的值列表中查找最小值和最大值

用于在多张纸上循环的范围内查找最大值和最小值的 VBA 代码

3.python小技巧分享-使用min和max函数去找字典中的最大值和最小值

二分查找

Crystal Reports,从下一条记录的最小值中减去当前记录的最大值

VBA Access - 如何从多个字段返回最大值/最小值