Datenexport in Textdatei mit Print

Mit Excel und VBA Daten berechnen ist ja schon ganz nett, aber wie bekomme ich die Daten wieder aus der Exceldatei heraus? Am besten als Text-Datei (Export.txt)?
Ich habe verschiedene Ansätze getestet und möchte Sie hier kurz vorstellen.

Macro-Recorder und ActiveWorkbook.SaveAs

Wenn alle Daten in einem Tabellenblatt liegen, kann man sie besonders leicht mit Datei -> Speichern Unter -> Dateityp -> Text als Textdatei exportieren. In einem Macro mit VBA könnte das so aussehen:

Sub ExportMitSaveAsTxt()
    'Datei als txt-Datei speichern
    ThisWorkbook.SaveAs Filename:="C:\Export.txt", FileFormat:=xlText
    'ExcelDatei wieder öffnen / Alternativ: Thisworkbook.SaveAs...."Export.xls"...
    Workbooks.Open ("C:\Export.xls")
    ThisWorkbook.Close savechanges:=False
End Sub

Code eingefügt mit Syntaxhighlighter 4.15

Oder auch so:

Sub ExportMitSaveAsTxt2()
    ThisWorkbook.SaveAs Filename:="C:\Export.txt", FileFormat:=xlText
    ThisWorkbook.SaveAs Filename:="C:\Export.xls", FileFormat:=xlNormal
End Sub

Code eingefügt mit Syntaxhighlighter 4.15

Wirklich überzeugend ist diese Lösung nicht. Erst die Datei speichern und dann die Excel-Datei wiederherstellen (sei es mit open oder erneutem SaveAs). Deswegen hier ein anderer Ansatz.

Datenexport mit Print und Open File For Output

Bei diesem Ansatz wird der genutzte Bereich des Tabellenblatts (ActiveSheet.UsedRange) mit der Print-Methode in eine neue Textdatei geschrieben.

Sub ExportMitPrint()
    Dim rng As Range, c As Range
    Dim row As Long, col As Long

    Set rng = ActiveSheet.UsedRange
    Open "C:\Export.txt" For Output As #1
    For row = 1 To rng.rows.Count
        For col = 1 To rng.Columns.Count - 1
            'Daten schreiben und weiter in gleicher Spalte
            Print #1, Format(rng(row, col), "0.00"); Tab;
        Next
        'Daten schreiben und weiter in nächster Spalte
        Print #1, Format(rng(row, col), "0.00")
    Next
    Close #1
End Sub

Code eingefügt mit Syntaxhighlighter 4.15

Leider dauert dieser Export deutlich länger als folgende Lösung:

Datenexport mit Print und Open File For Output und Variant

Der Zugriff auf die Daten mit dem Range-Object rng ist nicht gerade optimal. Besser ist es die Daten in eine Variable mit Typ Variant (hier: var) zu speichern. Die Daten liegen nun als Datenfeld vor und können schnell ausgelesen werden.

Sub ExportMitPrintVar()
    Dim var As Variant
    Dim row As Long, col As Long

    'kein Set verwenden!!!
    var = ActiveSheet.UsedRange
    Open "C:\Export.txt" For Output As #1
    For row = 1 To UBound(rng, 1)
        For col = 1 To UBound(rng, 2) - 1
            'Daten schreiben und nächste Spalte
            Print #1, Format(var(row, col), "0.00"); Tab;
        Next
        Print #1, Format(var(row, col), "0.00")
    Next
    Close #1
End Sub

Code eingefügt mit Syntaxhighlighter 4.15

Offensichtlich ist die Lösung mit Variant mal wieder die schnellste. Bei der SaveAs-Variante kann es zusätzlich bei großen Dateien zu sehr langen Speichervorgängen kommen.

Deswegen: FINGER WEG VON SAVE AS!!!

Your rating: Keine Average: 4.5 (2 votes)