2016-01-24 65 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