2013-03-21 55 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

相關問題