在Excel中检索重复之间日期最大的单元格值
我在excel 2010的excel工作表中有以下列:在Excel中检索重复之间日期最大的单元格值,excel,excel-formula,vba,Excel,Excel Formula,Vba,我在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-0
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
我需要一个公式,我可以在第4列中填写,它将执行以下操作:
- 选择“批次号”列中的所有重复项
- 在“结束时间”列中查找重复项的最大值
- 在所有副本的“结束时间”中的“最大值”中,用“BatchID”列中的单元格值填充第四列
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
我尝试过使用索引
、匹配
和如果
语句的组合,但还没有成功
我也愿意使用VBA/宏解决方案。我曾尝试过使用公式,但我认为您可能需要使用数组公式,它们对我毫无意义 不过,下面的宏应该可以做到这一点。(不过,比较时间戳可能是个问题) 更新 下面的一个应该快一点,因为它只在数据集上迭代一次。而不是第一次的行*行迭代(我认为)
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
输出,我猜你是从一个更大的数据集中得到的?如果是这样,您是否可以删除示例数据集中没有的数据?(重读后可能会出错)@NickSlash Yes这些是对原始数据集的伪修改,原始数据集的行数大于50000行,列数大于50000行。首先进行排序以帮助使用1次fx是否可行?或者这需要是一个正在进行的live公式吗?@Kevin我对BatchID进行排序,以将“批次号”中的所有重复项聚集在一起,以便进行尝试,但可以在填充列之前对任何列进行排序。它不需要是活的formula@jordanhill123嘿,朋友!!!!!!!!您可以通过检查集合中是否有多个批号来加速子例程(根据问题的第一步)。可能
Filter
函数会很有用。“选择重复项”只是(我相信)比较end time
值并为结果选择最大值。我认为列表中的一些批号无法重复。无论如何,我认为使用字典要好得多。@NickSlash我只在第4列中填充第一行。有什么想法吗?与Main
和Main2
routines的结果相同列引用是否正确?如果您的数据不在列A:C
+D
中,则它们可能无法按预期工作。
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