![So finden Sie mithilfe eines Makros das neueste Datum/die neueste Uhrzeit in der Spalte](https://rvso.com/image/1303091/So%20finden%20Sie%20mithilfe%20eines%20Makros%20das%20neueste%20Datum%2Fdie%20neueste%20Uhrzeit%20in%20der%20Spalte.png)
Ich habe vom System generierte Daten, die wie die folgende Tabelle aussehen. In der letzten Spalte muss ich den Benutzer anzeigen, der das System zuletzt aus jeder Abteilung aktualisiert hat.
Update Time User Department Last update
-------------------------------------------------------
1/19/12 7:26 John A
1/19/12 6:26 Yen A
1/18/12 9:47 Jefta B
1/18/12 9:47 Jefta B
1/18/12 9:47 John A
Antwort1
WENN ich Ihre Frage richtig verstehe und dies in Excel ist, könnten Sie eine „Array-Formel“ verwenden.
Wenn sich Ihr Datensatz beispielsweise in einem Arbeitsblatt im Bereich A1:C5 befindet, können Sie Folgendes in Spalte „D“ verwenden:
{=INDIRECT("B" & MATCH(MAX(IF(C$1:C$5=C1,(A$1:A$5),)),A$1:A$5,0))}
Diese Formel erstellt dynamisch die Zellreferenz, die auf den erforderlichen Benutzernamen verweist, indem sie die Zeilennummer für die Zeile zurückgibt, in der das maximale Datum gefunden wird, jedoch nur für die Zeilen, in denen der Abteilungswert mit dem Wert dieser Zeile in Spalte „C“ (der Abteilungsspalte) übereinstimmt, und sie an das Textzeichen „B“ (die Spalte, die die Benutzernamen enthält) anhängt und so die vollständige Zellreferenz „Buchstabe+Zahl“ erstellt.
Beachten Sie, dass dies eine Array-Funktion sein muss. Das bedeutet, dass Sie beim Verlassen der Zelle nach dem Eintippen der Formel Ctrl+ Shift+ gedrückt Enterhalten müssen, anstatt wie üblich einfach die Eingabetaste zu drücken. Wenn Sie es richtig machen, wird die Formel in geschweifte Klammern gesetzt, wie oben gezeigt. Wenn die Formel nicht in geschweifte Klammern gesetzt ist, ist sie nicht als Array-Formel eingerichtet und funktioniert nicht richtig.
Es gibt hierfür möglicherweise einen einfacheren oder eleganteren Weg, aber wenn Sie einfach nur eine schnelle und einfache Lösung benötigen, funktioniert dies.
Wenn Sie ausführlichere Erklärungen benötigen, kann ich Ihnen weitere Einzelheiten liefern.
Antwort2
Bin zurückgekommen und habe gesehen, dass noch niemand eine VBA-Lösung gepostet hat. Ich dachte, ich stelle mal eine zur Verfügung.
'indexes of the values stored as an array in the collection object Private Const USERNAME As Integer = 0 Private Const DATETIME As Integer = 1
'references to where the data is or should be in the workbook Public Enum DataColumns DateTimeStamp = 1 UName = 2 Department = 3 LastUpdater = 4 'The information we will be adding! End Enum
Sub Main() Dim lastUserByDept As Collection Set lastUserByDept = GetLastUpdater(2) AppendLastUserName 2, lastUserByDept End Sub
'//Builds a collection of department entries, and stores '//the last date along with the user tied to that date Private Function GetLastUpdater(dataStartRow As Long) As Collection Dim currRow As Integer: currRow = dataStartRow
Dim maxDatesByDept As Collection Set maxDatesByDept = New Collection Dim deptInfo As Variant Do While Not IsEmpty(Cells(currRow, DataColumns.DateTimeStamp)) Dim dept As String: dept = Cells(currRow, DataColumns.Department).Value If DeptExists(maxDatesByDept, dept) Then If Cells(currRow, DataColumns.DateTimeStamp).Value > maxDatesByDept.Item(dept)(DATETIME) Then deptInfo = Array(Cells(currRow, DataColumns.UName).Value, Cells(currRow, DataColumns.DateTimeStamp).Value) UpdateExistingEntry maxDatesByDept, deptInfo, Cells(currRow, DataColumns.Department) End If Else deptInfo = Array(Cells(currRow, DataColumns.UName).Value, Cells(currRow, DataColumns.DateTimeStamp).Value) maxDatesByDept.Add deptInfo, Cells(currRow, DataColumns.Department).Value End If currRow = currRow + 1 Loop Set GetLastUpdater = maxDatesByDept Set maxDatesByDept = Nothing
End Function
'//Since we are using the VBA collection object, there is no true '//test for if an element exists; the collection will just throw '//an error if you ask it for something it cannot find, so just '//trap the error and return false in that case, as it means no '//item was found in the list with that dept as it's key Private Function DeptExists(ByRef deptList As Collection, dept As String) As Boolean On Error GoTo handler deptList.Item dept DeptExists = True Exit Function handler: Err.Clear DeptExists = False End Function
'//Updates an existing entry in our collection of dept users. '//Note: this implementation allows for the trapping of failed attempts '//but is not used in this version to keep it as straight-forward as '//possible - If it was important to know when such attempts failed, you '//could trap on the return value of this method and take the appropriate '//action. Private Function UpdateExistingEntry(ByRef deptList As Collection, ByVal deptInfo As Variant, ByVal dept As String) As Boolean On Error GoTo handler
If DeptExists(deptList, dept) Then deptList.Remove dept deptList.Add deptInfo, dept UpdateExistingEntry = True Else UpdateExistingEntry = False End If Exit Function
handler: Err.Clear UpdateExistingEntry = False End Function
'//Uses the created collection of dept, username to add the '//required username to the column Private Sub AppendLastUserName(dataStartRow As Long, deptListing As Collection) Dim currRow As Integer: currRow = dataStartRow Do While Not IsEmpty(Cells(currRow, DataColumns.DateTimeStamp)) Dim currDept As String: currDept = Cells(currRow, DataColumns.Department) Cells(currRow, DataColumns.LastUpdater).Value = deptListing(currDept)(USERNAME) currRow = currRow + 1 Loop End Sub
Dieser Code platziert den Benutzernamen der letzten Person, die das System im Kontext der Abteilung aktualisiert hat.
Beachten Sie, dass einige Dinge vorausgesetzt werden, z. B. die Spaltenpositionen. Es wird eine Aufzählung verwendet, um auf die relevanten Spalten zu verweisen, sodass Sie sie auf die richtigen Spaltenindizes verweisen können, wenn sie vom Beispiel abweichen, und alles sollte wie erwartet funktionieren. Es wird auch angenommen, dass die Spalte mit dem Datumsstempel keine Lücken aufweist und immer ein Datum ist.
Kopieren Sie den gesamten Codesatz und fügen Sie ihn in ein einzelnes Modul in Excel ein. Dann funktioniert es problemlos.