在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

我在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
我需要一个公式,我可以在第4列中填写,它将执行以下操作:

  • 选择“批次号”列中的所有重复项
  • 在“结束时间”列中查找重复项的最大值
  • 在所有副本的“结束时间”中的“最大值”中,用“BatchID”列中的单元格值填充第四列
第4列的预期输出:

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