使用 Scripting.Dictionary(最大計數)聚合資料

字典非常適​​合管理多個條目出現的資訊,但你只關注每組條目的單個值 - 第一個或最後一個值,最小值或最大值,平均值,總和等。

考慮一個包含使用者活動日誌的工作簿,其中的指令碼在每次有人編輯工作簿時插入使用者名稱和編輯日期:

Log 工作表

一個 B
短髮 10/12/2016 9:00
愛麗絲 2016 年 10 月 13 日 13:00
短髮 2016 年 10 月 13 日 13:30
愛麗絲 2016 年 10 月 13 日 14:00
愛麗絲 2016 年 10 月 14 日 13:00

假設你要將每個使用者的上次編輯時間輸出到名為 Summary 的工作表中。

注意:
1。資料假定為 ActiveWorkbook
我們使用陣列從工作表中提取值; 這比迭代每個單元更有效。
3. Dictionary 是使用早期繫結建立的。

Sub LastEdit()
Dim vLog as Variant, vKey as Variant
Dim dict as New Scripting.Dictionary
Dim lastRow As Integer, lastColumn As Integer
Dim i as Long
Dim anchor As Range

With ActiveWorkbook
    With .Sheets("Log")
        'Pull entries in "log" into a variant array
        lastRow = .Range("a" & .Rows.Count).End(xlUp).Row
        vlog = .Range("a1", .Cells(lastRow, 2)).Value2

        'Loop through array
        For i = 1 to lastRow
            Dim username As String
            username = vlog(i, 1)
            Dim editDate As Date
            editDate = vlog(i, 2)

            'If the username is not yet in the dictionary:
            If Not dict.Exists(username) Then
                dict(username) = editDate
            ElseIf dict(username) < editDate Then
                dict(username) = editDate
            End If
        Next
    End With

    With .Sheets("Summary")
        'Loop through keys
        For Each vKey in dict.Keys
            'Add the key and value at the next available row
            Anchor = .Range("A" & .Rows.Count).End(xlUp).Offset(1,0)
            Anchor = vKey
            Anchor.Offset(0,1) = dict(vKey)
        Next vKey
    End With
End With
End Sub

輸出將如下所示:

Summary 工作表

一個 B
短髮 2016 年 10 月 13 日 13:30
愛麗絲 2016 年 10 月 14 日 13:00

另一方面,如果要輸出每個使用者編輯工作簿的次數,則 For 迴圈的主體應如下所示:

        'Loop through array
        For i = 1 to lastRow
            Dim username As String
            username = vlog(i, 1)

            'If the username is not yet in the dictionary:
            If Not dict.Exists(username) Then
                dict(username) = 1
            Else
                dict(username) = dict(username) + 1
            End If
        Next

輸出將如下所示:

Summary 工作表

一個 B
短髮 2
愛麗絲 3