Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1312to1316
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Exelblatt als txt exportieren

Exelblatt als txt exportieren
18.05.2013 20:14:46
Bubble
Hallo liebe Exel Experten,
mein Ziel ist es aus einer Exelmappe (xlsm-Format) mit mehreren Arbeitsblättern, das gerade aktivierte als txt-Datei mit Tabstop Trennung zu exportieren. Da ich mich mit VBA nicht wirklich gut auskenne, habe ich ein anderes Makro als Vorlage genommen, welches wunderbar funktioniert und es versucht etwas umzubauen.
Das Original speichert die komplette Exelmappe mit Makros unter einem anderen Namen,(aber dem selben Pfad wie das Original) der sich aus dem Inhalt einer Zelle ergibt und wechselt dann auf das erste Blatt, der soeben gespeicherten Datei.
Sub DIFF_export()
ActiveSheet.SaveAs ThisWorkbook.Path & "\" & Range("E10"), FileFormat:=xlText
' ermittelt den pfad der aktuell geöffneten Datei und fügt den neuen Namen hinzu und  _
speichert als txt
ActiveWorkbook.Sheets(1).Select
Range("E4").Select
' geht zurück zu der Tabelle aus der heraus gespeichert wird
MsgBox "Die Überstunden wurde gespeichert unter dem Name:" & vbLf & vbLf & Sheets("Export"). _
_
_
Range("E10").Text & vbLf & vbLf & "Datei kann im nächsten Monat importiert werden.", , " _
Speichern erfolgreich"
' Gibt ein Fenster aus, in dem nochmal der Erfolg und der Dateiname bestätigt werden
End Sub
In der Zelle E10 des Blattes steht zum Beispiel "Diff_05_2013.txt", die soll der Dateiname sein. Ich habe zuerst den Makrorecorder laufen lassen und das Blatt als txt abgespeichert. Da kam folgendes heraus:
ChDir "E:\Eigene Dateien\mein Pfad"
ActiveWorkbook.SaveAs Filename:= _
"E:\Eigene Dateien\Eigene Dokumente\mein Pfad\Dplan Vorlage.txt", _
FileFormat:=xlText, CreateBackup:=False
Daraufhin habe ich mit dem FileFormat:=xtText experimentiert, aber es klappt nicht. Momentan gibt es immer einen 1004 Laufzeitfehler. Weiterhin möchte ich nicht das die erzeugte txt-Datei geöffnet wird, sondern das ich wieder auf dem Blatt lande, aus dem ich vorher exportiert habe.
Vielen dank im Voraus für Eure Hilfe
Bubble

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Exelblatt als txt exportieren
18.05.2013 22:15:43
Belloth
Hi Bubble,
bitte lies mal die Excel-Hilfe für die ".Saveas" Anweisung. Da findest du deine zwei Fehler:
1. Dem Dateipfad/namen muss "Filename:=" vorangestellt werden.
2. Für die "Fileformat:=" Zuweisung brauchst du einen gültigen "xlFileFormat"-Wert z.b.
xlTextMac oder 19 (Macintosh-Text)
xlTextMSDOS oder 21 (MSDOS-Text)
xlTextPrinter oder 36 (Druckertext)
xlTextWindows oder 20 (Windows Text)
xlUnicodeText oder 42(Unicode Text)
"xltext" ist kein gültige Format
Melde dich wenn noch ein weiteres Problem auftaucht.
Gruss Flock

teils teils
19.05.2013 01:07:02
Erich
Hi,
bei 1. muss ich mal widersprechen, bei 2. stimme ich zu.
Alle vier Anweisungen funktionieren:

