Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1752to1756
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

CSV per VBA erzeugen

CSV per VBA erzeugen
28.04.2020 21:24:42
Jubel
Hallo Leute,
ich versuche gerade eine CSV-Datei aus VBA heraus zu erstellen und dabei direkt den Inhalt eines Tabellenblatts meiner Arbeitsmappe in diese CSV-Datei zu schreiben.
Hierzu habe ich zunächst gegoogelt und diesen Code gefunden:
Sub CSV_erzeugen()
Dim strDateiname As String, strPath As String
Dim i As Long, lngZeile As Long
strPath = "C:\Dateien_erstellen\CSV\" 'Speicherpfad eintragen
strDateiname = "txt_dateiname.csv" 'Dateinamen mit Dateiendung eintragen
lngZeile = Range("A" & Rows.Count).End(xlUp).Row
Open strPath & strDateiname For Output As #1
For i = 1 To lngZeile
Print #1, Cells(i, 1).Value & ";" & Cells(i, 2).Value & ";" & Cells(i, 3).Value
Next i
Close #1
End Sub
Der klappt soweit auch super, aber ich würde ihn gerne auch verstehen, damit ich ihn erweitern bzw. etwas ändern kann. Ich hoffe, ihr könnt mir dabei etwas helfen.
Der obere Teil ist mir soweit klar, besonders elegant (aus meiner bescheidenen Warte heraus) fand ich, wie die letzte beschriebene Zeile (IngZeile) gefunden wird. Sowas habe ich Dussel bisher immer über eine For-Next-Schleife mit Abfrage auf "" gelöst. Insofern schon mal ein toller Lerneffekt ;)
Wenn es dann an das Output/Print/Close von #1 geht, bin ich etwas unsicher. Das Ergebnis des Codes ist, dass mein erstes Tabellenblatt der Mappe in die CSV geschrieben wird. Und zwar von der ersten beschrieben Zeile (in Spalte A) bis zur letzten (in Spalte A), wobei dann Spalten A bis C übertragen werden.
Ich frage mich nur, woher weiß VBA, dass ich das erste Tabellenblatt meiner Mappe als Kopiergrundlage haben möchte und nicht etwa irgendein anderes? Ist dafür das "#1" gedacht?
Wie könnte ich denn z.B. eine konkret benanntes Tabellenblatt in die neu erstellte CSV-Datei übertragen?

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: CSV per VBA erzeugen
28.04.2020 22:03:42
onur
Wieso nicht z.B. einfach:
ActiveWorkbook.SaveAs Filename:="C:\DeinOrdner\DeineDatei.csv", FileFormat _
:=xlCSV, CreateBackup:=False

?
AW: CSV per VBA erzeugen
28.04.2020 22:40:38
Jubel
Hi Onur,
das ist in der Tat noch einfacher.
Und wenn ich nur ein bestimmtes Tabellenblatt bzw. nur eine bestimmte Spalte eines Tabellenblatts (und nicht das gesamte aktive Workbook) in die neue Datei schreiben wollte?
AW: CSV per VBA erzeugen
28.04.2020 22:45:21
Jubel
Habe es gerade mal mit...
ActiveWorkbook.Worksheets("Var").Range("E1:E1000").SaveAs

