vba ein text datei auslesen?


13.05.2024, 05:37

Vielen Dank im Voraus!!!

1 Antwort

Ich hab es jetzt mal so gemacht, dass ich eine Tabelle (nicht Tabellenblatt) erstellt hab, wo alle Daten aus der Textdatei eingelesen werden. Dann kann man sie später einfach mit XVerweis in deiner Liste suchen lassen. Die Tabelle erstellst du, indem du irgendwo die Überschriften und einen Datensatz hinschreibst, dann die Tabelle markierst und Strg+T drückst.

In meinem Beispiel hab ich eine Tabelle namens "Suchdaten" mit den Spalten "Key" und "Value" erstellt. Achte auch drauf, dass die Zellen alle als Text formatiert sind, sonst wandelt Excel die Zahlen beim Einlesen in 8,88888e+22 oder sowas um.

Bild zum Beitrag

Die Daten aus der Textdatei kannst du mit diesem Makro in die Tabelle laden

Option Explicit

Public Sub DatenSuchen()
    ' Alles aus der Textdatei einlesen
    Dim inhalt As String
    Open "C:\temp\ExcelImport.txt" For Input As #1
    Do Until EOF(1)
        Dim textline As String
        Line Input #1, textline
        inhalt = inhalt & textline
    Loop
    Close #1
    
    ' Daten in ein Array laden
    Dim rohDaten() As String
    rohDaten = Split(inhalt, "   ")
    
    ' Daten in Tabelle laden, um damit besser arbeiten zu können
    Dim i As Integer, suchDaten As ListObject
    Set suchDaten = Range("Suchdaten").ListObject
    
    If Not suchDaten.DataBodyRange Is Nothing Then
        suchDaten.DataBodyRange.Delete
    End If
    
    For i = 0 To UBound(rohDaten) Step 2
        Dim newListRow As ListRow
        Set newListRow = suchDaten.ListRows.Add
        newListRow.Range(1, 1) = rohDaten(i)
        newListRow.Range(1, 2) = rohDaten(i + 1)
    Next i
End Sub

Und die Suche geht mit XVerweis. Beispielhaft für B2:

=XVERWEIS(A2;Suchdaten[Key];Suchdaten[Value];"nicht vorhanden")

Das kannst du dann einfach runterkopieren

Ich hab dir mal meine Test-Excel auf Github hochgeladen, damit du es dir dort abschauen kannst: TextdateiSuche.xlsm

 - (Microsoft, VBA)

Vikinteresse 
Fragesteller
 13.05.2024, 21:22

Guten Abend daCypher,

vielen Dank für die ausführliche und schnelle Antwort. Ich habe diese Funktion (XVERWEIS) bereits ausprobiert, aber leider hat es nicht wirklich funktioniert. Mein Problem ist, dass diese Datei sehr groß ist und sobald ich in Excel mit Formeln arbeite, will Excel nicht mehr...es dauert sehr lange (wegen der Berechnung ..unten rechts in Excel) Deshalb dachte ich, dass man die Daten aus der Textdatei direkt per Makro einlesen könnte. 

Viele Grüße

0
daCypher  14.05.2024, 07:35
@Vikinteresse

Ok. Ich hab dir die Funktion mal so umgeschrieben, dass sie die Werte direkt sucht und einfügt ohne den Umweg über einen XVerweis. Ich bezweifle aber, dass das wesentlich schneller ist, weil es in VBA keine HashMaps oder sowas gibt, wo man schnell drin suchen kann. Die Suche geht halt jeden Wert aus der Textdatei einzeln durch.

Option Explicit

Public Sub DatenSuchen()
    ' Alles aus der Textdatei einlesen
    Dim inhalt As String
    Open "C:\temp\ExcelImport.txt" For Input As #1
    Do Until EOF(1)
        Dim textline As String
        Line Input #1, textline
        inhalt = inhalt & textline
    Loop
    Close #1
    
    ' Daten in ein Array laden
    Dim rohDaten() As String
    rohDaten = Split(inhalt, "   ")
    
    ' Daten in ein zweidimensionales Array schreiben
    ReDim daten(0 To UBound(rohDaten), 0 To 1) As String
    Dim i As Integer
    
    For i = 0 To UBound(rohDaten) Step 2
        daten(i / 2, 0) = rohDaten(i)
        daten(i / 2, 1) = rohDaten(i + 1)
    Next i
    
    ' Werte aus Spalte A in Daten suchen und nach B schreiben
    Dim tabellenbereich As Range, zeile As Variant
    Set tabellenbereich = Intersect(ActiveSheet.UsedRange, ActiveSheet.Range("A:B"))
    
    For Each zeile In tabellenbereich.Rows
        Dim suchWert As String
        Dim gefundenerWert As String
        suchWert = zeile.Columns(1)
        gefundenerWert = "nicht vorhanden"
        
        ' Wert in Array suchen
        For i = 0 To UBound(daten, 1)
            If daten(i, 0) = suchWert Then
                gefundenerWert = daten(i, 1)
                Exit For
            End If
        Next i
        zeile.Columns(2) = gefundenerWert
    Next zeile
End Sub

Wenn die Excel-Datei zu groß wird, solltest du auch überlegen, ob es nicht Sinn macht, auf ein Datenbanksystem umzusteigen. Die sind extra dafür gemacht, in großen Datenmengen rumzuwühlen und passende Einträge zueinander zu bringen.

Vielleicht reicht es auch schon, die Excel auf mehrere Excel-Dateien aufzuteilen, damit die einzelnen Dateien jeweils schneller arbeiten, als wenn du einen großen monolithischen Block hast.

0
Vikinteresse 
Fragesteller
 15.05.2024, 23:06
@daCypher

Das war eine sehr gute Idee von dir "Excel auf mehrere Excel-Dateien aufzuteilen..." Ich habe das jetzt gemacht und es klappt mit xVerweis Formel sehr gut. Danke für deine Unterstützung!!!

1