2016-01-24 87 views
0

得到了在Excel中:获得最后日期时间在Excel

456781 b1 28-5-2014 10:57:09 
456781 b1 28-5-2014 11:04:35 
456781 b1 28-5-2014 11:06:24 
456781 b1 28-5-2014 11:08:56 
456781 b1 28-5-2014 11:12:07 
456781 b2 28-5-2014 12:30:30 
456781 b2 28-5-2014 12:39:49 
456781 b2 28-5-2014 12:33:00 
456781 b2 28-5-2014 12:35:05 
456781 b2 28-5-2014 12:36:24 

结果我想

456781 b1 28-5-2014 11:12:07 
456781 b2 28-5-2014 12:39:49 

结果必须是在其他工作表

有VBA代码的结果,我想?

它试了一下没有去B1/B2为代码“:

Sub test() 

LastRow = Sheets("Sheet2").Cells(Sheets("Sheet2").Rows.Count, "A").End(xlUp).Row 
Sheets("Sheet2").Range("B1:B" & LastRow).FormulaArray = "=MAX(IF(Sheet1!R1C[-1]:R4C[-1]=RC[-1],Sheet1!R1C:R4C))" 

End Sub 
+0

为此,您可以简单地用透视表 –

+0

你能帮我一个透视表@RonRosenfeld – dave

回答

0

你不需要这样的目的宏,这个问题可以利用阵列功能{max(if())}解决:

1)插入列A(唯一ID)中的条件;
2)插入公式=MAX(IF($A$1:$A$4=A8;$B$1:B$4)),然后按CTRL + 转变 +输入申请array formula,您将得到需要的结果:

例如:

enter image description here


更新

1)这是一个可能的解决方案使用VBA之一:

Sub test() 
    Dim cl As Range, Data As Range, dic As Object, i$, k 
    Set dic = CreateObject("Scripting.Dictionary") 
    dic.comparemode = vbTextCompare 
    Set Data = Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row) 
    For Each cl In Data 
    i = cl.Value2 & "|" & cl.Offset(, 1).Value2 
     If Not dic.exists(i) Then 
      dic.Add i, cl.Offset(, 2).Value2 
     Else 
      If CDec(dic(i)) < cl.Offset(, 2).Value2 Then dic(i) = cl.Offset(, 2).Value2 
     End If 
    Next cl 
    For Each k In dic 
     Debug.Print Split(k, "|")(0), Split(k, "|")(1), Format(dic(k), "dd-mm-yyyy hh:mm:ss") 
    Next k 
End Sub 

测试:

enter image description here


2),或者它可以是这样的:

Sub test2() 
    Dim cl As Range, Data As Range, dic As Object, i$, k 
    Set dic = CreateObject("Scripting.Dictionary") 
    dic.comparemode = vbTextCompare 
    Set Data = Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row) 
    For Each cl In Data 
     i = cl.Value2 & "|" & cl.Offset(, 1).Value2 
     If Not dic.exists(i) Then 
      dic.Add i, Evaluate("=MAX(IF(" & Data.Address & "=" & cl.Address & _ 
            ",IF(" & Data.Offset(, 1).Address & "=" & cl.Offset(, 1).Address & _ 
             "," & Data.Offset(, 2).Address & ")))") 
     End If 
    Next cl 
    For Each k In dic 
     Debug.Print Split(k, "|")(0), Split(k, "|")(1), Format(dic(k), "dd-mm-yyyy hh:mm:ss") 
    Next k 
End Sub 

测试: enter image description here


3)相同先前变型,但它确实输出到新的工作簿

Sub test3() 
    Dim cl As Range, Data As Range, dic As Object, i$, k 
    Set dic = CreateObject("Scripting.Dictionary") 
    dic.comparemode = vbTextCompare 
    Set Data = Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row) 
    For Each cl In Data 
     i = cl.Value2 & "|" & cl.Offset(, 1).Value2 
     If Not dic.exists(i) Then 
      dic.Add i, Evaluate("=MAX(IF(" & Data.Address & "=" & cl.Address & _ 
            ",IF(" & Data.Offset(, 1).Address & "=" & cl.Offset(, 1).Address & _ 
             "," & Data.Offset(, 2).Address & ")))") 
     End If 
    Next cl 
    '//below the code does output of the result to the new Workbook 
    Dim r&: r = 1: Workbooks.Add 
    For Each k In dic 
     Cells(r, "A").Value2 = Split(k, "|")(0) 
     Cells(r, "B").Value2 = Split(k, "|")(1) 
     Cells(r, "C").Value2 = Format(dic(k), "dd-mm-yyyy hh:mm:ss") 
     r = r + 1 
    Next k 
End Sub 

也这样的任务可以通过使用VBA SQL查询来解决(例如Adodb),Pivot,array,collection等方法。

+0

'= IF()'公式真部分也有像'= MAX绝对引用( IF($ A $ 1:$ A $ 4 = A8; $​​ B $ 1:$ B $ 4))' – harun24hr

+0

@ harun24hr漂亮的抓住,肯定它一定是,我只是忘了指定,谢谢;) – Vasily

+0

谢谢..编辑我的问题与一些真实的数据,我喜欢一个宏,因为必须去自动 – dave

0

以下是使用数据透视表的示例。 我标记的列随意:

enter image description here

  • 将数量和类型的行区域
  • 拖动时间到价值区域
  • 变化的时间“MAX”值字段设置与格式化值
  • 从数据透视表选项中删除总计和小计选项
  • 更改报表布局以表格形式显示和R epeat所有项目标签
  • 还有更多格式化选项可供设计。

enter image description here

+0

我认为dbf的datime很奇怪,我得到的值如下:45671 \t v1 \t 28-5-2014 12:47:00 45672 \t s1 \t 41676,57。 – dave

+0

@dave。您可能需要格式正确。 Leary多么擅长存储日期和时间。 –

+0

@Rosenfeld,有没有这种自动选项。如果数据是新的,则数据由宏和数据表进行更改 – dave