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列,它将执行以下操作:
第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
我尝试过使用INDEX
,MATCH
和IF
语句的组合,但尚未使用它。
我也愿意使用VBA /宏解决方案。
答案 0 :(得分:2)
我快速尝试使用Formulas,但我认为你可能需要使用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
<强>更新强>
下面的内容应该更快一些,因为它只会在数据集一次两次迭代。而不是Rows * Rows迭代(我认为)第一次。
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