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

Ausgewählte Arbeitsmappe als CSV-Datei speichern

Ausgewählte Arbeitsmappe als CSV-Datei speichern
07.02.2018 13:00:55
Anka
Hallo Ihr lieben Helfer,
ich brauche unbedingt Eure Hilfe für mein Tool meiner Masterarbeit: Ich habe ein kleines Makro geschrieben, das nur eine Arbeitsmappe ("Zieltabelle") aus einer Exceldatei als CSV-Datei speichern soll.
Das Problem ist, dass die Textboxen auf einer anderen Arbeitsmappe ("Auswahlmaske") erscheinen sollen. Gespeichert werden soll im Anschluss die Arbeitsmappe ("Zieltabelle")-
Dabei gibt es folgende Textboxen:
1. "Soll die Datei als CSV-Datei gespeichert werden?"
--> bei "Ja" soll die Datei an einem festen Speicherort gespeichert werden, allerdings soll der Nutzer den Dateinamen selber eingeben können, sodass der Speicherort fix bleibt und nur der Dateiname veränderbar ist
--> bei "Nein": kommt die 2. Textbox:
2. "Zur weiteren Verarbeitung in QGIS muss das Ergebnis im CSV-Format gespeichert _
werden. Wollen Sie das Ergebnis als CSV-Datei speichern?"?"
--> bei "Ja" soll das Fenster "Speichern unter" aufgehen, wo der Nutzer die Datei beliebig abspeichern kann
--> bei "Nein" soll das gar nichts passieren.
Folgende Probleme treten bei meinem Code auf:
1)Bei mir funktioniert nicht, dass ich mehrere Workbooks in einem Code verwenden kann
2)Nicht die Mappe "Zieltabelle" wird als CSV-Datei abgespeichert, sondern die ganze Excel-Datei wird an den angegbenen Ort als CSV-Datei gespeichert.
3) Die Textboxen öffnen sich nicht auf dem richtigen Arbeitsblatt
Hier ist mein Code dazu:

Sub Datei_speichern()
'    Dim wsAuswahlmaske As Worksheet
'    Dim wsZiel As Worksheet                                'Variable: Zieldatei anlegen
'    Set wsZiel = Worksheets("Zieltabelle")           'Variable: Zieldatei "Zieltabelle"  _
festlegen
'    Set wsAuswahlmaske = Worksheets("Auswahlmaske")
Dim wbZieltabelle As Workbook
Dim wbAuswahlmaske As Variant
Dim dateiname As String
'* CSV-Datei
If MsgBox("Zur weiteren Verarbeitung in QGIS muss das Ergebnis im CSV-Format gespeichert  _
werden. Wollen Sie das Ergebnis als CSV-Datei speichern?", vbYesNo) = vbYes Then
dateiname = InputBox("Dateiname:")
If dateiname = "" Then
MsgBox "Dateiname ist ungültig!"
Exit Sub
End If
With wbZieltabelle
wbZieltabelle.Copy
wbZieltabelle.SaveAs "C:\Users\GIS\Desktop\Exceltool_Ergebnis\CSV-Dateien" & dateiname & ".  _
_
csv"
End With
With wbAuswahlmaske
wbAuswahlmaske.MsgBox("Datei wurde als CSV-Datei gespeichert!", vbOK) = vbOK                 _
_
'Hinweis wo Ergebnis gespeichert wurde
wbAuswahlmaske.MsgBox("Zur weiteren Verarbeitung in QGIS muss das Ergebnis im CSV-Format  _
gespeichert werden. Wollen Sie das Ergebnis als CSV-Datei speichern?", vbYesNo) = vbNo
ActiveWorkbook.MsgBox("Wollen Sie das Ergebnis als Excel-Datei speichern?", vbYesNo) =  _
vbYes
End With
With wbZieltabelle
fileToOpen = Application.GetOpenFilename("Microsoft Excel-Dateien (*.xls), *.xls")
Pfad.Text = fileToOpen
ActiveWorkbook.MsgBox("Datei wurde als CSV-Datei gespeichert!", vbOK) = vbOK
End With
With wbAuswahlmaske
ActiveWorkbook.MsgBox("Wollen Sie das Ergebnis als Excel-Datei speichern?", vbYesNo) = vbNo
End With
'ActiveWorkbook.Close False
End If
End Sub
Vielen Dank für eure Untersützung!
VG, Anka

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Ausgewählte Arbeitsmappe als CSV-Datei speichern
08.02.2018 04:05:05
Rainer
Hallo Anka,
zu 1.
Es scheint mir, dass du stellenweise "Workbook" und "Worksheet" verwechselst. "Book" ist die Excelmappe, vereinfacht gesagt die Datei welche du speicherst. "Sheet" ist das Excelblatt, also die verschiedenen Seiten innerhalb deiner Mappe. Öffnest du verschiedene Exceldateien für dein Makro oder läuft alles innerhalb einer Datei ab? Im ersten fall ist dein "ActiveWorkbook" fast schon kriminell. Außderdem musst du dann bei solchen Zuweisungen auch die Mappe ("Datei") angeben:
Set wsZiel = Worksheets("Zieltabelle")

muss so aussehen
Set wsZiel = Workbook("MeineDatei.xlsx").Worksheets("Zieltabelle")
zu 2.
meine ganz private Erfahrung mit Excel ist die, dass Excel und CSV nicht unbedingt gute Freunde sind. Ich erstelle meine CSV so:

Dim Export 'As Worksheet
Dim ExportString, TimeStamp
Dim i, ExportRow as Integer
Dim LC, LR As Long
Set Export = ThisWorkbook.Sheets("EXPORT")
'Make Exportfile
ExportFile = ThisWorkbook.Path & "\Excel_Export_" & TimeStamp & ".csv"
LR = Export.Cells(Export.Rows.Count, "A").End(xlUp).Row
'Write the first headerline
LC = Export.Cells(1, Export.Columns.Count).End(xlToLeft).Column
For i = 1 To LC
If ExportString  "" Then
ExportString = ExportString & "," & Export.Cells(1, i)
Else
ExportString = Export.Cells(1, i)
End If
Next i
Open ExportFile For Output As #1        'The first use of the file must use "OUTPUT"
Print #1, ExportString
Close #1
ExportString = ""
'Write the data
For ExportRow = 2 To LR
For i = 1 To LC
If ExportString  "" Then
ExportString = ExportString & "," & Export.Cells(ExportRow, i)
Else
ExportString = Export.Cells(ExportRow, i)
End If
Next i
Open ExportFile For Append As #1        'The second (and further) use of the file must use " _
APPEND"
Print #1, ExportString
Close #1
Next ExportRow
3. Weder "wbZieltabelle" noch "wbAuswahlmaske" werden definiert. Außerdem (siehe 1.) benutzt du verschiedenste Varianten zum Aufruf:

MsgBox "Dateiname ist ungültig!"
ActiveWorkbook.MsgBox("Datei wurde als CSV-Datei gespeichert!", vbOK) = vbOK
wbAuswahlmaske.MsgBox("Datei wurde als CSV-Datei gespeichert!", vbOK)

wobei die erste und zweite Variante eigentlich das gleiche tun. Ohne Angabe einer Mappe benutzt Excel standardmäßig das "ActiveWorkbook". Hier musst du aufpassen, denn es gibt zusätzlich noch "ThisWorkbook". Dies bezeichnet immer die Mappe, aus welcher dein VBA-Code gestartet wurde.
Ich empfehle deinen Code aufzuräumen und entweder "ActiveWorkbook / ThisWorkbook" zu benutzen oder alle Mappen (Dateien) entsprechend du definieren:

Dim wbZieltabelle As Workbook
Set wbZieltabelle = ActiveWorkbook
'oder alternativ
'Set wbZieltabelle = Workbook("MeineZielDatei.xlsx")
Wenn du weitere Hilfe brauchst, dann wäre auch eine Beispielmappe ganz hilfreich.
Gruß,
Rainer
Anzeige
AW: Ausgewählte Arbeitsmappe als CSV-Datei speichern
08.02.2018 09:02:09
Anka
Hallo Rainer,
vielen Dank für Deine vielen Hilfestellungen! Ich kenne mich mit VBA eigentlich überhaupt nicht aus und habe den Code irgendwie zusammengebastelt, daher ist er für Dich so "kriminell" :D
Ich brauche das aber für meine Masterarbeit, daher quäle ich mich hier durch....
Ich arbeite immer nur in einer Excel-Datei und darin sind verschiedene Mappen. Im Endeffekt möchte ich einfach nur, dass die Mappe "Zieltabelle", in der sehr viele Daten enthalten sind, als CSV-Datei gespeichert wird. Das soll per Button funktioneren.
Die Excel-Datei soll so wie sie ist bestehen bleiben, d.h. ich möchte nur, dass ein Blatt aus der Excel-Datei als CSV-Datei per Button-Click gespeichert/exportiert wird und dann soll der Nutzer wieder im Excel-Dokument weiterarbeiten können.
Im Moment ist es bei mir noch so, dass die ganze Datei dann als CSV-Datei gespeichert wird und das möchte ich eben nicht.
Ehrlich gesagt verstehe ich nicht was das alles heißt in deinem Code, weil ich mich, wie gesagt, damit nicht auskenne. Gibt es keinen einfacheren Code? Bzw wie kann ich das mit meinen Bezeichnungen verbinden, denn im Moment hört der Code nicht auf, sondern die Schleife springt immer wieder auf den Anfang zurück...?
Vielen Dank für Deine Mithilfe!
VG, Anka
Anzeige
AW: Ausgewählte Arbeitsmappe als CSV-Datei speichern
08.02.2018 09:31:54
Rainer
Hallo Anka,
ich sag mal so: Willkommen im Club. Meine Einstellung zu VBA war im Studium auch nicht anders.
Aber ich kann dir versprechen, dass man damit auch nach der Masterarbeit noch tolle Sachen machen kann.
Wegen deinem aktuellen Problem nochmal die Bitte: Lade deine Datei mal hoch. Ich kann dir zwar hier online weiter den Quelltext "versaubeuteln", aber wir sind schneller wenn ich es auch direkt in deiner Datei ausprobieren kann.
"Mein" Code (der ist auch nur zusammengeklaut) zum Export ist eigentlich recht simpel. Ich versuche es mal zu erklären:

'Variablendeklaration
Dim Export 'As Worksheet
Dim ExportString, dateiname
Dim i, ExportRow as Integer
Dim LC, LR As Long
Set Export = ThisWorkbook.Sheets("EXPORT")
'Lege fest, welches Blatt EXPORT sein soll
'Erstelle Exportdatei
dateiname = InputBox("Dateiname:")
If dateiname = "" Then
MsgBox "Dateiname ist ungültig!"
Exit Sub
End If
ExportFile = ThisWorkbook.Path & "\" & dateiname & ".csv"
'Pfad und Dateiname des Export
LR = Export.Cells(Export.Rows.Count, "A").End(xlUp).Row
'Ermittle Letzte Zeile in EXPORT, Spalte A
'Erste Zeile exportieren
LC = Export.Cells(1, Export.Columns.Count).End(xlToLeft).Column
'Ermittle Letzte Spaltein EXPORT, Zeile 1
For i = 1 To LC
'Schleife über alle Spalten
If ExportString  "" Then
'Der ExportString wird Zellenweise befüllt. Die erste Spalte soll kein Trennzeichen  _
haben.
ExportString = ExportString & "," & Export.Cells(1, i)
'Das Komma ist das CSV Trennzeichen
Else
'Das ist die erste Spalte
ExportString = Export.Cells(1, i)
End If
Next i
Open ExportFile For Output As #1
'Beim ersten Schreiben in die Exportdatei muss die Option "OUTPUT" benutzt werden.
Print #1, ExportString
Close #1
'Schließe Exportdatei wieder
ExportString = ""
'Leere den Exportstring, damit eine neue Zeile beginnen kann ohne Trennzeichen
'Weitere Zeilen exportieren
For ExportRow = 2 To LR
'Schleife für Zeile 2 bis Letzte Zeile
For i = 1 To LC
'Schleife über alle Spalten, wie beim erstem Mal
If ExportString  "" Then
ExportString = ExportString & "," & Export.Cells(ExportRow, i)
Else
ExportString = Export.Cells(ExportRow, i)
End If
Next i
Open ExportFile For Append As #1
'Ab dem zweiten Schreiben in die Exportdatei muss die Option "OUTPUT" benutzt werden.
Print #1, ExportString
Close #1
'Schließe Exportdatei wieder
ExportString = ""
'Leere den Exportstring, damit eine neue Zeile beginnen kann ohne Trennzeichen
Next ExportRow
Das Öffnen und schließen der Datei erzeugt die Zeilenumbrüche.
Es speichert die CSV Datei im gleichen Pfad wie die Excel-Datei ab.
Bei weiteren Fagen melde dich.
Gruß,
Rainer
Anzeige
AW: Ausgewählte Arbeitsmappe als CSV-Datei speichern
08.02.2018 10:52:22
Anka
Hallo Rainer,
ich bin echt happy, dass so hilfsbereit bist, denn ich sitze schon einige Wochen an meinem Excel-Tool dran und so langsam komme ich in Zeitdruck....
Also im Endeffekt man Tool folgendes (alles in einer Excel-Datei): In dem Blatt "Auswahlmaske" kann der Anwender verschiedene Eingaben machen, wonach ein Datensatz (anderes Excelblatt) gefiltert wird. Dieser Datensatz wird dann in das Blatt "Zieltabelle" eingefügt. Jetzt soll der Anwender über einen Button dieses Filterergebnis als CSV-Datei abspeichern können. Und da liegt jetzt mein Problem!
Ich denke das Problem ist, dass der Datensatz unterschiedlich groß ist (90 Zeilen - circa 400.000 Zeilen), sodass ich da keine feste Vorgabe machen kann, außer bspw. Range("$A$1:$Z$400000"); aber ich denke so gut ist das nicht.
Ich habe jetzt den Code weng überarbeitet und versucht in Deinen Code einzufügen. Aber es funktioniert leider immer nicht :(((.
Hier der überarbeitete Code und im Anhang nur ein Auszug aus dem Excel-Blatt, da die Datei riesig ist:

Sub Datei_speichern()
'* Definition meiner Variablen
Dim wsAuswahl As Worksheet
Dim wsZiel As Worksheet
Dim rng_Zieltabelle As Range
'Dim str_alterName As String
'Dim neuerName As String
Dim Workbook As Workbook
Dim strDateiname As String
Dim strDateiort As String
Set Workbook = ThisWorkbook
Set wsAuswahl = Worksheets("Auswahlmaske")
Set wsZiel = Worksheets("Zieltabelle")
Set rng_Zieltabelle = wsZiel.Range("$A$1:$Z$500000")
strDateiname = strDateiname = InputBox("Bitte den Namen der CSV-Datei angeben.", "CSV-Export") ' _
Der Name der Datei soll vom Nutzer immer vorgegeben werden können
strDateiort = "C:\Users\GIS\Desktop\Exceltool_Ergebnis\CSV-Dateien\"                           ' _
Der Speicherort der Datei soll nicht veränderbar sein
'* Vorgehensweise von Rainer (Forum)
Dim Export As Worksheet
Dim ExportString, Timestamp
Dim i, ExportRow As Integer
Dim LC, LR As Long
Set Export = ThisWorkbook.Sheets("Zieltabelle")
'Make the Exportfile
ExportFile = strDateiort & "\Excel_Export_" & Timestamp & ".csv"
LR = Export.Cells(Export.Rows.Count, "A").End(xlUp).Row
'Write the first headerline
LC = Export.Cells(1, Export.Columns.Count).End(xlToLeft).Column
For i = 1 To LC
If ExportString  "" Then
ExportString = ExportString & "," & Export.Cells(1, i)
Else
ExportString = Export.Cells(1, i)
End If
Next i
Open ExportFile For Output As #1        'The first use of the file must use "OUTPUT"
Print #1, ExportString
Close #1
ExportString = ""
'Write the data
For ExportRow = 2 To LR
For i = 1 To LC
If ExportString  "" Then
ExportString = ExportString & "," & Export.Cells(ExportRow, i)
Else
ExportString = Export.Cells(ExportRow, i)
End If
Next i
Open ExportFile For Append As #1        'The second (and further) use of the file must use " _
_
APPEND"
Print #1, ExportString
Close #1
Next ExportRow
End sub

Hier ist der Link zur hochgeladenen Datei: https://www.herber.de/bbs/user/119646.xlsm
Vielen Dank für Deine Hilfe!
VG, Anka
Anzeige
AW: Ausgewählte Arbeitsmappe als CSV-Datei speichern
08.02.2018 15:48:35
Rainer
Hallo Anka,
Ich schaue es mir morgen mal an.
Gruß,
Rainer
AW: Ausgewählte Arbeitsmappe als CSV-Datei speichern
13.02.2018 07:03:08
Rainer
Hallo Anka,
ich lag ein paar Tage im Bett, sorry für die Verspätung.
https://www.herber.de/bbs/user/119746.xlsm
Dafür hat es nun 2 Varianten. Probier mal welche bei 400.000 Zeilen schneller ist.
Gruß,
Rainer
AW: Ausgewählte Arbeitsmappe als CSV-Datei speichern
14.02.2018 20:35:48
Anka
Hallo Rainer,
du bist echt spitze! Vielen Dank für Deine Hilfe, du hast mich gerettet! Dein erster Vorschlag funktioniert bei irgendwie nicht, da kommt bei "SaveCopyAs" immer ein Kompilierungsfehler mit "Die Methode oder das Datenelement wurde nicht gefunden". Hier der Code dazu:
Sub Datei_speichern()
'* Definition meiner Variablen
Dim wsAuswahl As Worksheet
Dim wsZiel As Worksheet
Dim rng_Zieltabelle As Range
'Dim str_alterName As String
'Dim neuerName As String
Dim Workbook As Workbook                        'Braucht es das? Du benutzt es nie in dieser  _
Sub
Dim strDateiname As String
Dim strDateiort As String
Set Workbook = ThisWorkbook                       'Braucht es das?
'Set wsAuswahl = Worksheets("Auswahlmaske")                                     'temporär
Set wsZiel = Worksheets("Zieltabelle")
'Set rng_Zieltabelle = wsZiel.Range("$A$1:$Z$500000")                           'Das brauchen  _
wir nicht, wir zählen später die Zeilen und Spalten (LR und LC)
strDateiname = InputBox("Bitte den Namen der CSV-Datei angeben.", "CSV-Export") 'Der Name der  _
Datei soll vom Nutzer immer vorgegeben werden können
strDateiort = ThisWorkbook.Path & "\"                                           'temporär
'strDateiort = "C:\Users\GIS\Desktop\Exceltool_Ergebnis\CSV-Dateien\"           'Der  _
Speicherort der Datei soll nicht veränderbar sein
'* Vorgehensweise von Rainer (Forum)
Dim Export As Worksheet
Dim ExportString, Trennzeichen
Dim i As Integer, ExportRow As Integer
Dim LC As Long, LR As Long
Set Export = ThisWorkbook.Sheets("Zieltabelle")
'Trennzeichen für csv Spaltentrennung auswählen
Trennzeichen = ","
'Make the Exportfile
ExportFile = strDateiort & strDateiname & ".csv"    'Die Datei soll an den vordefinierten  _
Ort mit dem zuvor eingegebenen Namen gespeichert werden
LR = Export.Cells(Export.Rows.Count, "A").End(xlUp).Row
'Ermittle Letzte Zeile in EXPORT, Spalte A
'Erste Zeile exportieren
LC = Export.Cells(1, Export.Columns.Count).End(xlToLeft).Column
'Ermittle Letzte Spalte in EXPORT, Zeile 1
For i = 1 To LC
'Schleife über alle Spalten
If ExportString  "" Then
'Der ExportString wird Zellenweise befüllt. Die erste Spalte soll kein Trennzeichen  _
haben.
ExportString = ExportString & Trennzeichen & Export.Cells(1, i)
Else
'Das ist die erste Spalte
ExportString = Export.Cells(1, i)
End If
Next i
Open ExportFile For Output As #1
'Beim ersten Schreiben in die Exportdatei muss die Option "OUTPUT" benutzt werden.
Print #1, ExportString
Close #1
'Schließe Exportdatei wieder
ExportString = ""
'Leere den Exportstring, damit eine neue Zeile beginnen kann ohne Trennzeichen
'Weitere Zeilen exportieren
For ExportRow = 2 To LR
'Schleife für Zeile 2 bis Letzte Zeile
For i = 1 To LC
'Schleife über alle Spalten, wie beim erstem Mal
If ExportString  "" Then
ExportString = ExportString & Trennzeichen & Export.Cells(ExportRow, i)
Else
ExportString = Export.Cells(ExportRow, i)
End If
Next i
Open ExportFile For Append As #1
'Ab dem zweiten Schreiben in die Exportdatei muss die Option "OUTPUT" benutzt werden.
Print #1, ExportString
Close #1
'Schließe Exportdatei wieder
ExportString = ""
'Leere den Exportstring, damit eine neue Zeile beginnen kann ohne Trennzeichen
Next ExportRow
End Sub
Modul 1 funktioniert. Ich habe da noch eine Frage: Wie kann ich den Speicherort verändern? Du hast es mit folgendem Code gemacht:
strDateiort = ThisWorkbook.Path & "\"
Ich habe es jetzt so funktioniert:
strDateiort = "C:\Users\GIS\Desktop\Exceltool_Ergebnis\CSV-Dateien\
Aber das hat leider nicht funktioniert. Warum?
Vielen Dank nochmal Rainer!
VG, Anka
Anzeige
AW: Ausgewählte Arbeitsmappe als CSV-Datei speichern
15.02.2018 06:10:47
Rainer
Hallo Anka,
ich habe es wohl nicht final gespeichert vor dem Hochladen.
wsZiel.SaveCopyAs strDateiort & "DeleteMe.xlsm"

ist Unfug, weil versucht wird ein Blatt als Mappe zu speichern.
Es muss heißen:
ThisWorkbook.SaveCopyAs strDateiort & "DeleteMe.xlsm"
Wegen dem Speicherort, da kann ich nur vermuten dass du nicht als Nutzer "GIS" angemeldet bist oder der angegebene Ordner nicht existiert.
Hier deine neue Datei: https://www.herber.de/bbs/user/119817.xlsm
Modul 1a ist der alte Modul 1 komplett unverändert.
Modul 1b ist der alte Modul 1, aber mit einem Dialog "Speichern als". Wenn dann dein ausgewählter Speicherort (Variable strDateiort) nicht geht, dann bekommst du eine Meldung vom System und kannst einen anderen Ort definieren.
Modul 2a ist ähnlich dem alten Modul 2, ich habe aber den Ablauf der lokalen Kopie etwas verändert. So bleibt jetzt die Originaldatei geöffnet nach dem Speichern und nicht die CSV.
Modul 2b ist genau wie 2a, nur mit dem Dialog "Speichern als" wie in Modul 1b.
Probiere bitte nochmal.
Gruß,
Rainer
Anzeige
AW: Ausgewählte Arbeitsmappe als CSV-Datei speichern
15.02.2018 11:32:28
Anka
Hallo Rainer,
jetzt klappt alles! Vielen Vielen Dank!
Bu bist echt spitze!!!!
Liebe Grüße,
Anka

313 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige