Supportnet / Forum / Tabellenkalkulation
Export in Textdatei, wie bekomme ich bei fester Spaltenbreite den Text linksbündig?
Frage
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
[code]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[/code]
Antwort 1 von Flupo
Warum so aufwändig?
Probier mal
Gruß Flupo
Probier mal
Zitat:
ActiveWorkbook.SaveAs Filename:="dateiname.txt", _
FileFormat:=xlTextMSDOS, CreateBackup:=False
ActiveWorkbook.SaveAs Filename:="dateiname.txt", _
FileFormat:=xlTextMSDOS, CreateBackup:=False
Gruß Flupo
Antwort 2 von ponscho
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
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
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:=Falserichtig 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
Moin,
das Problem könnte u.U. hier liegen:
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
das Problem könnte u.U. hier liegen:
Zitat:
Dim f1L As Integer, f2L As Integer, f3L As Integer, f4L As Integer
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
auch dir einen guten morgen kalle,
muss ich dann dieses
in
also in R für rechts ändern?
ich weiss, fragen eines dummen anfängers ;o)
und wo kommt dieser abschnitt hin
und wie müsste er richtig aussehen?
internette grüsse
ponscho
muss ich dann dieses
Zitat:
Dim f1L As Integer, f2L As Integer, f3L As Integer, f4L As Integer
Dim f1L As Integer, f2L As Integer, f3L As Integer, f4L As Integer
in
Dim f1R As Integer, f2R As Integer, f3R As Integer, f4R As Integeralso 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)
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
Zitat:
dann soll er mit diesem code das ganze tabellenblatt in eine texdatei exportieren? oder missverstehe ich das?
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 Integerwürde dann
Dim f1L As String, f2L As String, f3L As String, f4L As StringDas 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
astrein, ihr seid einfach klasse !!!
habe es so geändert
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
welche zellen er mir übertragen soll?
hätte gerne die zellen A1:C1 als überschrift...
internette grüsse
ponscho
habe es so geändert
exportStr = exportStr & "" & Cells(i, 1).Text& tmpStrnur 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, exportStrwelche zellen er mir übertragen soll?
hätte gerne die zellen A1:C1 als überschrift...
internette grüsse
ponscho
Antwort 7 von Flupo
Zitat:
nur bei "Text&" habe ich ein leerzeichen zwischen "Text" und "&" eingefügt sonst hätte es nicht funktioniert.
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
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
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
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
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