ActiveSheet.SaveAs Filename:=ThisWorkbook.Path & "\" & Range("E10"), FileFormat:=xlTextMSDOS
ActiveSheet.SaveAs ThisWorkbook.Path & "\" & Range("E10"), FileFormat:=xlTextMSDOS
ActiveSheet.SaveAs ThisWorkbook.Path & "\" & Range("E10"), xlTextMSDOS
ActiveSheet.SaveAs ThisWorkbook.Path & "\" & Range("E10"), xlTextWindows
Solange man die Parameter vollständig und in der richtigen Reihenfolge angibt, kann man die Bezeichner weglassen.
xlText gibt es lt. Objektkatalog nur als XlPivotFieldDataType. Das ist sicher kein Dateiformat.
'Bubble', Woher hattest du 'xlText'?
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: teils teils
19.05.2013 02:19:50
Bubble
Zuerst Danke für die schnellen antworten!
Zur Frage von Erich, ich habe den Makrorecorder benutzt. Nachdem ich die Aufzeichnung gestartet hatte im Recorder, bin ich links oben auf die Office Schaltfläche, dann auf "Speichern unter", danach auf "andere Formate". Dann hat sich ein Fenster geöffnet, an der Stelle kann man den Namen der zu speichernden Datei eingeben und den Typ festlegen. Da habe ich dann die Elfte Variante von oben genommen, die heißt "Text (Tabstopp-getrennt) (*.txt)" ich versuche gleich noch ein Bild mit drann zu hängen, falls ich mich schlecht ausdrücke.
Userbild
Danach habe ich das speichern einmal bestätigt, daraufhin sind sind 2 Meldungen gekommen. Zum einen wurde ich gewarnt das in dieses Format nur das aktuelle Blatt übernommen werden kann und keine Arbeitsmappen mit mehreren Blättern und zum anderen wurde ich gewarnt das dieses Format nicht alle Merkmale der aktuellen Mappe unterstützt. Diese Warnungen habe ich abgenickt, danach hatte das Dokument laut Anzeige im Exel txt als Erweiterung. Da habe ich dann folgendes aus dem VB-Editor rauskopiert:
Sub für_Erich_G()
' für_Erich_G Makro
ActiveWorkbook.SaveAs Filename:= _
"E:\Eigene Dateien\Eigene Dokumente\Dialyse\17.05.13\Dplan Vorlage.txt", _
FileFormat:=xlText, CreateBackup:=False
End Sub
An dieser Stelle bin ich auf "FileFormat:=xlText" gestoßen. Ich hoffe das beantwortet die Frage einigermaßen.
Zum zweiten melde ich mich wenn ich ausgeschlafen habe, bei einem ersten Kurztest mit der ersten Zeile aus dem Codeposting von Flock habe ich einen Laufzeitfehler bekommen. Vielleicht hat das ja was mit der Exelversion zu tun, ich nutze Exel 2007 unter Windows7 64bit. Wenn ich ausgeschlafen habe, werde ich mir das alles in Ruhe zu Gemüte führen und dann weitersehen.
bis später

Anzeige
AW: teils teils
19.05.2013 08:17:00
Erich
Hi,
bei genauerem Hinsehen (hätte ich auch schon mal früher tun sollen :-( ) fällt ein kleiner,
aber entscheidender Unterschied auf:
In DIFF_export() schreibst du "ActiveSheet.SaveAs ...", jetzt "ActiveWorkbook.SaveAs ...".
Die SaveAs-Methode auf Workbook kennt xlText, die SaveAs-Methode auf Worksheet nicht,
obwohl sich beide lt. Hilfe auf die Liste xlFileFormat beziehen.
Und die Makroaufzeichnung liefert (wie bei einigen anderen Gelegenheiten auch) falsche Infos...
Schöne Pfingsten!
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: teils teils
19.05.2013 10:56:45
Bubble
Guten Morgen Erich G.,
dann scheint mein Ansatz völlig falsch zu sein.
Mein Ziel war es ja aus einer Exelmappe im xlsm Format heraus den Inhalt der Zellen eines Arbeitsblattes in eine txt Datei zu schreiben, in der die einzellnen Zellen durch ein Tabstop getrennt sind. Der Name der Datei soll aus einer der Zelle ausgelesen werden und der Pfad ist der gleiche wie der von der Ursprungsmappe.
Bis dahin funktioniert das auch, aber dann geht nix mehr. Sobald das speichern beendet ist befinde ich mich in der soeben erstellte Datei, anstatt in der Ursprungsdatei.
Ich möchte keine Komplettlösung, sondern wäre schon dankbar für einen Tip. Schließlich ist jetzt mein Forscherdrang geweckt.
Danke sehr und ebenfalls schöne Pfingsten!
Bubble

Anzeige
AW: teils teils
19.05.2013 14:23:31
Belloth
Hi,
dumme Nachfrage:
"Sobald das Speichern beendet ist, befinde ich mich in der soeben erstellten Datei, anstatt in der Ursprungsdatei."
Heisst das, du befindest dich in der erstellten Datei ".txt" und kehrst nicht zu Excel zurück ?
ich habe deinen Beispielcode (ohne die msgbox) ausprobiert (mit fileformat:=xltextwindows), und bei mir funktioniert der.
Die Msgbox hat bei mir nicht funktioniert wegen

...importiert werden." & , , " _
Speichern erfolgreich"

die beiden Kommatas müsste ich weglassen oder durch "vblf &" ersetzen.
Gruß Flock

Anzeige
Sichern als Textdatei
19.05.2013 17:55:11
Erich
Hi,
"befinde ich mich in der soeben erstellte Datei, anstatt in der Ursprungsdatei"
Was bedeutet das? (Mal abgesehen, dass du dich selbst immer außerhalb beider Dateien aufhalten solltest...)
Was passiert, ist lediglich, dass sich der Name des aktiven Workbooks in den SaveAs-Namen ändert.
Die Inhalte bleiben unverändert, insbesondere sind evtl. vorhandene weitere Tabellenblätter noch da,
auch Makros bleiben.
In einer Textdatei gibt es weder mehrere Blätter noch Makros - also ist deine Mappe eine Excelmappe geblieben.
Sie heißt nur anders - nur der Name hat sich geändert.
Wenn das stört, kannst du anstelle des Blattes eine Kopie speichern und dann die Kopie wieder schließen.
Das ginge z. B. so:

Sub aaaTest()
ActiveSheet.Copy                       ' erzeuge neue Mappe
With ActiveWorkbook                    ' sichere neue Mappe
.SaveAs ThisWorkbook.Path & "\" & Range("E10"), xlTextMSDOS
.Close False                        ' schließe neue Mappe
End With
End Sub
Nicht verstanden habe ich deine Bemerkung "Bis dahin funktioniert das auch, aber dann geht nix mehr."
Was genau geht denn nicht mehr? Alles? ;-)
ExportAsFixedFormat ist für dich sicher keine Lösung - hier wird ein PDF oder XPS erzeugt, aber keine Textdatei.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
P.S.: Mein Vorname ist Erich, "Erich G." ist nur meine UserID hier (da es mehrere Erichs gibt)