...probiert, da bekomme ich aber "Objekt unterstützt Eigenschaft oder Methode nicht".
Anzeige
AW: CSV per VBA erzeugen
28.04.2020 23:00:52
Daniel
Hi
1. Fehlt bei SaveAs noch der Parameter Local:=True, sonst hast du das Komma als Trennzeichen.
2. Würde ich beim Erstellen einer csv-Datei zunächst eine neue leere Mappe anlegen, dort die Daten hineinkopieren und dann diese Mappe speichern.
Hat den Vorteil, dass deine Originalmappe nicht zur CSV mutiert (SaveAs!)
Ansonsten ist es so, dass das aktive Blatt in die CSV geschrieben wird sowie es angezeigt wird.
Dh. wenn du keine neue Mappe erstellst, musst du das Blatt aktivieren und unerwünschte Spalten ausblenden
Gruß Daniel
AW: CSV per VBA erzeugen
28.04.2020 23:11:09
Jubel
Hi,
danke Daniel, das mit dem "mutieren" hatte ich eben auch schon gesehen. Das ist definitiv nicht das, was ich brauchen würde. Am Besten wäre es, wenn ich gezielt eine Spalte eines Blattes in eine neue CSV schreiben könnte. Die CSV soll sich dabei nicht (sichtbar) öffnen, sondern einfach im Hintergrund angelegt werden.
Leider habe ich noch immer nicht verstanden, wie der von mir eingangs gepostete Code das schafft. Also wieso er gerade das erste Tabellenblatt nimmt und nicht irgendein anderes. Im Grunde tut er sonst was ich will (also bezieht eine oder mehrere bestimmte Spalten und überträgt die in eine neue CSV).
Anzeige
AW: CSV per VBA erzeugen
28.04.2020 23:13:11
Jubel
Wie würdest du denn den Code stricken, damit er die CSV öffnet, die Daten reinkopiert und dann die CSV speichert? Onbur klang, als wenn es deutlich einfacher gehen würde, als der Code, den ich gefunden hatte.
AW: CSV per VBA erzeugen
29.04.2020 05:28:48
Daniel
Hi
Im Prinzip so
Worbooks.Add
Thisworkbook.Sheets(...).Range(...benötigter Zellbereich...).Copy
ActiveSheet.Cells(1,1).PasteSpecial xlpastevaluesandnumberformats
ActiveWorkbook.SaveAs ... Einstellungen für CSV ...
ActiveWorkbook.Close false
Gruß Daniel
AW: CSV per VBA erzeugen
29.04.2020 05:49:31
Daniel
Hi
Prinzipiell so
Workbooks.Add
Thisworkbook.Sheets(...).Range(...).Copy
ActiveSheet.Cells(2,1).PasteSpecial xlpastevaluesandnumberformats
ActiveWorbook.SaveAs ... csv-datei...
ActiveWorkbook.close false
Gruß Daniel
Anzeige
AW: CSV per VBA erzeugen
29.04.2020 09:54:19
MLoew
Hi Daniel,
an solch einem Problem war ich auch dran.
Der Punkt ist: Wenn Excel eine Datei als CSV speichert wird unter Umständen diese Datei vom einem System, was eine PURE CSV erwartet nicht lesbar sein.
Daher bin ich dazu einen ganz anderen Weg gegangen:
- Definiere den auszulesenden Range-Bereich (z.B. "A1:" & letzteZeile & letzteSpalte)
- Dann über eine verschachtelte For Next jede Zeile / Zelle durchlaufen
- Die äussere ist für die Zeilen, die innere für die Spalten
- jedes Zelle wird dann mit einem Zeichen deiner Wahl getrennt (Komma ist keine gute Idee)
- diese werden dann zu einem String zusammen gesetzt
- Wenn die Spalte zu Ende ist und du z.B. 150 Spalten in einen String geschrieben hast wird der in eine Datei geschrieben. Diese Datei hat die Endung *.csv.
So ungefähr sieht das aus
For x = 1 To LetzteSpalte
If Cells(intHeaderBulkupload_Zeile, x).Value = "" Then
Else
If Zellwert = "" Then
strCSV_Output = strCSV_Output & ";"
Else
strCSV_Output = strCSV_Output & ";" & Zellwert
End If
End If
Next x
Vorteil:
- Du kannst dein Trennzeichen selbst wählen
- du kannst eine Prüfung der Werte noch zusätzlich einbauen.
Und von der Zeit geht das auch extrem schnell.
Anzeige
AW: CSV per VBA erzeugen
29.04.2020 13:13:29
volti
Hi all,
öfter mal was Neues:
Man kann auch über die Zwischenablage gehen. Hierbei Separator z.B. ";", tab oder sonst was und den Bereich oder alles ganz einfach individuell mitgeben.
Und eine CSV-Datei ist nur eine Textdatei mit Separator ; (deutsch). Da gibt es m.E. keine verschiedenen Versionen. Und falls man mehrere Bereiche nacheinander dort reinbekommen will, einfach Dateimodus Append verwenden.

Sub CreateCSVDatei()
'CSV-Datei über die Zwischenablage
 Dim oText As DataObject
 Set oText = New DataObject
' ActiveSheet.Range("A1:J200").Copy     'Nur Bereich
 ActiveSheet.Cells.Copy                 'Alles
 DoEvents
 Close #1: Open ThisWorkbook.Path & "\MeineCVS.CSV" For Output As #1
 oText.GetFromClipboard
 Application.CutCopyMode = False
 Print #1, Replace(oText.GetText(1), vbTab, ";"): Close #1
End Sub
viele Grüße
Karl-Heinz

Anzeige
AW: CSV per VBA erzeugen
29.04.2020 22:32:36
Jubel
Hallo,
vielen Dank für die verschiedenen Ansätze. Ich werde in den kommenden Tagen mal herum probieren, was auch performanceseitig am Besten funktioniert (bei mir werden die erzeugten Dateien in einen Netzwerkpfad geschrieben und dabei gibt es immer mal wieder Verzögerungen).
Was meine Eingangsfrage angeht...
Ich frage mich nur, woher weiß VBA, dass ich das erste Tabellenblatt meiner Mappe als  _
Kopiergrundlage haben möchte und nicht etwa irgendein anderes? Ist dafür das "#1" gedacht?
Wie könnte ich denn z.B. ein konkret benanntes Tabellenblatt in die neu erstellte CSV-Datei übertragen?

Die konnte ich mir mittlerweile selbst beantworten. Mit der Abwandlung im Eingangscode...
lngZeile = Worksheets("Var").Range("FH" & Rows.Count).End(xlUp).Row
Open strPath & strDateiname For Output As #1
For i = 1 To lngZeile
Print #1, Worksheets("Var").Cells(i, 164).Value & ";" 'Schreibt Variablen in CSV-Datei
Next i
Close #1
End Sub

...kopiere ich nun gezielt aus einem Tabellenblatt eine bestimmte Spalte (hier FH, also 164. Spalte) in die CSV.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige