br-mv2014
Goto Top

Alle CSV-Dateien in einem Ordner mit einem VBA Makro einlesen - Datumsformat weg??

Hallo allerseits,
ich bin neu hier, versuche mich nur gelegentlich in vba-progrämmchen und war erfreut hier unter

"Alle CSV-Dateien in einem Ordner mit einem VBA Makro einlesen"

eine gelungene Programmsequenz (colinardo am 29.08.2013 um 11:49 Uhr)

für meine Zwecke gefunden zu haben.Leider übernimmt die Anwendung beim Einsammeln der csv-Daten
in einer Spalte nicht das Datumsformat.Für meine weitere Anwendung in excell 2010 benötige ich das
aber unnbedingt. Im csv-Ausgangsformat verfügen dieselben Daten noch über ein gültiges Datumsformat.

Wäre schön, wenn mir einer der hiesigen Könner helfen könnte. Habe schon alles Möglich probiert und
durchsucht. Komme nicht weiter. Vieln Dank schon mal für jeden brauchbaren Tipp!


Arbeite mit Win7/ Office 2010

Ach ja: habe das bei mir wie folgt abgeändert:

Sub ImportiereCSVDateien()


Const CSVPFAD = "F:\FiBu\Konto-Auszüge\Konto-Auszüge 2013\TAe"
Dim wbTarget As Workbook, wbSource As Workbook, ws As Worksheet, ts As Worksheet
Set fso = CreateObject("Scripting.Filesystemobject")
Set wbTarget = ActiveWorkbook
Application.DisplayAlerts = False

'Lösche alle Worksheets bevor wir alle neu anlegen
While wbTarget.Worksheets.Count > 1
wbTarget.Worksheets(1).Delete
Wend

wbTarget.Worksheets(1).Name = "Zusammenfassung"
wbTarget.Worksheets(1).Range("A:ZZ").Clear
For Each f In fso.GetFolder(CSVPFAD).Files
If LCase(Right(f.Name, 3)) = "csv" Then
Workbooks.OpenText Filename:=f.Path
Set wbSource = ActiveWorkbook
On Error Resume Next
Set ws = wbTarget.Worksheets(f.Name)
If Err <> 0 Then
Set ws = wbTarget.Worksheets.Add
ws.Name = f.Name
ws.Range("A:ZZ").Clear
End If

wbSource.Worksheets(1).Range("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Semicolon:=True, TrailingMinusNumbers:=True
wbSource.Worksheets(1).Range("A:ZZ").Copy Destination:=ws.Range("A1")
wbSource.Close False
End If
Next
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Konto_Nr_setzen


Range("B2").Select
ActiveCell.FormulaR1C1 = "=IF(R1C2=""Textschlüssel"",IF(RC1>0,2,0),0)"
Range("B2").Select
Selection.Copy
Range("B3:B500").Select
ActiveSheet.Paste
Sheets("1004147623.csv").Select
Range("B2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=IF(R1C2=""Textschlüssel"",IF(RC1>0,3,0),0)"
Range("B2").Select
Selection.Copy
Range("B3:B500").Select
ActiveSheet.Paste
Sheets("1010415147.csv").Select
Range("B2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=IF(R1C2=""Textschlüssel"",IF(RC1>0,1,0),0)"
Range("B2").Select
Selection.Copy
Range("B3:B500").Select
ActiveSheet.Paste

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


Set ts = wbTarget.Worksheets("Zusammenfassung")
Dim curCell As Range
Set curCell = ts.Range("A1")
For i = 1 To wbTarget.Worksheets.Count - 1
maxRow = wbTarget.Worksheets(i).Range("A1").End(xlDown).Row
maxCol = wbTarget.Worksheets(i).Range("A1").End(xlToRight).Column
wbTarget.Worksheets(i).Range(wbTarget.Worksheets(i).Cells(1, 1), wbTarget.Worksheets(i).Cells(maxRow, maxCol)).Copy Destination:=curCell
Set curCell = curCell.End(xlDown).Offset(2, 0)
Next
Application.DisplayAlerts = True
Set fso = Nothing
Sheets("Zusammenfassung").Select


End Sub


VGe br-mv

Content-Key: 230428

Url: https://administrator.de/contentid/230428

Printed on: April 18, 2024 at 05:04 o'clock

Member: colinardo
colinardo Feb 20, 2014 at 08:38:57 (UTC)
Goto Top
Hallo br-mv,
dafür gibt es in der TextToColumn Funktion das Feld FieldInfo in dem man den Datentyp jeder einzelnen Spalte festlegen kann.
Wenn die Daten durch Trennzeichen getrennt sind, ist dieses Argument ein Array aus Arrays mit zwei Elementen. Jedes Array mit zwei Elementen gibt die Umwandlungsoptionen für eine bestimmte Spalte an. Das erste Element ist die Spaltennummer (beginnend mit 1), und das zweite Element ist eine der xlColumnDataType-Konstanten, die angeben, wie die Spalte analysiert wird.
die XlColumnDataType Konstanten sind folgende:
xlGeneralFormat. Allgemein 
xlTextFormat. Text  
xlMDYFormat. Datum im Format MTJ 
xlDMYFormat. Datum im Format TMJ 
xlYMDFormat. Datum im Format JMT 
xlMYDFormat. Datum im Format MJT 
xlDYMFormat. Datum im Format TJM 
xlYDMFormat. Datum im Format JTM 
xlEMDFormat. Datum im EMD-Format 
xlSkipColumn. Spalte überspringen 
so könnte dann die folgende Zeile aussehen die den Text in Spalten zerlegt:
Im Beispiel, wird für Spalte 1 das Textformat und für Spalte 2 ein Datumsformat festgelegt:
feldFormate = Array(Array(1,xlTextFormat),Array(2,xlDMYFormat))
wbSource.Worksheets(1).Range("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Semicolon:=True, TrailingMinusNumbers:=True, FieldInfo:=feldFormate  

Denke das sollte helfen face-wink

Grüße Uwe
Member: br-mv2014
br-mv2014 Feb 21, 2014 at 17:25:33 (UTC)
Goto Top
Hallo Uwe,

vielen herzlichen Dank für die prompte Hilfe. Habe die Programmsequenz gleich mal ausprobiert. Funktioniert einwandfrei, Datumsangaben werden jetzt korrekt importiert. Habe nun aber leider festgestellt, dass eine andere Spalte aus der csv-Datei ebenfalls nicht richtig interpretiert wird. Es handelt sich um Zahlen mit Währungszusatz "EUR" . Hier habe ich mittels Makro den Zusatz eliminieren können. Die verbleibenden Zahlenwerte lassen sich aber partout nicht in Zahlen formatieren. Seltsamer Weise gilt das nicht für alle Beträge innerhalb derselben Spalte. Andere werden erkannt Gibt es hierfür auch ein xl.???Format. für die Importfunktion? Habe das Netz schon durchsucht, werde aus den Beiträgen hierzu aber nicht schlau. Hoffe nochmals auf Hilfe.

VGe
Bernhard
Member: colinardo
Solution colinardo Feb 21, 2014, updated at Feb 23, 2014 at 22:18:39 (UTC)
Goto Top
auch schon mittels Trim() alle führenden und nachlaufenden Leerzeichen in den Spalten entfernt ? Danach solltest du eventuell noch die Werte via VBA in Zahlen wandeln und diesen Wert wieder der jeweiligen Zelle der Value-Eigenschaft zuweisen und das Zahlenformat für die Zellen explizit setzen.
Der Zahlenspalte solltest du die xlGeneralFormat Konstante zuweisen.
Kenne leider die Formatierung deiner CSV-Datei nicht, damit ich das mal nachstellen könnte, eventuell mal einen Ausschnitt davon irgendwo hochladen.
Wenn das bei dir alles nichts bei der Textimportfunktion hilft, bliebe als Option noch die CSV manuell via VBA zu parsen.

Grüße Uwe
Member: br-mv2014
br-mv2014 Feb 21, 2014 at 21:56:10 (UTC)
Goto Top
Naja, ob ich deine Vorschläge noch in diesem Jahr umgesetzt bekommen würde, weiß ich nicht?? Würde gern eine Muster-csv mal hochladen, geht das hier im Forum? Finde keine Option hierfür.

VG
Bernhard
Member: br-mv2014
br-mv2014 Feb 21, 2014 at 22:01:05 (UTC)
Goto Top
Die csv stammt übrigens aus der Export-Funktion von starmoney-business 6.0. Vielleicht kennst du das verwendete Datenformat. Ich möchte die Export-Daten unter Excel weiter aufbereiten.

VG
Bernhard
Member: colinardo
Solution colinardo Feb 22, 2014, updated at Mar 08, 2014 at 07:56:54 (UTC)
Goto Top
So, habe mal ein paar Tests gemacht... Die Spalte in der die Beträge stehen sollten als Dezimaltrennzeichen am besten einen Punkt haben, mit einem Komma hatte ich hier trotz gesetztem Parameter in der Funktion Probleme.
Habe dann die entsprechende Spalte nach dem Import folgendermaßen behandelt um den EUR-Wert und das Zell-Format (Währung) festzulegen (Spalte in Zeile 1 festlegen):
Die Variable ws entspricht dem Worksheet in dem die Daten formatiert werden.
Set rngStart = ws.Range("G1")  
Set rngEnd = rngStart.End(xlDown)
For Each cell In ws.Range(rngStart, rngEnd)
   normalizedValue = Trim(Replace(cell.Value, "EUR", "", 1, -1, 1))  
   normalizedValue = Replace(normalizedValue, ",", ".", 1, -1, 1)  
   cell.NumberFormat = "#,##0.00 $"     
   cell.Value = normalizedValue
Next


Aus Spaß habe ich mal eine manuelle CSV-Parse-Routine geschrieben (in die Excel nicht reinpfuscht face-wink ), die die Analyse der Zahlen selber vornimmt und aus dem Bereich gleichzeitig eine richtige Tabelle mit Spaltenfiltern macht.
Wie immer ohne Gewähr
Sub testImport()
    importCSV "C:\Temp\demo.csv", ";", ActiveSheet.Range("A1")  
End Sub

Function importCSV(strPath, delim, targetRange As Range)
    Set fso = CreateObject("Scripting.FileSystemObject")  
    Set regex = CreateObject("vbscript.regexp")  
    patNumber = "^([\d\.,\+\-]+)\s?(EUR|€|\$)$"  
    patDate = "^\d{2}\.\d{2}\.\d{2,4}$"  
    arrLines = Split(fso.OpenTextFile(strPath, 1).ReadAll(), vbNewLine, -1, vbTextCompare)
    Set rngCurrent = targetRange
    For i = 0 To UBound(arrLines)
        If arrLines(i) <> "" Then  
            cols = Split(arrLines(i), delim, -1, vbTextCompare)
            For c = 0 To UBound(cols)
                rngCurrent.Offset(0, c).ClearFormats
                wert = Trim(Replace(cols(c), """", "", 1, -1, vbTextCompare))  
                ' check for Numberformat  
                regex.Pattern = patNumber
                Set matches = regex.Execute(wert)
                If matches.Count > 0 Then
                    wert = Replace(matches(0).Submatches(0), ".", "", 1, -1, vbTextCompare)  
                    wert = Replace(wert, ",", ".", 1, -1, vbTextCompare)  
                    rngCurrent.Offset(0, c).NumberFormat = "#,##0.00 $;[RED]-#,##0.00 $"  
                End If
                'check for DateFormat  
                regex.Pattern = patDate
                Set matches = regex.Execute(wert)
                If matches.Count > 0 Then
                    wert = DateValue(matches(0))
                End If
                ' set value in cell  
                rngCurrent.Offset(0, c).Value = wert
            Next
            Set rngCurrent = rngCurrent.Offset(1, 0)
        End If
    Next
    ' Create ListObject table  
    targetRange.Worksheet.ListObjects.Add xlSrcRange, Range(targetRange, rngCurrent.Offset(0, targetRange.End(xlToRight).Column))
    
    Set fso = Nothing
    Set regex = Nothing
End Function
Grüße Uwe
Member: br-mv2014
br-mv2014 Feb 22, 2014 at 21:06:28 (UTC)
Goto Top
Hallo Uwe,
vielen Dank, dass du dir mit meinem Problem soviel Arbeit machst. Hatte nicht gesehen, dass du schon einen Lösungsvorschlag entworfen hattest. Habe den nun mit der übermittelten Musterdatei ausprobiert. Der Währungsbetrag kommt zwar ohne Währungsabgabe rüber, ist aber links ausgerückt und hat noch kein Zahlenformat. Lässt sich auch nicht als solches formatieren. Schade.

VGe
Bernhard
Member: colinardo
Solution colinardo Feb 23, 2014 updated at 22:18:24 (UTC)
Goto Top
Zitat von @br-mv2014:
Habe den nun mit der übermittelten Musterdatei ausprobiert. Der Währungsbetrag kommt zwar ohne
Währungsabgabe rüber, ist aber links ausgerückt und hat noch kein Zahlenformat. Lässt sich auch nicht als
solches formatieren. Schade.
Die Funktionen sind oben angepasst...hört sich jetzt blöd an, aber Excel hat Probleme mit den Kommas in den Beträgen, hier möchte es viel lieber Punkte sehen, diese umgewandelt und schon klappt es.

Grüße Uwe
Member: br-mv2014
br-mv2014 Feb 23, 2014 at 22:36:02 (UTC)
Goto Top
Hallo Uwe,

ist wirklich seltsam. Jetzt funktioniert der Import einwandfrei mit den gewünschten Formaten. Wäre ich vermutlich nicht drauf gekommen. Vielen Dank auch für diesen guten Tipp!

Gekonnt gelöst, wirklich!

VG
Bernhard