Anzeige
AW: teils teils
19.05.2013 12:07:42
Bubble
Naja nach etwas stöbern in Goggle bin ich jetzt auf die Worksheet.ExportAsFixedFormat gestoßen, vielleicht ist das ja die Lösung für mein Problem.

AW: teils teils
19.05.2013 12:26:46
Bubble
Naja nach etwas stöbern in Goggle bin ich jetzt auf die Worksheet.ExportAsFixedFormat gestoßen, vielleicht ist das ja die Lösung für mein Problem?
Sorry für Doppelpost, hatte beim ersten Mal vergessen das Häkchen vergessen, bei noch nicht beantwortet.

eine andere Variante
19.05.2013 14:03:30
Tino
Hallo,
kannst mal diese Variante versuchen bzw. testen.
Sub Test_Schreibe_TxT()
Dim sPath$, strZeile$
Dim ArrayData, rngRange As Range, booErste As Boolean
Dim F%

Const strTrennzeichen$ = vbTab

sPath = IIf(Right$(ThisWorkbook.Path, 1) = "\", ThisWorkbook.Path, ThisWorkbook.Path & "\")
With ActiveSheet
    'Name der TxT-Datei prüfen 
    If .Range("E10").Value = "" Then Exit Sub
    If Not LCase(.Range("E10").Value) Like "*.txt" Then Exit Sub
    'kopletter Pfad 
    sPath = sPath & .Range("E10").Value
    'prüfen ob schon vorhanden --> löschen 
    If Dir(sPath, vbNormal) <> "" Then Kill sPath
    'Datei zum anhängen von Daten öffnen 
    F = FreeFile
    Open sPath For Append As #F
    'Bereich in Tabelle Feststellen 
    Set rngRange = Range("A1", FindLetzte(Sheets(.Name)))
    'Bereich Zeilen für Zeile durchlaufen 
    For Each rngRange In rngRange.Rows
        'Zeile in Array Transponieren 
        ArrayData = Application.Transpose(rngRange)
        'Array Transponieren und als Text verketten 
        ArrayData = Join(Application.Transpose(ArrayData), strTrennzeichen)
        'erst ab erster Zeile mit Inhalt schreiben 
        If Not booErste Then booErste = Replace(ArrayData, strTrennzeichen, "") <> ""
        If booErste Then
            Print #F, ArrayData
        End If
    Next rngRange
    
    Close #F
End With
End Sub

Function FindLetzte(mySH As Worksheet) As Range
Dim LRow As Long, LCol As Long
Dim A As Long
 
 With mySH.UsedRange
   On Error Resume Next
        'Finde Zeile 
        LRow = .Find("*", , xlValues, xlWhole, xlByRows, xlPrevious, False, False).Row
        LRow = Application.Max(LRow, .Find("*", , xlFormulas, xlWhole, xlByRows, xlPrevious).Row)
        If LRow = 0 Then LRow = 1
   
        'Finde Spalte 
        For A = .Columns(.Columns.Count).Column To .Columns(1).Column Step -1
              LCol = mySH.Columns(A).Find("*", , xlValues, xlWhole, xlByRows, xlPrevious).Column
              LCol = Application.Max(LCol, mySH.Columns(A).Find("*", , xlFormulas, xlWhole, xlByRows, xlPrevious).Column)
              If LCol > 1 Then: LCol = A: Exit For
        Next A
        If LCol = 0 Then LCol = 1
 End With
 
 Set FindLetzte = mySH.Cells(LRow, LCol)
End Function
Gruß Tino

Anzeige
AW: eine andere Variante
19.05.2013 22:53:48
Bubble
Hallo Tino,
es funktioniert perfekt. Ich muss ganz ehrlich sagen, ich verstehe den Code überhaupt nicht, trotz Deiner Erläuterungen. Anscheinend deckst du fast alle Möglichkeiten ab.
Was mich etwas Verwirrt sind die Stellen, an denen Du in der Erläuterung schreibst
'prüfen ob schon vorhanden --> löschen

und Zwei Zeilen tiefer steht dann
'Datei zum anhängen von Daten öffnen

Also bei meinen Versuchen wurde die Datei immer ersetzt, so soll es ja auch sein. Wird unter bestimmten umständen etwas an die Datei ranngehängt, wenn die schon vorhanden ist? Das darf nicht passieren. Sie muss immer ersetzt werden.
Ist es richtig das Du mit
sPath = IIf(Right$(ThisWorkbook.Path, 1) = "\", ThisWorkbook.Path, ThisWorkbook.Path & "\")
With ActiveSheet
'Name der TxT-Datei prüfen
If .Range("E10").Value = "" Then Exit Sub
If Not LCase(.Range("E10").Value) Like "*.txt" Then Exit Sub
'kopletter Pfad
überprüfst ob in Zelle E10 auch ein Eintrag ist, welcher mit .txt endet, wenn nicht wird abgebrochen?
Kannst Du mir das noch so abändern, das der Eintrag von Zelle E10 auch mit exportiert wird? In den Versuchen war es so, das er nur in der Textdatei stand, wenn sich in einer Spalte rechts von E auch noch irgendwo ein Eintrag befand, wie zB in Spalte G oder H.
Fragen über Fragen, ich bin Dir auf jeden Fall sehr sehr dankbar und wünsche noch schöne Pfingsten.
Bubble

Anzeige
AW: eine andere Variante
19.05.2013 23:41:53
Tino
Hallo,
1. Frage
Du hast es richtig erkannt, wenn Du die Code- Zeile löschst
If Dir(sPath, vbNormal)  "" Then Kill sPath

wird der Text (Zeile für Zeile) an die Datei angehängt.
Da Du dies nicht möchtest, sollte die Zeile stehen bleiben.
2. Frage
ja da wird geprüft ob ein richtiger Name für eine Textdatei in der Zelle steht.
Eigentlich reicht diese Zeile für die Aufgabe aus.
If Not LCase(.Range("E10").Value) Like "*.txt" Then Exit Sub

diese Zeile kannst Du löschen.
If .Range("E10").Value = "" Then Exit Sub
Die 3. Frage kann ich jetzt so nicht beantworten, bei mir wird diese mit geschrieben.
Hier meine Testdatei, diese in einen Ordner speichern wegen dem Pfad für die Textdatei.
https://www.herber.de/bbs/user/85408.xls
Gruß Tino

Anzeige
AW: eine andere Variante
20.05.2013 12:37:00
Bubble
Hallo Tino,
alles ist super, das Makro macht was es soll. Eine letzte Frage, zumindest hoffe ich das es so ist. Gibt es eine Möglichkeit den Bereich der Exportiert wird zu beschränken auf einen fest definierten Bereich. Als Beispiel der Bereich Zelle A4:E109, ich habe am Anfang des Makros etwas experiementiert, aber ohne Erfolg.
Dim ArrayData, rngRange As Range, booErste As Boolean
Da habe ich versucht ("A1:E109") oder Range("A1:E109") oder ArryData as Range("A1:E109").Value, es gab immer diverse Fehler.
Danke imVoraus und einen schönen Feiertag noch!
Bubble

AW: eine andere Variante
20.05.2013 14:09:30
Tino
Hallo,
hier die angepasste Datei.
Die Daten werden erst ab der ersten bis zur letzten Zeile mit Daten geschrieben.
https://www.herber.de/bbs/user/85414.xls
Gruß Tino

AW: eine andere Variante
20.05.2013 16:23:46
Bubble
Hallo Tino,
vielen vielen Dank, nun ist alles ok und ich habe keine weiteren Fragen. Kleinere Anpassungen wie MsgBox am Ende, automatisches aktivieren eines bestimmten Sheets und so Dinge bekomme ich selbst hin.
Echt nett das es so Leute gibt wie Dich. EIN HOCH AUF TINO!
Gruß
Bubble

41 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige