online 1
gast (50)

/ Forum / Tabellenkalkulation

TabellenkalkulationTabellenkalkulation

Fragevon ponscho vom 27.02.2020, 23:46 Options

Lösung

Export in Textdatei, wie bekomme ich bei fester Spaltenbreite den Text linksbündig?

Hallo ihr Lieben!

ich sitze fast den ganzen Tag an folgendem Code um den Text in der Ausgabe linksbündig zu bekommen.
Auch möchte ich die Anführungszeichen am Anfang und Ende einer Zeile entfernen.
Aber letzteres könnte ich mit suchen und ersetzen lösen.

In diesem VBA-Code wird eine Tabelle in eine Textdatei ausgegeben mit festen Spaltenbreiten.

Könnt ihr mir helfen? Wo liegt der Fehler?

internette grüsse
ponscho


Option Explicit

Sub speichern_als_textdatei()
    Dim i As Long, n As Long
    Dim colCount As Integer, rowCount As Integer
    Dim f1L As Integer, f2L As Integer, f3L As Integer, f4L As Integer
    Dim myExportFile As String, exportStr As String, tmpStr As String
    Dim myStart As Date, myEnd As Date
    myExportFile = "D:\Demo.txt"
    Close #1
    Open myExportFile For Output As #1
    'Schleifenbegrenzungen definieren
    'Anzahl Zeilen
    rowCount = Cells(Rows.Count, 4).End(xlUp).Row
    'Anzahl Spalten zum exportieren
    colCount = 4
    'Länge der jeweiligen Datenfelder in Anzahl Zeichen
    'Wie sie in der Exportdatei stehen sollen
    f1L = 8
    f2L = 8
    f3L = 31
    f4L = 60
    exportStr = ""
    'Zeitkontrolle
    myStart = Now
    Debug.Print myStart
    'Feld-Überschriften exportieren
    'hier Zeile 1
    For i = 1 To colCount
        exportStr = exportStr & "" & Cells(1, i) & ""
    Next i
    Write #1, exportStr
    'Zeilenschleife
    'beginnt ab Zeile 3
    For i = 3 To rowCount
        exportStr = ""
        'Spaltenschleife
        tmpStr = ""
        'Für Feld1 z.B. mit Leerzeichen auffüllen
        For n = 1 To f1L - Len(Cells(i, 1))
            tmpStr = tmpStr & " "
        Next n
        exportStr = exportStr & "" & tmpStr & Cells(i, 1).Text
        tmpStr = ""
        'Für Feld 2 z.B. mit Underline auffüllen
        For n = 1 To f2L - Len(Cells(i, 2))
            tmpStr = tmpStr & " "
        Next n
        exportStr = exportStr & "" & tmpStr & Cells(i, 2)
        tmpStr = ""
        'Für Feld 3 z.B. mit 0 (Null) auffüllen
        For n = 1 To f3L - Len(Cells(i, 3))
            tmpStr = tmpStr & " "
        Next n
        exportStr = exportStr & "" & tmpStr & Cells(i, 3)
        tmpStr = ""
        'Für Feld 2 z.B. mit Underline auffüllen
        For n = 1 To f4L - Len(Cells(i, 4))
            tmpStr = tmpStr & " "
        Next n
        exportStr = exportStr & "" & tmpStr & Cells(i, 4)
        tmpStr = ""
       
        'Schreiben in die Datei
        Write #1, exportStr & ""
    Next i
    Close #1
    Debug.Print Now
    Debug.Print Format(Now - myStart, "hh:mm:ss")
    MsgBox "erfolgreich gespeichert!"
End Sub


Antwort schreiben

Antwort 1 von Flupo vom 28.02.2020, 07:36 Options

Warum so aufwändig?
Probier mal
Zitat:
ActiveWorkbook.SaveAs Filename:="dateiname.txt", _
FileFormat:=xlTextMSDOS, CreateBackup:=False


Gruß Flupo

Antwort 2 von ponscho vom 28.02.2020, 07:57 Options

guten morgen Flupo und an alle,

schon wach?

ich möchte mich nicht mit fremden lorbeeren schmücken, diesen code habe ich über googeln gefunden.
ich habe ledeglich ein paar sachen meinen bedürfnissen durch rumprobieren angepasst.
mein wissen an vba ist sehr beschränkt.

wenn ich den teil
 ActiveWorkbook.SaveAs Filename:="dateiname.txt", _
FileFormat:=xlTextMSDOS, CreateBackup:=False

richtig deute, dann soll er mit diesem code das ganze tabellenblatt in eine texdatei exportieren? oder missverstehe ich das? und wo kommt dieser teil hin?

wenn dem so ist, soll er das nicht. er soll nur bestimmte spalten und zeilen in eine textdatei umwandeln.
am liebsten wäre es mir natürlich, wenn er mich vorher fragen würde welchen bereich ich als textdatei möchte, das aber wäre zuviel des guten.

auch ist das problem mit linksbündig nicht gelöst, oder doch?

internette grüsse
ponscho

Antwort 3 von KJG17 vom 28.02.2020, 08:23 Options

Moin,

das Problem könnte u.U. hier liegen:
Zitat:
Dim f1L As Integer, f2L As Integer, f3L As Integer, f4L As Integer

Variablen deklariert man mit Hilfe der Dim Anweisung, der Angabe des Bezeichners und des Datentyps:

Dim Text As String (Zeichenkette, linksbündig)
Dim Wert As Integer (Ganzzahl, rechtsbündig)

Gruß
Kalle

Antwort 4 von ponscho vom 28.02.2020, 08:44 Options

auch dir einen guten morgen kalle,

muss ich dann dieses

Zitat:
Dim f1L As Integer, f2L As Integer, f3L As Integer, f4L As Integer

in

Dim f1[b]R[/b] As Integer, f2[b]R[/b] As Integer, f3[b]R[/b] As Integer, f4[b]R[/b] As Integer

also in R für rechts ändern?

ich weiss, fragen eines dummen anfängers ;o)

und wo kommt dieser abschnitt hin

Zitat:
Dim Text As String (Zeichenkette, linksbündig)
Dim Wert As Integer (Ganzzahl, rechtsbündig)

und wie müsste er richtig aussehen?

internette grüsse
ponscho

Antwort 5 von Flupo vom 28.02.2020, 09:33 OptionsLösung

Lösung
Zitat:
dann soll er mit diesem code das ganze tabellenblatt in eine texdatei exportieren? oder missverstehe ich das?


Genauso isses.
Wenn's nicht passt, brauchen wir hierüber nicht weiter schwafeln.

Was KJG17 vorschlägt, ist aus den Zahlenvariablen Zeichenketten zu machen.

Aus
Dim f1L As Integer, f2L As Integer, f3L As Integer, f4L As Integer

würde dann
Dim f1L As String, f2L As String, f3L As String, f4L As String

Das ist aber auch keine Lösung für das Problem da hier nur die Längen der einzelnen Spalten in der Exportdatei definiert werden.

M.E. liegt die Ursache für das Problem in diesen Zeilen:
    exportStr = exportStr & "" & tmpStr & Cells(i, 1).Text

In der Variablen exportstr werden die einzelnen Zellen einer Zeile gesammelt.
Schema: Füllzeichen(Variable tmpStr) + Zellinhalt
Die Füllzeichen werden also immer vor dem Zellinhalt eingefügt.
Wenn du die Reihenfolge in
exportStr = exportStr & "" & Cells(i, 1).Text& tmpStr 

änderst, werden die Füllzeichen hinter dem Zellinhalt eingefügt.

Die Schleife
    For i = 1 To colCount
        exportStr = exportStr & "" & Cells(1, i) & ""
    Next i

Ist völlig überflüssig und kann entfallen.

Gruß Flupo

Antwort 6 von ponscho vom 28.02.2020, 10:14 Options

astrein, ihr seid einfach klasse !!!

habe es so geändert
exportStr = exportStr & "" & Cells(i, 1).Text& tmpStr

nur bei "Text&" habe ich ein leerzeichen zwischen "Text" und "&" eingefügt sonst hätte es nicht funktioniert.

nur noch eine abschliessende frage:
wie definiere ich in diesem abschnitt für die überschrift
'Feld-Überschriften exportieren
    'hier Zeile 1
    For i = 1 To colCount
        exportStr = exportStr & "" & Cells(1, i) & ""
    Next i
    Write #1, exportStr

welche zellen er mir übertragen soll?

hätte gerne die zellen A1:C1 als überschrift...

internette grüsse
ponscho

Antwort 7 von Flupo vom 28.02.2020, 13:05 Options

Zitat:
nur bei "Text&" habe ich ein leerzeichen zwischen "Text" und "&" eingefügt sonst hätte es nicht funktioniert.


Das Leerzeichen ist dem drag&drop hier im Supportnet zum Opfer gefallen. ;-)

Das mit den Feld-Überschriften sollte so schon (fast) richtig sein. Es fehlen nur wieder die Füllzeichen pro Spalte.
Meine Bemerkung oben rührt daher, dass ich in diesen Zellen nichts drin habe.
So wie der Code jetzt aufgebaut ist, schreibt er die Inhalte der Zellen A1 bis D1 (colCount=4) ohne irgendwelche Trennzeichen in die erste Zeile.

Mit Füllzeichenberücksichtigung sieht das Ganze dann so aus:
    'Feld-Überschriften exportieren
    'hier Zeile 1
    For i = 1 To colCount
        Select Case i
        Case 1, 2
            x = 8
        Case 3
            x = 31
        Case 4
            x = 60
        End Select
        For n = 1 To x - Len(Cells(1, i))
            tmpStr = tmpStr & " "
        Next n
        exportStr = exportStr &  Cells(1, i).Text  & tmpStr
    Next i
    Write #1, exportStr

Nicht vergessen die neue Variable x oben als Integer zu deklarieren.
Die Deklaration kannst du übrigend noch etwas vereinfachen:
    Dim i, n As Long
    Dim colCount, rowCount, f1L, f2L, f3L, f4L, x As Integer
    Dim myExportFile, exportStr, tmpStr As String
    Dim myStart, myEnd As Date


Gruß Flupo

Antwort 8 von ponscho vom 28.02.2020, 16:40 Options

superklasse !!!

jetzt funktioniert es so wie ich es möchte.

vielen, vielen dank!

ich hoffe mir geht das VBA schreiben auch mal so von der hand.

internette grüsse
ponscho

Antwort 9 von Flupo vom 28.02.2020, 17:52 Options

Kleiner Tipp noch: Ich habe mir ein bisschen VBA angeeignet, indem ich die gewünschten Aktionen aufgezeichnet (geht in deinem Fall natürlich eher schlecht) und dann den Code analysiert habe.
So treten jede Menge Fragen auf, die zumeist mit der (leider standardmäßig nicht installierten) VBA-Onlinehilfe zu klären waren.

Ich fand die Onlinehilfe übrigend bis Office97 deutlich besser und aussagekräftiger. Auf Arbeit haben wir jetzt OfficeXP und zuhause 2003. Das gefällt mir nicht mehr so gut.

Gruß Flupo

Ähnliche Themen

export-ntdll.dll
rw1978  31.07.2007 - 178 Hits - 1 Antwort

ICQ - Text falsch ausgerichtet
Ecki..  03.01.2008 - 28 Hits - 1 Antwort

Textdatei Analysieren
Ralfman  19.04.2008 - 57 Hits - 2 Antworten

gescannter Briefes in eine Textdatei umwandeln
Sue_S.  15.05.2008 - 75 Hits - 20 Antworten

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Thu Jan 8 21:07:44 2026