在Excel中检索单元格值,最大date为重复项
我在Excel 2010的Excel表格中有以下几列:
Batch Number BatchID END TIME 120319-0001 120319-0001_TEST1 3/20/12 13:44 120319-0001 120319-0001_TEST2 3/20/12 10:05 120319-0002 120319-0002_TEST1 3/20/12 14:40 120319-0002 120319-0002_TEST2 3/20/12 12:46 120319-0003 120319-0003_TEST1 3/20/12 14:01 120319-0003 120319-0003_TEST2 3/20/12 12:11 120319-0004 120319-0004_TEST1 3/20/12 15:37 120319-0004 120319-0004_TEST2 3/20/12 11:59 120319-0005 120319-0005_TEST1 3/20/12 19:06 120319-0005 120319-0005_TEST2 3/20/12 11:47
我需要一个公式,我可以填写在第四列将执行以下操作:
- 在“批号”列中select所有重复项
- 在“结束时间”列中查找最大值以查找重复项
- 在所有重复项的“结束时间”中填写第四列的单元格值,并在最大列的“批生产ID”中填写
预计第四栏输出:
120319-0001_TEST1 120319-0001_TEST1 120319-0002_TEST1 120319-0002_TEST1 120319-0003_TEST1 120319-0003_TEST1 120319-0004_TEST1 120319-0004_TEST1 120319-0005_TEST1 120319-0005_TEST1
我试过使用INDEX
, MATCH
和IF
语句的组合,还没有得到它的工作。
我也愿意使用VBA /macros解决scheme。
我有一个快速去尝试与公式做,但我认为你可能需要使用数组公式,他们对我来说没有意义!
下面的macros应该这样做。 (可能是比较时间戳的问题)
Sub Main() Dim Sheet As Worksheet Dim Data As Range Set Sheet = ThisWorkbook.Worksheets("Sheet1") Set Data = Sheet.Range("A2:A" & Range("A" & Range("A" & Sheet.UsedRange.Rows.Count).Row) Dim BatchNumber As Variant Dim EndTime As Variant Dim Result As Variant BatchNumber = Data.Value2 BatchID = Data.Offset(ColumnOffset:=1).Value2 EndTime = Data.Offset(ColumnOffset:=2).Value2 Result = Data.Offset(ColumnOffset:=3).Value2 Dim Index As Integer Dim Lookup As Integer Dim Max As Integer For Index = LBound(BatchNumber, 1) To UBound(BatchNumber, 1) Max = Index For Lookup = LBound(BatchNumber, 1) To UBound(BatchNumber, 1) If BatchNumber(Lookup, 1) = BatchNumber(Index, 1) Then If Not Lookup = Index Then ' NOTE: you might to do stuff to the date/time comparison below to get it to work correctly If EndTime(Lookup, 1) > EndTime(Index, 1) Then Max = Lookup Else Max = Index End If End If End If Next Lookup Result(Index, 1) = BatchID(Max, 1) Next Index Data.Offset(ColumnOffset:=3).Value2 = Result End Sub
更新
下面的一个应该快一点,因为它只遍历数据集两次。 而不是行*迭代(我认为)的第一个。
Sub Main2() Dim Sheet As Worksheet Dim Data As Range Dim vData As Variant Dim vResult As Variant Set Sheet = ThisWorkbook.Worksheets("Sheet1") Set Data = Sheet.Range("A2:A" & Range("A" & Sheet.UsedRange.Rows.Count).Row) vData = Data.Resize(ColumnSize:=3).Value2 vResult = Data.Value2 Dim List As Object Set List = CreateObject("Scripting.Dictionary") Dim Index As Integer Dim Key As String For Index = LBound(vData, 1) To UBound(vData, 1) Key = vData(Index, 1) If List.exists(Key) Then If vData(Index, 3) > vData(List(Key)(1), 3) Then List(Key)(1) = Index End If Else List.Add vData(Index, 1), Array(Index, Index) End If Next Index For Index = LBound(vData, 1) To UBound(vData, 1) Key = vData(Index, 1) vResult(Index, 1) = vData(List(Key)(1), 2) Next Index Data.Offset(ColumnOffset:=3).Value2 = vResult Set List = Nothing End Sub