你不需要这样的目的宏,这个问题可以利用阵列功能{max(if())}
解决:
1)插入列A
(唯一ID)中的条件;
2)插入公式=MAX(IF($A$1:$A$4=A8;$B$1:B$4))
,然后按CTRL + 转变 +输入申请array formula
,您将得到需要的结果:
例如:
更新
1)这是一个可能的解决方案使用VBA之一:
Sub test()
Dim cl As Range, Data As Range, dic As Object, i$, k
Set dic = CreateObject("Scripting.Dictionary")
dic.comparemode = vbTextCompare
Set Data = Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row)
For Each cl In Data
i = cl.Value2 & "|" & cl.Offset(, 1).Value2
If Not dic.exists(i) Then
dic.Add i, cl.Offset(, 2).Value2
Else
If CDec(dic(i)) < cl.Offset(, 2).Value2 Then dic(i) = cl.Offset(, 2).Value2
End If
Next cl
For Each k In dic
Debug.Print Split(k, "|")(0), Split(k, "|")(1), Format(dic(k), "dd-mm-yyyy hh:mm:ss")
Next k
End Sub
测试:
2),或者它可以是这样的:
Sub test2()
Dim cl As Range, Data As Range, dic As Object, i$, k
Set dic = CreateObject("Scripting.Dictionary")
dic.comparemode = vbTextCompare
Set Data = Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row)
For Each cl In Data
i = cl.Value2 & "|" & cl.Offset(, 1).Value2
If Not dic.exists(i) Then
dic.Add i, Evaluate("=MAX(IF(" & Data.Address & "=" & cl.Address & _
",IF(" & Data.Offset(, 1).Address & "=" & cl.Offset(, 1).Address & _
"," & Data.Offset(, 2).Address & ")))")
End If
Next cl
For Each k In dic
Debug.Print Split(k, "|")(0), Split(k, "|")(1), Format(dic(k), "dd-mm-yyyy hh:mm:ss")
Next k
End Sub
测试:
3)相同先前变型,但它确实输出到新的工作簿
Sub test3()
Dim cl As Range, Data As Range, dic As Object, i$, k
Set dic = CreateObject("Scripting.Dictionary")
dic.comparemode = vbTextCompare
Set Data = Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row)
For Each cl In Data
i = cl.Value2 & "|" & cl.Offset(, 1).Value2
If Not dic.exists(i) Then
dic.Add i, Evaluate("=MAX(IF(" & Data.Address & "=" & cl.Address & _
",IF(" & Data.Offset(, 1).Address & "=" & cl.Offset(, 1).Address & _
"," & Data.Offset(, 2).Address & ")))")
End If
Next cl
'//below the code does output of the result to the new Workbook
Dim r&: r = 1: Workbooks.Add
For Each k In dic
Cells(r, "A").Value2 = Split(k, "|")(0)
Cells(r, "B").Value2 = Split(k, "|")(1)
Cells(r, "C").Value2 = Format(dic(k), "dd-mm-yyyy hh:mm:ss")
r = r + 1
Next k
End Sub
也这样的任务可以通过使用VBA SQL
查询来解决(例如Adodb),Pivot
,array
,collection
等方法。
为此,您可以简单地用透视表 –
你能帮我一个透视表@RonRosenfeld – dave