toepfi
Goto Top

VBA Skript zum Import von CSV-Dateien

Schönen guten Morgen!
Ich habe ein kleines VBA Problem und komme nicht wirklich weiter... Deswegen bin ich auf eure Hilfe angewiesen... Ich habe Google schon ausgiebig durchforstet aber das passende war nicht dabei, oder ich habe nach den falschen Begriffen gesucht.
Nun zum Problem:
Ich bekomme jeden Tag eine CSV-Datei in der Infos stehen über am Vortag erreichte Events es werden jeden Tag unterschiedlich viele erreicht (Es gibt zwei Arten; A und B). Am Ende des Monats muss ich die auswerten. Dafür muss ich, weil das im Prozess so festgelegt ist, alle A-Events (B ist völlig egal) in eine Excel-Liste verschieben (komplette Zeile). Das A steht dabei als Text in der Liste. Das händisch zu machen ist mega aufwendig, deswegen das Skript.
Ein S-Verweis fällt weg weil das Kriterium WBA in Spalte H stehe und ich nicht weiß, wie ich das für den Vorgang selbst ändern kann und dann wieder zurück ändern kann... Und S-Verweis ja nur in der 1. Spalte sucht.
Zum Einlesen des Datei-Pfads wollte ich Application.FileDialog nehmen, weil der sich jeden Monat ändern und die Dateien immer mit dem Datum versehen werden an dem sie erstellt wurden...
Ich hoffe, dass ist detailliert genug und ihr könnt mir helfen.
Meine VBA-Kenntnisse sind auch leider nicht so dolle...

Vielen lieben Dank im Voraus für eure Hilfe!!!

Toepfi

Content-Key: 331369

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

Printed on: April 25, 2024 at 20:04 o'clock

Member: emeriks
emeriks Mar 07, 2017 at 07:52:43 (UTC)
Goto Top
Hi,
vielleicht solltest Du mal posten, was Du schon hast.

E.
Mitglied: 132272
Solution 132272 Mar 07, 2017 updated at 07:59:07 (UTC)
Goto Top
Ich habe Google schon ausgiebig durchforstet aber das passende war nicht dabei, oder ich habe nach den falschen Begriffen gesucht.
Wieso so weit weg schweifen, die Lösungen sind doch en masse so nah face-wink, ein Beispiel von vielen:
Excel Makro um CSV Dateien auszuwerten und gesammelt anzuzeigen.

Gruß
Member: Toepfi
Toepfi Mar 07, 2017 at 08:01:51 (UTC)
Goto Top
Waren es doch die falschen Sachen bei Google face-wink Tausend Dank! Das werde ich gleich mal probieren.
Member: Toepfi
Toepfi Mar 07, 2017 at 09:11:48 (UTC)
Goto Top
Also das ist ein Traum! Vielen Dank dafür! Was ich allerdings bei diesem Skript nicht verstehe ist, es kopiert mir alle, die die Bedingung B haben rechts neben die der Bedingung A... Und beim festlegen des Zielarbeitsblatt erstellt es ein neues Tabellenblatt und verwendet nicht das vorhandene... Denn wenn ich mit ActiveWorkbook.Worksheets("Tabelle1") arbeite dann überschreibt er mir ja immer alles, was da bisher drin steht... Kannst du mir da noch kurz helfen?
Skript sieht quasi unverändert aus
Sub ImportCSVFromFolder()
    Dim wsTemp As Worksheet, wsTarget As Worksheet, curCell As Range, CSVPFAD As String, fso As Object, f As Object, strCSVDelimiter As String
    
    With Application.FileDialog(msoFileDialogFolderPicker)
        .InitialFileName = "C:\Users\59\Desktop\CSV"  
        .Title = "Ordnerauswahl"  
        .ButtonName = "Auswahl..."  
        .InitialView = msoFileDialogViewList
        If .Show = -1 Then
            CSVPFAD = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With
    
    'Legt das CSV-Trennzeichen für die Dateien fest  
    strCSVDelimiter = ";"  
    
    Set fso = CreateObject("Scripting.Filesystemobject")  
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    
    'Zielarbeitsblatt für die importierten Daten  
    Set wsTarget = ActiveWorkbook.Worksheets("Tabelle1")  
    'temporäres Arbeitsblatt für den Import der Daten erstellen  
    Set wsTemp = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    
    'Inhalt des Zusammenfassungsblattes löschen  
    wsTarget.UsedRange.Clear
    
    'Startausgabezelle festlegen  
    Set curCell = wsTarget.Range("A1")  
    For Each f In fso.GetFolder(CSVPFAD).Files
        If LCase(fso.GetExtensionName(f.Name)) = "csv" Then  
            'Temporäres Sheet löschen  
            wsTemp.UsedRange.Clear
            'CSV-Daten in Temporäres Sheet importieren  
            With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & f.Path, Destination:=wsTemp.Range("$A$1"))  
                .Name = "import"  
                .FieldNames = True
                .AdjustColumnWidth = True
                .RefreshPeriod = 0
                .TextFilePlatform = xlWindows
                .TextFileStartRow = 2
                .TextFileParseType = xlDelimited
                .TextFileTextQualifier = xlTextQualifierDoubleQuote
                .TextFileOtherDelimiter = strCSVDelimiter
                .Refresh BackgroundQuery:=False
                .Delete
            End With
            
            With wsTemp
                'Daten nach dem Wort "FEHLER" in der zweiten SPALTE der CSV filtern und in Zielsheet kopieren  
                .UsedRange.AutoFilter
                .UsedRange.AutoFilter Field:=8, Criteria1:="A"  
                .UsedRange.SpecialCells(xlCellTypeVisible).Copy curCell
            End With
            'Ausgabezeile eins nach unten schieben  
            Set curCell = wsTarget.Cells(wsTarget.UsedRange.Rows.Count + 2, 1)
        End If
    Next
    'Temporäres Sheet löschen  
    wsTemp.Delete
    'Spalten anpassen  
    wsTarget.Columns.AutoFit
    
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "Vorgang beendet!", vbInformation  
    Set fso = Nothing
End Sub
Vielen lieben herzlichen Dank!!!!
Mitglied: 132272
Solution 132272 Mar 07, 2017 updated at 09:22:25 (UTC)
Goto Top
Du sprichst in Rätseln.
Was ich allerdings bei diesem Skript nicht verstehe ist, es kopiert mir alle, die die Bedingung B haben rechts neben die der Bedingung A...
Kann nicht sein, denn in Zeile 59 wird die Ausgabezelle immer nach unten verschoben.
Und beim festlegen des Zielarbeitsblatt erstellt es ein neues Tabellenblatt und verwendet nicht das vorhandene...
Doch, wozu heißt das temporäre Sheet wohl wsTemp, weil es nur temporär gebraucht wird um die Daten vorher zu filtern und dann in das Zielsheet zu kopieren. Außerdem wird das Sheet ja am Ende wieder gelöscht (s. Zeile 63)!

Denn wenn ich mit ActiveWorkbook.Worksheets("Tabelle1") arbeite dann überschreibt er mir ja immer alles, was da bisher drin steht...
Das ist klar weil in Zeile 29 der Inhalt des Sheets gelöscht wird, steht ja auch im Kommentar!! Also nimm die Zeile raus und ermittle in Zeile 32 die letzte belegte Zelle. Jeder braucht es halt anders.
Set curCell = wsTarget.Cells(Rows.Count,"A").End(xlUp).Offset(1,0)  
Member: Toepfi
Toepfi Mar 07, 2017 at 09:50:02 (UTC)
Goto Top
Sorry, in Rätseln wollte ich nicht sprechen!
Kann nicht sein, denn in Zeile 59 wird die Ausgabezelle immer nach unten verschoben.
Das stimmt, trotzdem werden die links daneben kopiert... Aber ich kann ja einfach alle Felder rechts von Spalte j löschen.

Doch, wozu heißt das temporäre Sheet wohl wsTemp, weil es nur temporär gebraucht wird um die Daten vorher zu filtern und dann in das Zielsheet zu kopieren. Außerdem wird das Sheet ja am Ende wieder gelöscht (s. Zeile 63)!
Stimmt, das habe ich falsch interpretiert. Sorry!

Das ist klar weil in Zeile 29 der Inhalt des Sheets gelöscht wird, steht ja auch im Kommentar!! Also nimm die Zeile raus und ermittle in Zeile 32 die letzte belegte Zelle. Jeder braucht es halt anders.
Mega gut!!!! Danke dir!!!!!
Mitglied: 132272
132272 Mar 07, 2017 updated at 10:03:40 (UTC)
Goto Top
Das stimmt, trotzdem werden die links daneben kopiert...
Tja was erwartest du denn anderes von
.UsedRange.SpecialCells(xlCellTypeVisible).Copy curCell
als das er die ganze Zeile kopiert?? face-big-smile

Doku => "UsedRange" nachschlagen und schlauer sein!
https://msdn.microsoft.com/de-de/library/office/ff840732.aspx
Member: Toepfi
Toepfi Mar 07, 2017 at 10:34:53 (UTC)
Goto Top
Danke dir!!!!!

Es macht jetzt genau das, was ich wollte!!! Vielen lieben Dank!!!