Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Skript für den Import von csv Daten in jeweils neue Spalte einer xlsm bzw xlsx Datei

Frage Microsoft Microsoft Office

Mitglied: ZippoeX

ZippoeX (Level 1) - Jetzt verbinden

03.06.2014, aktualisiert 05.06.2014, 1320 Aufrufe, 12 Kommentare, 2 Danke

Hallo zusammen,

bin neu hier und hoffe mal, dass ich nicht die Antwort auf meine Frage hier in dem Forum vielleicht übersehen habe.
Falls doch bin ich natürlich über einen Hinweis dankbar!

Zur Frage:

Eine Software gibt mir je Versuch eine .csv Datei mit jeweils einer Spalte und unterschiedlicher Zeilenanzahl in einem Ordner gesammelt aus.
Ich möchte nun, die .csv Daten so importieren, dass diese (geordnet nach aufsteigendem numerischen Namen der .csv Dateien) jeweils eine neue Spalte in einer "normalen" .xlsx/xlsm Excel-Arbeitsmappe (benutze 2013) darstellen.

Ein relativ ähnliches Problem wurde hier:
http://www.administrator.de/frage/alle-csv-dateien-in-einem-ordner-mit- ...
bzw hier:
http://www.administrator.de/frage/alle-csv-dateien-in-einem-ordner-mit- ...
gelöst, jedoch kann ich den Code nicht erfolgreich ablaufen lassen. (Ja habe den Dateipfad geändert :D)

Falls mir jemand weiterhelfen könnte wäre ich sehr dankbar!


Beste Grüße!
Mitglied: Eintagsfliege
LÖSUNG 03.06.2014, aktualisiert 05.06.2014
Hallo ZippoeX!

Mit aufsteigend numerischen Namen in etwa so (Macro in *.xlsm):
01.
Option Explicit 
02.
Option Compare Text 
03.
 
04.
Const CsvFolder = "E:\Test\Csv" 
05.
 
06.
Sub CsvImport() 
07.
    Dim oFso As Object, oFile As Object, aText As Variant 
08.
    Dim ColCount As Long, i As Long 
09.
     
10.
    Set oFso = CreateObject("Scripting.FileSystemObject") 
11.
     
12.
    ActiveSheet.UsedRange.ClearContents 
13.
     
14.
    ColCount = 1 
15.
     
16.
    For Each oFile In oFso.GetFolder(CsvFolder).Files 
17.
        If oFso.GetExtensionName(oFile.Name) Like "csv" Then 
18.
            aText = Split(oFso.OpenTextFile(oFile.Path).ReadAll, vbNewLine) 
19.
             
20.
            Cells(1, ColCount).Value = oFso.GetBaseName(oFile.Name) 
21.
         
22.
            For i = 0 To UBound(aText) 
23.
                If aText(i) <> "" Then 
24.
                    Cells(i + 2, ColCount).Value = Trim(aText(i)) 
25.
                End If 
26.
            Next 
27.
            ColCount = ColCount + 1 
28.
        End If 
29.
    Next 
30.
End Sub
Grüße Dieter
Bitte warten ..
Mitglied: ZippoeX
03.06.2014, aktualisiert um 17:56 Uhr
Vielen Dank, das sieht sehr sehr vielversprechend aus!

Excel möchte das jetzt allerdings alles in eine Zeile schreiben (seltsamerweise mit Ausnahme von Spalte 4?!) und da die Zahlen nicht wirklich durch einen Tabstop o.ä. getrennt sind, fällt mir das Trennen schwer. Theoretisch könnte man nach dem Muster "abcdef,xy" trennen, da alle Zahlen (bis auf die Runden) zwei Nachkommastellen haben. Der Zahlenbereich davor kann für abcd auch 0 annehmen und die ganze Zahl auch negativ sein, daher fällt mir gerade nichts ein zum effektiven Trennen.

Nachtrag: Ich denke es hängt mit dem Eintrag der 1. Zeile in den csv Dateien zusammen. der ist nämlich "blablabla" für alle csv's außer für die 4. Datei wo es einfach nur blablabla ohne Anführungszeichen ist. (warum auch immer; vermutlich am einfachsten die " " zu entfernen)
Nachtrag2: Die Gänsefüße sind nur in der xlsm zu finden, das Format ist angeblich auch "Standard" in den csv's (einschließlich Nr. 4)

Besten Dank aber auf jeden Fall für das Skript schon soweit!
Bitte warten ..
Mitglied: Eintagsfliege
03.06.2014 um 18:29 Uhr
Hallo ZippoeX!

Eine Software gibt mir je Versuch eine .csv Datei mit jeweils einer Spalte und unterschiedlicher Zeilenanzahl in einem Ordner gesammelt aus.
Darunter verstehe ich etwas in dieser Art:
01.
Wert_Zeile1 
02.
Wert_Zeile2 
03.
...
Wenn es so aufgebaut ist:
01.
Wert1;Wert2;Wert...
Dann sind das mehrere Spalten?

Grüße Dieter
Bitte warten ..
Mitglied: ZippoeX
03.06.2014 um 18:58 Uhr
Ja deine Ansicht stimmt auf jeden Fall!
In den csv's ist jeweils eine Spalte mit jeweils einem Datenpunkt je Zeile (Muss also nicht mit Text in Spalten aufgetrennt werden!) Diese eine Spalte möchte ich quasi einfach nur kopieren: dh A:A aus csvnr1 wird A:A in der xslm; A:A aus csvnr2 wird B:B in der xslm usw...

Momentan sieht das für alle csv's außer csvnr4 leider so aus.

01. Wert_Zeile1WertZeile2WertZeile3....
02. leer

d.h. das Skript schreibt mir beispielsweise die Spalte aus csvnr1 in A2 und gibt mir die Spalte aus csvnr2 in Zeile B2 aus. Das seltsame ist nur, dass es das nicht für csvnr4 tut, wo die Spalte aus csvnr4 (A:A) perfekt in D:D der xlsm abgebildet wird. Die Ausgabe Specimen mit csvnr funktioniert für alles csv's wunderbar, d.h. ist in den Spalten jeweils in Zeile 1.

Vielleicht liegt es an meinen Excel-Einstellungen?
Bitte warten ..
Mitglied: Eintagsfliege
03.06.2014 um 20:09 Uhr
Hallo ZippoeX!

Und in den Zeilen in der Art
01.
Wert_Zeile1WertZeile2WertZeile3
gibt es keine String-Quoten (") oder sonstiges konstantes Muster z.B ein Komma mit immer gleicher Stellenanzahl o.ä.?

Grüße Dieter
Bitte warten ..
Mitglied: ZippoeX
03.06.2014 um 20:30 Uhr
Nope, das einzig (in den meisten Fällen) wiederkehrende Muster ist, dass die Zahlen zwei Nachkommastellen haben...
Was mich wie schon vorhin erwähnt sehr verwundert ist der Umstand, dass nur für csvnr4 in der 2. Zeile: YG-584 ohne Anführungszeichen anzeigt und der Rest dann in den kommenden Zeilen angezeigt wird und beim Rest der csvs in der xsml: "YG-584"Wert1.1_Wert1.2_Wert1.3 usw...
Bitte warten ..
Mitglied: Eintagsfliege
03.06.2014, aktualisiert 04.06.2014
Hallo Zippoe!

Deine Kommentare kann ich nach Tests mit Deinen Csv-Dateien nicht nachvollziehen, denn alle Csv-Dateien enthalten tatsächlich nur eine Spalte (siehe Text-Editor mit Zeilenumbruch). Allerdings sind die Dateinamen sehr lang und die Spaltenbreiten müssten dementsprechend angepasst werden. Brauchst Du in der 1. Zeile den ganzen Dateinamen oder reicht ein Teil zwischen den (_)-Zeichen?

Die 1. Zeile der Csv-Dateien mit "YG-585-A" kann man, sofern sie nicht benötigt wird, einfach überspringen?

Da die Csv.Dateien allerdings außer Zahlen im Format '1234.12' auch Werte wie z.B. '25. Mai' oder 'Apr 15' beinhalten, stellt sich mir die Frage, ob diese Csv-Dateien per Excel erstellt wurden und die Zellen nicht als Zahlen formatiert waren/sind, was dann zu Fehlinterpretationen mit Datumswerten führt?

Außerdem sind die Zahlenwerte in den Csv-Dateien unterschiedlich d. h. mal mit Punkt und mal mit Komma (siehe Datei 4), was ja auch nicht so optimal ist?

Grüße Dieter
Bitte warten ..
Mitglied: ZippoeX
04.06.2014, aktualisiert um 11:48 Uhr
Ich benötige den Dateinamen eigentlich gar nicht zwingend, solange die csvs in der richtigen Reihenfolge gelistet sind.

Habe in csvnr4 punkte durch kommata ersetzt! (wollte ich eigentlich nicht abspeichern) Habe so viele Daten gestern angeschaut, dass es mir garnicht mehr aufgefallen ist. Also muss ich vermutlich meinem Excel nur beibringen dass ich das englische Format mit Kommata/Punkten nehme und dann sollte dein Skript funktionieren!

Das ist vermutlich tatsächlich das hüpfende Komma mit der Zahlenerkennung...

Nachtrag: Gerade getestet...funktioniert nicht :/
Bitte warten ..
Mitglied: Eintagsfliege
04.06.2014 um 12:30 Uhr
Hallo ZippoeX!

Also muss ich vermutlich meinem Excel nur beibringen dass ich das englische Format mit Kommata/Punkten nehme und dann sollte dein Skript funktionieren!
Die Punkte durch Komma zu ersetzen wäre beim importieren nicht das Problem, sondern eher die Zeilen, in denen beim Export in die Csv-Dateien verschiedene Zahlenwerte mit Punkt als Datum ('Apr 15' oder '31. Mai') interpretiert worden sind.

Wenn also in einer deutschen Excel-Version die Zellen vor dem Einfügen ein Standardformat haben, dann werden z.B. Werte wie 4.15 als 'Apr 15' oder 31.5 als '31. Mai' übernommen, was wiederum bedeutet, dass der interne Zellwert (cell.Value) einen ganz anderen Wert enthält und zwar '42095' (=01.04.2015) anstatt '4.15' und '41790' (=31.05.2014) anstatt 31.5...

Grüße Dieter
Bitte warten ..
Mitglied: ZippoeX
04.06.2014, aktualisiert um 13:51 Uhr
Mh okay, da es ja in meinem Fall relativ viele Datenpunkte gibt, könnte ich die Datumsangaben auch einfach ausklammern, da ich keinen Weg sehe wie das anders in die csv geschrieben werden sollte...

Bliebe trotzdem noch das Zeilenproblem :/

EDIT: ALSO habe mir die csvs ohne den YG header ausgeben lassen und das Format der Zahlenerkennung umgestellt. Habe jetzt keine Datumsangaben mehr in den csvs. Import klappt auch reibungslos.
ABER: Das VBA-Skript schreibt weiterhin leider nur alles in Zeile 2
Bitte warten ..
Mitglied: Eintagsfliege
LÖSUNG 04.06.2014, aktualisiert 05.06.2014
Hallo ZippoeX!

OK, ich hatte angenommen das die Csv-Dateien eventuell per Excel erstellt worden sind und dann hätte man an dieser Stelle etwas ändern müssen...

Hier mal ein Code, der zum einen die Punkte durch Komma und die Datumswerte durch Zahlenwerte ersetzt. Die erste Zeile mit den Dateinamen lasse ich jetzt mal in gekürzter Form ala 'Csv-001' drinn und die erste Zeile der Csv-Datei mit "YG-585-A" wird übersprungen:
01.
Option Explicit 
02.
Option Compare Text 
03.
 
04.
Const CsvFolder = "E:\Test\Csv" 
05.
 
06.
Public Sub CsvImport() 
07.
    Dim oFso As Object, oFile As Object 
08.
    Dim aTemp As Variant, aText As Variant 
09.
    Dim sText As String, sValue As String 
10.
    Dim dValue As Double, iColCount As Long, iRowStart As Long, i As Long 
11.
     
12.
    Set oFso = CreateObject("Scripting.FileSystemObject") 
13.
     
14.
    ActiveSheet.UsedRange.ClearContents 
15.
     
16.
    Application.ScreenUpdating = False 
17.
     
18.
    iColCount = 1 
19.
     
20.
    For Each oFile In oFso.GetFolder(CsvFolder).Files 
21.
        If oFso.GetExtensionName(oFile.Name) Like "csv" Then 
22.
            sText = oFso.OpenTextFile(oFile.Path).ReadAll 
23.
            aText = Split(Replace(sText, vbCr, ""), vbLf) 
24.
             
25.
            aTemp = Split(Split(oFso.GetBaseName(oFile.Name), ".")(0), "_") 
26.
             
27.
            Cells(1, iColCount).Value = "Csv-" & aTemp(UBound(aTemp)) 
28.
         
29.
            iRowStart = IIf(IsNumeric(aText(0)), 2, 1) 
30.
             
31.
            For i = 2 - iRowStart To UBound(aText) 
32.
                sValue = aText(i) 
33.
                If sValue <> "" Then 
34.
                    If IsNumeric(sValue) Then 
35.
                        dValue = CDbl(Replace(sValue, ".", ",")) 
36.
                    Else 
37.
                        dValue = GetDoubleValue(sValue) 
38.
                    End If 
39.
                     
40.
                    Cells(iRowStart + i, iColCount).Value = dValue 
41.
                End If 
42.
            Next 
43.
            iColCount = iColCount + 1 
44.
        End If 
45.
    Next 
46.
 
47.
    ActiveSheet.UsedRange.NumberFormat = "#,##0.00" 
48.
     
49.
    Application.ScreenUpdating = True 
50.
End Sub 
51.
 
52.
'Konvertiert Formate wie '15. Mai' oder 'Apr 15' in Zahlenwerte 
53.
Private Function GetDoubleValue(ByVal sValue As String) As Double 
54.
    Dim aTemp As Variant, aMonths As Variant 
55.
     
56.
    aTemp = Split(sValue) 
57.
     
58.
    If UBound(aTemp) = 0 Then 
59.
        aTemp = Split(sValue, ".") 
60.
    End If 
61.
     
62.
    If UBound(aTemp) = 1 Then 
63.
        aMonths = Array("jan", "feb", "mrz", "apr", "mai", "jun", "jul", "aug", "sep", "okt", "nov", "dez") 
64.
         
65.
        With WorksheetFunction 
66.
            If Not IsNumeric(aTemp(0)) Then 
67.
                GetDoubleValue = CDbl(.Match(Trim(aTemp(0)), aMonths, 0) & "," & aTemp(1)) 
68.
            ElseIf Not IsNumeric(aTemp(1)) Then 
69.
                GetDoubleValue = CDbl(aTemp(0) & "," & .Match(Trim(aTemp(1)), aMonths, 0)) 
70.
            End If 
71.
        End With 
72.
    End If 
73.
End Function
EDIT: ALSO habe mir die csvs ohne den YG header ausgeben lassen und das Format der Zahlenerkennung umgestellt. Habe jetzt keine Datumsangaben mehr in den csvs. Import klappt auch reibungslos. ABER: Das VBA-Skript schreibt weiterhin leider nur alles in Zeile 2
Kann ich irgendwie nicht nachvollziehen, mein Ergebnis anhand Deiner Csv-Dateien sieht bei mir in etwa so aus:
80296cbfb33c18b9b362e4e1f0c581d8 - Klicke auf das Bild, um es zu vergrößern

Grüße Dieter

[edit]
Code insoweit geändert, das der Import der Csv-Dateien in Abhängigkeit davon, ob sich in der 1. Zeile ein Zahlenwert oder ein Text befindet, entweder ab der 1. Zeile oder ab der 2.Zeile beginnt.
[/edit]
[edit2]
Code insoweit geändert, dass sowohl vbCrLf als auch (nur) vbLf als Zeilenumbrüche erkannt werden
[/edit2]
Bitte warten ..
Mitglied: Eintagsfliege
04.06.2014, aktualisiert um 20:04 Uhr
Hallo ZippoeX!

Also, die Csv-Dateien die Du mir zuletzt zugeschickt hast, werden bei mir genauso einwandfrei importiert, wie die vorhergehenden. Einziger Unterschied ist, dass die neueren Dateien im Gegensatz zu den anderen Dateien in der 1. Zeile keinen Text in der Form 'YG-585-A' haben, also bereits mit einem Zahlenwert beginnen.

Von daher habe ich den letzten Code insoweit geändert,dass je nach Inhalt der 1. Zeile (Zahl oder Text), die Csv-Dateien entweder ab der 1. Zeile oder ab der 2. Zeile importiert werden

Ob die Csv-Dateien nun Punkt, Komma oder Datumswerte enthalten oder nicht ist im Prinzip egal. D.h in beiden Fällen sollten die Daten richtig verarbeitet werden...

Grüße Dieter
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
VB for Applications
gelöst Excel VBA .csv Import in Tabelle x, ab Spalte y

Frage von drimrim zum Thema VB for Applications ...

Windows Server
Powershell Import-CSV Komma ausschreiben plus New-ADUser Pipen (3)

Frage von Freakazoid89 zum Thema Windows Server ...

Datenbanken
gelöst Import CSV in MYSQL (3)

Frage von schneerunzel zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...