2013-03-21 32 views
2

之间最大的日期我有一个Excel工作表下面的列在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列,将做以下向下填充:

  • 选择列中的所有副本“批号”
  • 列“结束时间”重复查找最大
  • 在Colu单元格的值填入第4列马克斯MN“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 

我使用的INDEXMATCH一个合并审理,并IF声明和避风港还没有得到它的工作。

我也愿意使用VBA /宏解决方案。

+0

输出,我想你从一个更大的数据集?如果是这样,你可以删除那些不在你的示例数据集中的? (重新阅读后可能是错误的) – NickSlash 2013-03-21 21:34:27

+0

@NickSlash是的这些是对原始数据集的伪修改,它具有> 50,000行和更多的列 – jordanhill123 2013-03-21 21:36:49

+0

是否可以首先进行排序以协助1次fx?或者这是否需要成为持续的生活配方? – Kevin 2013-03-21 22:26:59

回答

2

我有一个快速去试图用公式做,但我认为你可能需要使用Array公式,他们对我没有意义!

下面的宏虽然应该这样做。 (可能是一个问题,虽然比较时间戳)

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 
+0

您可以通过检查集合中是否有多个批次号(根据问题的第一步)来加速子程序。可能'过滤器'功能将会有用。 – 2013-03-21 22:43:34

+0

“select duplicates”是(我相信)只是为了比较“结束时间”值并选择最大的结果 – NickSlash 2013-03-21 22:48:31

+0

我认为列表中不能重复某些批号。无论如何,使用'字典'我觉得好多了。 – 2013-03-21 22:53:08

相关问题