Microsoft Excel

Herbers Excel/VBA-Archiv

csv Export unvollständig

Betrifft: csv Export unvollständig von: kati
Geschrieben am: 16.03.2016 12:14:19

Hallo,
ich habe folgendes Makro zusammengebastelt, um aus einer Excel-Tabelle per Klick auf einen Button automatisch eine csv-Datei auf eine USB-Stick zu speichern. Dabei werden bei allen Zahlen noch Punkte gegen Kommas ausgetauscht und als Trennzeichen zwischen den einzelnen Zellen Semikons eingefügt.

Leider gibt es mit den letzten Zeilen Probleme. Manchmal fehlt die letzte oder auch vorletzte Zeile und in der letzten kopierten Zeile werden nicht alle Zell-werte übertragen. Ich konnte noch keinen Fehler finden, obwohl ich den Tabellen-Umfang und Inhalt schon variiert habe, es an zwei unterschiedlichen Rechnern und mit unterschiedlichen USB-Sticks getestet habe.

Hilfe, seht Ihr den Fehler?

Sub MessDatenExport()  'Diese 

Sub exportiert Tabelle als .csv

Dim DatumZeit As String
'Dim tFile As String
   
   DatumZeit = "_" & Format(Now, "yyyy") & "_" & Format(Now, "mm") & "_" & Format(Now, "dd") & " _
 _
_time_" & Format(Now, "hh") & "_" & Format(Now, "nn") & "_" & Format(Now, "ss")
        
    Application.ScreenUpdating = False ' den Bildschirm-Update unterdrücken
    
   Dim ExpFileName As String, ExpPfad As String
   Dim Delimiter As String
   Dim strZe As String
   
   Dim wert As String
   
   Dim lRow As Long, lCol As Integer
   Dim Ze As Long, Sp As Integer
   Dim ff As Integer
   
         
   ExpPfad = "e:\" 'öffnet richtiges Verzeichnis
   ExpFileName = ExpPfad & ActiveSheet.Name & DatumZeit & ".csv" 'generiert Dateinamen mit  _
Datum und Zeit
   Delimiter = ";"  'das erforderliche Trennzeichen ";"
   With ActiveSheet
      lRow = .Cells.Find(what:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
      lCol = .Cells.Find(what:="*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious). _
Column
      
      ff = FreeFile 'offener Dateityp
      Open ExpFileName For Output As #ff 'hier Datei als offener Dateityp exportiert
      
      For Ze = 1 To lRow            '' Zeile für Zeile lesen und schreiben ...
         For Sp = 1 To lCol - 1     'beginnend mit Zeile 1 wird Zelle für Zelle der Inhalt an "  _
_
Wert" übergeben und
            wert = .Cells(Ze, Sp)   'alle Punkte durch Kommas ersetzt
            wert = Replace(wert, ".", ",")
            strZe = strZe & wert & Delimiter    'dann wird der neue Wert an den Zeilenstring  _
angehängt + Semikolon
         Next Sp
            
         wert = .Cells(Ze, Sp)      'alles einmal wiederholen für die letzte Zeile
         wert = Replace(wert, ".", ",")
         strZe = strZe & wert
         
         Print #ff, strZe           'fertige Zeile in csv-Datei kopiert
         strZe = ""                 'Zeilen-String leeren und mit neuer Zeile weiterarbeiten
      Next Ze
   
   End With
   
   ActiveSheet.Range("A1").Select
   Application.ScreenUpdating = True        'aktiviert den Bildschirm-Update
 
End Sub
Unter diesem Pfad ist eine Beispieldatei mit Daten:

"https://www.herber.de/bbs/user/104375.xlsm"

  

Betrifft: AW: csv Export unvollständig von: Werner
Geschrieben am: 16.03.2016 12:32:35

Hallo Kati,

solltest du Excel nicht mitteilen, wo die letzte Zeile/Spalte ermittelt werden soll?

With ActiveSheet
lRow=.Columns(1).Find(what:="?*",LookIn:=xlValues,lookat:=xlWhole,searchdirection:=xlPrevious). _
Row
lCol=.Rows(1).Find(what:="?",LookIn:=xlValues,lookat:=xlWhole,searchdirektion:=xlPrevious).Column
Im Beispiel wird die letzte Zeile in Spalte A und die letzte Spalte in Zeile 1 gesucht.

Gruß Werner


  

Betrifft: kleines Detail von: Michael
Geschrieben am: 16.03.2016 14:26:58

Hi zusammen,

Daniels Vorschlag besticht natürlich durch seine Einfachheit.

Hier nur der Vollständigkeit halber eine andere Schreibweise für die innere Schleife:
         For sp = 1 To lcol   ' ohne minus 1
            wert = .Cells(Ze, sp)   'alle Punkte durch Kommas ersetzt
            wert = Replace(wert, ".", ",")
            strze = strze & wert
            If sp < lcol Then strze = strze & Delimiter
         Next sp
Und: es sollte schneller gehen, wenn man alle Werte zunächst in ein Array steckt.

Schöne Grüße,

Michael


  

Betrifft: AW: kleines Detail von: kati
Geschrieben am: 16.03.2016 18:38:08

Danke, super Antwort. Mit dem Close funktioniert es jetzt. Der Vorschlag mit SaveAs ist wirklich schön. Hatte ich vorher auch schon getestet. Local true kann ich aber nicht verwenden, weil bei dem Rechner alles auf Englisch eingestellt ist, damit unsere Messoftware richtig läuft.

Vielen, vielen Dank!
Kati


  

Betrifft: AW: csv Export unvollständig von: Daniel
Geschrieben am: 16.03.2016 12:32:36

Hi

ich sehe da jetzt auch keinen Fehler, allerdings fehlt ein ordnungsgemäßer Abschluss mit Close #ff

allerdings würde ich da nicht so aufwenig programmieren, sondern den Inhalt des Blattes in eine neue Datei kopieren und diese mit SaveAs und FileFormat:=xlCSV als solche Datei abspeichern.
Damit auch die Deutschen CSV-Einstellungen verwendet werden (Semikolon als Trenn- und Komma als Dezimalzeichen), kannst du zusätzlich die Option Local:=True verwenden:

ActiveSheet.Copy
ActiveWorkbook.SaveAs FileName:="hier Pfad und Dateiname", Fileformat:=xlCSV, Local:=True
ActiveWorkbook.Close False
das ActiveSheet.copy kopiert das Tabellenblatt in eine neue Datei, diese wird dann als CSV gespreichert.

Gruß Daniel


  

Betrifft: AW: csv Export unvollständig von: kati
Geschrieben am: 16.03.2016 18:35:30

Danke, super Antwort. Mit dem Close funktioniert es jetzt. Dein Vorschlag mit SaveAs ist wirklich schön. Hatte ich vorher auch schon getestet. Local true kann ich aber nicht verwenden, weil bei dem Rechner alles auf Englisch eingestellt ist, damit unsere Messoftware richtig läuft.

Vielen, vielen Dank!
Kati


 

Beiträge aus den Excel-Beispielen zum Thema "csv Export unvollständig"