Eine Textdatei kann man leider nicht direkt von hinten nach vorne lesen. Manchmal ist das ein Problem. Bleiben wir beim Paradebeispiel, Logging. Bei Logging möchte man meist die neusten Einträge einer Protokolldatei (also die letzten) zuerst lesen und sich dann zu den ältesten vorarbeiten. Eine solche Datei könnte folgendermaßen aussehen: Logging Value Date Status NochnWert LG-00-abc 54872 19.03.2010 OK klausmaus LG-09-HALLOabc 00100 20.03.2010 OK hansfranz PQ-77-MoinServus 00000 21.03.2010 Failed nickklick OK-09-Xyz 00100 30.03.2010 OK spassmaus FG-59-Lollo 00100 01.04.2010 OK hippipipi Eine Methode, die man wahrscheinlich nutzt, wenn man mal eben schnell etwas programmieren muss, damit es einfach nur funktioniert. Man macht einfach die Ausgabe Schleife des, mit den Lines versehenen Arrays Rückwärts: For i = Ubound(arrFileLines) to LBound(arrFileLines) Step -1 Debug.Print arrFileLines(i) Next i Das ist aber nicht schön, wenn man das Array mehrmals nutzen möchte, oder sogar an andere Funktionen übergeben muss. Deshalb habe ich hier zwei Varianten, eine werdet ihr bestimmt kennen und schon das ein oder andere Mal genutzt haben, die andere wohl eher nicht. Variante 1: Public Function ReadFileBackward_V1( _ ByRef arrFileLinesTurn() As String, _ ByVal strFile As String, _ ByVal blnWithHeader As Boolean) Dim arrFileLines() As String Dim lngCount As Long Dim lngBackward As Long Dim lngForward As Long Dim lngSize As Long Dim objFSO As Object Dim objFile As Object ' Fehlerbehandlung aktivieren On Error GoTo ErrHandler ' Laufparameter für das Redimensionieren des Arrays arrFileLines lngCount = 0 ' Verweis auf das FileSystemObject erstellen Set objFSO = CreateObject("Scripting.FileSystemObject") ' Existiert die Datei überhaupt? If objFSO.FileExists(strFile) Then ' Datei zum Lesen öffnen Set objFile = objFSO.OpenTextFile(strFile, 1) Do Until objFile.AtEndOfStream ' Array redimensionieren ReDim Preserve arrFileLines(lngCount) ' Zeile einlesen und in das Array speichern arrFileLines(lngCount) = objFile.Readline ' Erhöhung des Laufparameter lngCount = lngCount + 1 Loop objFile.Close ' Laufparameter für das Redimensionieren des Arrays arrFileLinesTurn lngForward = 0 If blnWithHeader = False Then ' Array auf die gleiche Größe redimensionieren ReDim Preserve arrFileLinesTurn(UBound(arrFileLines)) lngSize = LBound(arrFileLines) Else ' Array auf die gleiche Größe -1 redimensionieren ReDim Preserve arrFileLinesTurn(UBound(arrFileLines) - 1) lngSize = LBound(arrFileLines) + 1 End If For lngBackward = UBound(arrFileLines) To lngSize Step -1 ' Array füllen arrFileLinesTurn(lngForward) = arrFileLines(lngBackward) ' Erhöhung des Laufparameter lngForward = lngForward + 1 Next End If ErrHandler: ' Objekte zerstören Set objFile = Nothing Set objFSO = Nothing End Function Variante 2: ' Diese Funktion benötigt das .NET Framework 1 oder höher !!! Public Function ReadFileBackward_V2( _ ByRef arrFileLinesTurn() As String, _ ByVal strFile As String, _ ByVal blnWithHeader As Boolean) Dim lngForward As Long Dim strTmp As String Dim sysColStack As Object Dim objFSO As Object Dim objFile As Object ' Fehlerbehandlung aktivieren On Error GoTo ErrHandler ' Verweis auf das FileSystemObject erstellen Set objFSO = CreateObject("Scripting.FileSystemObject") ' Existiert die Datei überhaupt? If objFSO.FileExists(strFile) Then ' Datei zum Lesen öffnen Set objFile = objFSO.OpenTextFile(strFile, 1) ' System.Collections.Stack erstellen Set sysColStack = CreateObject("System.Collections.Stack") Do Until objFile.AtEndOfStream ' Zeile einlesen und in das Array speichern sysColStack.push objFile.Readline Loop ' Datei schließen objFile.Close ' Laufparameter für das Redimensionieren des Arrays arrFileLinesTurn lngForward = 0 ' Array auf die Größe des Stacks redimansionieren ReDim arrFileLinesTurn(IIf(blnWithHeader = True, _ sysColStack.Count, sysColStack.Count - 1)) Do Until sysColStack.Count = IIf(blnWithHeader = True, 0, 1) ' Array füllen arrFileLinesTurn(lngForward) = sysColStack.pop ' Erhöhung des Laufparameter lngForward = lngForward + 1 Loop End If ErrHandler: ' Objekte zerstören Set objFile = Nothing Set objFSO = Nothing End Function Aufrufbeispiel: Dim arrFileLinesTurn() As String Dim blnWithHeader As Boolean Dim strFile As String Dim i As Long strFile = "C:\log.txt" ' mit oder ohne erste Zeile blnWithHeader = False Call ReadFileBackward_V1(arrFileLinesTurn, strFile, blnWithHeader) For i = 0 To UBound(arrFileLinesTurn) Debug.Print arrFileLinesTurn(i) Next i Call ReadFileBackward_V2(arrFileLinesTurn, strFile, blnWithHeader) For i = 0 To UBound(arrFileLinesTurn) Debug.Print arrFileLinesTurn(i) Next i |