使用 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