Microsoft Excel

Herbers Excel/VBA-Archiv

Formatierungsproblem beim Einlesen von csv-Dateien

Betrifft: Formatierungsproblem beim Einlesen von csv-Dateien von: Hornung
Geschrieben am: 24.06.2015 21:48:21

Hallo zusammen,

ich habe mir folgenden Code "gebastelt", der mir effektiv
1. eine *.csv-Datei einliest
2. diese so formatiert, dass mehrere Spalten entstehen (anstatt zuvor durch Komma getrennt in einer Spalte)
3. das Ganze in eine Datei "eingelesen.xls" im selben Dateipfad kopiert.

Das klappt alles soweit. Jetzt habe ich aber das Problem, dass die einzulesenden *.csv-Dateien Spalten im Format "12.123" hat.
Mit meinem aktuellen Code wandelt Excel (vermutlich wegen der Formatierung "Standard" und nicht "Text") das ganze in eine unbrauchbare Zahl um.

Leider komme ich überhaupt nicht weiter, wie ich das lösen soll.

Mögliche Lösungsansätze meinerseits (die ich leider mit meinem VBA-Wissen nicht schaffe umzusetzen):

- ausgewählte *.csv-Datei zunächst so formatieren, dass alle "," = ";" und "." = ","
- generierte *.txt-Datei so formatieren, dass alle "," = ";" und "." = "," (wäre für mich vermutlich besser)


Sub einlesen()

  Dim wb As Workbook, wks As Worksheet, wbAktiv As Workbook, wksAktiv As Worksheet
  Dim rngZelle As Range
  Dim strVerzeichnis As String
  Dim Dateiname As Variant, DateinameTXT As String
 
 
    ChDrive "E"
    ChDir "E:\...\simu26"
    Dateiname = Application.GetOpenFilename(fileFilter:="CSV (*.csv), *.csv")
    If Dateiname = False Then Exit Sub
    strVerzeichnis = VBA.CurDir
    Set wbAktiv = ActiveWorkbook
    Set wksAktiv = ActiveSheet
    Set rngZelle = Worksheets("Tabelle1").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
    Application.ScreenUpdating = False
   
    
    VBA.FileCopy Source:=Dateiname, Destination:=Left(Dateiname, Len(Dateiname) - 3) & "txt" _

    DateinameTXT = Left(Dateiname, Len(Dateiname) - 3) & "txt"
    
    Application.Workbooks.OpenText Filename:=DateinameTXT, Origin:=xlWindows, _
          StartRow:=1, _
          DataType:=xlDelimited, ConsecutiveDelimiter:=False, _
          Tab:=False, _
          Semicolon:=False, _
          Comma:=True, _
          Space:=False, _
          Other:=False
    Set wb = ActiveWorkbook
    
    wb.Sheets(1).UsedRange.Copy
    rngZelle.PasteSpecial Paste:=xlPasteValues
    
    
    Application.CutCopyMode = False
    Set rngZelle = rngZelle.Offset(wb.Sheets(1).UsedRange.Rows.Count, 0)
    wb.Close savechanges:=False
    
    VBA.Kill (DateinameTXT)
    Application.ScreenUpdating = True
   

ActiveSheet.Copy

Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:="E:\...\simu26\eingelesen", FileFormat:=xlOpenXMLWorkbook
Application.DisplayAlerts = True

Application.DisplayAlerts = False
Application.Quit

End Sub



Ich wäre euch wirklich sehr dankbar, wenn ihr mir helfen könntet!

LG Marcel

  

Betrifft: AW: Formatierungsproblem beim Einlesen von csv-Dateien von: Michael
Geschrieben am: 25.06.2015 12:31:19

Hi Marcel,

wenn Du den Textimport händisch ausführst, gibt es irgendwo einen Button "Optionen", der zu einem Unterdialog führt, wo man das "Dezimalzeichen" einstellen kann, halt ob man "." oder "," hat.

Das Ganze mit Makrorekorder aufgezeichent und in Deinen Code eingefügt, sollte eigentlich tun: da werden dann nämlich viel mehr Optionen mit ausgegeben.

Relevat ist die Zeile: .TextFileDecimalSeparator = "."

Schöne Grüße,

Michael


  

Betrifft: AW: Formatierungsproblem beim Einlesen von csv-Dateien von: Hornung
Geschrieben am: 25.06.2015 18:10:57

Hallo,

vielen Dank für deine Antwort!

Der Makro-Recorder spuckt mir folgendes aus:

With Application
.DecimalSeparator = "."
.ThousandsSeparator = ","
End With


Ich habe die Zeilen jetzt so in den Code kopiert, dass dieser Teil für den ganzen Code gültig ist (also "with appliation" an den Anfang und "End with" ganz ans Ende).

Sonst wüsste ich nicht, wohin damit (hab leider noch nicht so den Durchblick bei VBA :/ )

Jetzt funktioniert die Aufteilung auf mehrere Spalten aber leider nicht mehr und das Problem mit der falschen Formatierung konnte ich so leider auch nicht lösen.


Kannst du mir vielleicht genau sagen, wohin damit oder was es noch an Möglichkeiten gäbe?

Viele Grüße
Marcel


  

Betrifft: AW: Formatierungsproblem beim Einlesen von csv-Dateien von: Michael
Geschrieben am: 25.06.2015 19:49:00

Hi Marcel,

Du hast ja jetzt *zweimal* das Komma verwertet, einmal als Spaltentrenner und einmal als Tausendertrennzeichen. Mach mal: .ThousandsSeparator=" "

Ansonsten poste bitte nochmal das ganze Ding,

schöne Grüße,

Michael


  

Betrifft: AW: Formatierungsproblem beim Einlesen von csv-Dateien von: Hornung
Geschrieben am: 25.06.2015 21:43:11

Hat mit deinem Vorschlag doch geklappt!
Hab da wohl erst was falsch gemacht.
Danke noch einmal und viele Grüße!
Marcel


  

Betrifft: AW: Formatierungsproblem beim Einlesen von csv-Dateien von: Hornung
Geschrieben am: 25.06.2015 21:52:49

Also hätte sogar auch mit dem "," geklappt, aber macht wohl trotzdem mehr Sinn das rauszunehmen.
Danke für den Tipp!

Eine Frage hätte ich noch: Warum kopiert der Code die Tabelle in die zweite Zeile abwärts vom erstellten Dokument? Kann nicht erkennen, warum das so ist bzw. wie ich es ändern kann (also, dass es direkt in die erste Zeile abwärts kopiert wird).

Sub einlesen()
   
With Application
.DecimalSeparator = "."
.ThousandsSeparator = ""
   
     Dim wb As Workbook, wks As Worksheet, wbAktiv As Workbook, wksAktiv As Worksheet
     Dim rngZelle As Range
     Dim strVerzeichnis As String
     Dim Dateiname As Variant, DateinameTXT As String
    
    
       ChDrive "E"
       ChDir "E:\...\"
       Dateiname = Application.GetOpenFilename(fileFilter:="CSV (*.csv), *.csv")
       If Dateiname = False Then Exit Sub
       strVerzeichnis = VBA.CurDir
       Set wbAktiv = ActiveWorkbook
       Set wksAktiv = ActiveSheet
       Set rngZelle = Worksheets("Tabelle1").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
       Application.ScreenUpdating = False
      
       
       VBA.FileCopy Source:=Dateiname, Destination:=Left(Dateiname, Len(Dateiname) - 3) & "txt"  _
_
   
       DateinameTXT = Left(Dateiname, Len(Dateiname) - 3) & "txt"
       
       Application.Workbooks.OpenText Filename:=DateinameTXT, Origin:=xlWindows, _
             StartRow:=1, _
             DataType:=xlDelimited, ConsecutiveDelimiter:=False, _
             Tab:=False, _
             Semicolon:=False, _
             Comma:=True, _
             Space:=False, _
             Other:=False
       Set wb = ActiveWorkbook
       
       wb.Sheets(1).UsedRange.Copy
       rngZelle.PasteSpecial Paste:=xlPasteValues
       
       
       Application.CutCopyMode = False
       Set rngZelle = rngZelle.Offset(wb.Sheets(1).UsedRange.Rows.Count, 0)
       wb.Close savechanges:=False
       
       VBA.Kill (DateinameTXT)
       Application.ScreenUpdating = True
      
   
   ActiveSheet.Copy
   
   Application.DisplayAlerts = False
   ActiveWorkbook.SaveAs Filename:="E:\...\eingelesen", FileFormat:=xlOpenXMLWorkbook
   Application.DisplayAlerts = True
   
   Application.DisplayAlerts = False
   Application.Quit
   
  End With
   
End Sub


Viele Grüße
Marcel


  

Betrifft: AW: Formatierungsproblem beim Einlesen von csv-Dateien von: Michael
Geschrieben am: 26.06.2015 14:44:24

Hi Marcel,

das kann ich jetzt auch nicht nachvollziehen.

Das mit dem Tausendertrennzeichen hatte ich übrigens hier nachgesehen:
https://www.herber.de/forum/archiv/1428to1432/1430780_Auswertung_von_mehreren_Dateien_mit_VBA.html#1430780

Sepp macht das mit einer Query; vielleicht schaust Du es Dir mal an, da kann man auch den range angeben, wo die Ausgabe hinsoll.

Abgesehen davon: wenn die aktuelle Variante tut, lösche doch einfach am Ende des Codes die erste Zeile...

Ich verstehe übrigens nicht den Sinn, quasi die komplette Prozedur in ein With zu klammern; nach meinem Dafürhalten gehören die zwei Anweisen in den Block von .Opentext, siehe hier:
https://www.herber.de/mailing/vb/html/xlmthopentext.htm

Schöne Grüße,

Michael


  

Betrifft: AW: Formatierungsproblem beim Einlesen von csv-Dateien von: Hornung
Geschrieben am: 28.06.2015 16:37:59

Danke dir Michael!


 

Beiträge aus den Excel-Beispielen zum Thema "Formatierungsproblem beim Einlesen von csv-Dateien"