Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Zwei CSV vergleichen

Zwei CSV vergleichen
06.11.2013 15:06:59
Michael
Hallo Zusammen
Zu meinem Problem, bzw. meinem Vorhaben
Vorneweg. Ich bin leider nicht so erfahren mit VBA und welche Möglichkeiten sich mir da bieten. Daher dachte ich, ich probieres einmal in einem guten Forum und suche gute Ansätze oder gar Lösungen.
Ich habe zwei CSV-Files. A_2013-11-06.csv und C_2013-11-06.csv. Sie liegen aber in verschiedenen Ordnern und müssen verlichen werden.
Der User öffnet ein neue Arbeitsmappe und klickt auf das Makro.
Fileauswahl
Ich würde gerne mit folgendem Code den User wählen lassen, welches der A-Files er vergleichen mö _ chte.

ChDrive "D" 'zu Laufwerk wechseln
ChDir "D:\irgendwo\Ordner_A" 'zu Ornder A wechseln
FileName = Application.GetOpenFilename("A,*.csv", , "CSV auswählen")

Hat er nun eines gewählt, so soll automatisch das Pendant dazu (also das C.csv mit dem selben Datum wie des Gewählten A.csv) im anderen Ordner genommen werden.
Nun haben wir theoretisch beide Files. Bietet sich hier QueryTables an? Muss jedoch gestehen, das ich diese Funktion nicht durchschaut habe...
Datenvergleich
Da wir jetzt beide Files haben, bzw deren Daten kann man das ja vergleichen...
Alle Werte in Spalte B, welche in Spalte A eine "2" haben werden zwischen den beiden Files verglichen (die Daten in B können im selben File mehrmals vorkommen).
Fehlt nun in File C ein Wert, welcher in A vorhanden ist, so soll dieser Wert in das Excelfile geschriben werden. Somit sieht der User nun, welche Werte im File C im gegensatz zum File A verloren gegangen sind.
Fileaufbau
Hier noch etwas zur Verständlichkeit wie die Files ausschauen.
1;06.11.2013;15:00:00;;;
2;23456789;;0;;
2;23456789;;0;;
2;89784565;;0;;
2;35425778;;0;;
3;06.11.2013;15:00:00;;;
Fragen
Ich bin über jegliche Hilfestellungen und Denkanstösse froh, da ich momentan einfach nicht vom Fleck komme.
  • Hat jemand eine Idee wie ich das obige lösen kann?

  • Kann man die beiden Files in QueryTables oder ähnliches laden und dann diese miteinander vergleichen? - somit müsste ich nicht beide Files in ein drittes File einlesen und so vergleichen. Sondern alles geschieht sozusagen im Hintergrund und der User sieht dann nur noch das Ergebnis am Ende.

  • Wie kann ich das mit der Fileauswahl lösen? - Wie finde ich das Pendat zum gewählten File..?

  • Ich bedanke mich schon herzlich im Voraus für eure Mühen.
    Ich hoffe ich konnte das verständlich schildern und bei Rückfragen antworte ich gerne.

    Anzeige

    1
    Beitrag zum Forumthread
    Beitrag zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: Zwei CSV vergleichen
    06.11.2013 17:19:18
    Der
    Hallo Michael,
    hier mal ein entsprechendes Makro.
    Die Namen der Ordner und der Tabellenblätter muss du anpassen.
    Im Blatt mit den A-Daten werden in Spalte E di in den C-Daten fehlenden Datensätze markiert.
    Gruß
    Franz
    Sub Get_CSV_Data()
    ' Get_CSV_Data Makro
    Dim wksCSV_A As Worksheet, wksCSV_C As Worksheet
    Dim strDatei_A, strDatei_C
    Dim Zeile As Long
    Dim varWertB As Variant, rngWertB As Range, rngSuchC As Range
    Dim bolFound As Boolean, strAddress1 As String
    Const Ordner_A As String = "D:\Test\DatenNeu"       'Ordner mit den A-Dateien
    Const Ordner_C As String = "D:\Test\ZwischenOrdner" 'Ordner mit den C-Dateien
    Set wksCSV_A = Worksheets("A_CSV") 'Tabelleblatt für die A-Datei-Daten
    Set wksCSV_C = Worksheets("C_CSV") 'Tabelleblatt für die C-Datei-Daten
    'Datei A auswählen
    With Application.FileDialog(msoFileDialogOpen)
    .Title = "Bitte A-Datei auswählen"
    .AllowMultiSelect = False
    .FilterIndex = 6
    .InitialFileName = Ordner_A & "\A*"
    If .Show = -1 Then
    strDatei_A = .SelectedItems(1)
    'aus Datei-Name den Namen der C-Datei ermitteln und dann prüfen
    strDatei_C = Mid(strDatei_A, InStrRev(strDatei_A, "\") + 1)
    strDatei_C = "C" & Mid(strDatei_C, InStrRev(strDatei_C, "_"))
    strDatei_C = Ordner_C & "\" & strDatei_C
    If Dir(strDatei_C) = "" Then
    MsgBox "zur gewählten A-Datei """ & strDatei_A & """ gibt es keine C-Datei"
    GoTo Beenden
    End If
    Else
    GoTo Beenden
    End If
    End With
    With wksCSV_A
    .Cells.ClearContents
    With .QueryTables.Add(Connection:= _
    "TEXT;" & strDatei_A, Destination:=wksCSV_A.Range("$A$1"))
    .Name = "A_Datei"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 65001
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = True
    .TextFileCommaDelimiter = False
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 2, 1, 1, 1, 1)
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
    End With
    End With
    With wksCSV_C
    .Cells.Clear
    With .QueryTables.Add(Connection:= _
    "TEXT;" & strDatei_C, Destination:=wksCSV_C.Range("$A$1"))
    .Name = "C_2013-11-06"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 850
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = True
    .TextFileSemicolonDelimiter = True
    .TextFileCommaDelimiter = False
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 2, 1, 1, 1, 1)
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
    End With
    'Suchbereich in Spalte B
    Set rngSuchC = .Range(.Cells(1, 2), .Cells(.Rows.Count, 2).End(xlUp))
    End With
    'Daten in A mit Daten in C vergleichen
    With wksCSV_A
    For Zeile = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
    If .Cells(Zeile, 1).Value = 2 Then
    bolFound = False
    varWertB = .Cells(Zeile, 2).Value
    Set rngWertB = rngSuchC.Find(What:=varWertB, LookIn:=xlValues, lookat:=xlWhole)
    If rngWertB Is Nothing Then
    'do nothing
    Else
    strAddress1 = rngWertB.Address
    Do
    'prüfen, ob Wert in Spalte A der C-CSV = 2
    If rngWertB.Offset(0, -1) = 2 Then
    bolFound = True
    Exit Do
    End If
    'Suche wiederholen
    Set rngWertB = rngSuchC.FindNext(after:=rngWertB)
    Loop Until rngWertB.Address = strAddress1
    End If
    If bolFound = False Then
    'fehlenden Wert in Spalte E per Eintrag markieren
    .Cells(Zeile, 5).Value = "fehlt in C"
    End If
    End If
    Next Zeile
    .Activate
    End With 'wksCSV_A
    Beenden:
    End Sub
    

    Anzeige
    ;

    Forumthreads zu verwandten Themen

    Anzeige
    Anzeige
    Anzeige
    Anzeige

    Infobox / Tutorial

    Zwei CSV-Dateien vergleichen in Excel


    Schritt-für-Schritt-Anleitung

    Um zwei CSV-Dateien zu vergleichen, kannst Du die folgenden Schritte befolgen:

    1. Öffne Excel und erstelle eine neue Arbeitsmappe.
    2. Füge das folgende VBA-Makro ein:

      Sub Get_CSV_Data()
         Dim wksCSV_A As Worksheet, wksCSV_C As Worksheet
         Dim strDatei_A, strDatei_C
         Dim Zeile As Long
         Dim varWertB As Variant, rngWertB As Range, rngSuchC As Range
         Dim bolFound As Boolean, strAddress1 As String
         Const Ordner_A As String = "D:\Test\DatenNeu"       'Ordner mit den A-Dateien
         Const Ordner_C As String = "D:\Test\ZwischenOrdner" 'Ordner mit den C-Dateien
         Set wksCSV_A = Worksheets("A_CSV") 'Tabelleblatt für die A-Datei-Daten
         Set wksCSV_C = Worksheets("C_CSV") 'Tabelleblatt für die C-Datei-Daten
      
         ' Datei A auswählen
         With Application.FileDialog(msoFileDialogOpen)
             .Title = "Bitte A-Datei auswählen"
             .AllowMultiSelect = False
             .InitialFileName = Ordner_A & "\A*"
             If .Show = -1 Then
                 strDatei_A = .SelectedItems(1)
                 strDatei_C = "C" & Mid(strDatei_A, InStrRev(strDatei_A, "_"))
                 strDatei_C = Ordner_C & "\" & strDatei_C
                 If Dir(strDatei_C) = "" Then
                     MsgBox "Zur gewählten A-Datei gibt es keine C-Datei"
                     Exit Sub
                 End If
             Else
                 Exit Sub
             End If
         End With
      
         ' Daten in A und C laden
         With wksCSV_A.QueryTables.Add(Connection:="TEXT;" & strDatei_A, Destination:=wksCSV_A.Range("$A$1"))
             .TextFileSemicolonDelimiter = True
             .Refresh
         End With
         With wksCSV_C.QueryTables.Add(Connection:="TEXT;" & strDatei_C, Destination:=wksCSV_C.Range("$A$1"))
             .TextFileSemicolonDelimiter = True
             .Refresh
         End With
      
         ' Daten vergleichen
         Set rngSuchC = wksCSV_C.Range("B:B")
         For Zeile = 1 To wksCSV_A.Cells(wksCSV_A.Rows.Count, 1).End(xlUp).Row
             If wksCSV_A.Cells(Zeile, 1).Value = 2 Then
                 varWertB = wksCSV_A.Cells(Zeile, 2).Value
                 Set rngWertB = rngSuchC.Find(What:=varWertB, LookIn:=xlValues, lookat:=xlWhole)
                 If rngWertB Is Nothing Then
                     wksCSV_A.Cells(Zeile, 5).Value = "fehlt in C"
                 End If
             End If
         Next Zeile
      End Sub
    3. Passe die Ordnerpfade und die Blattnamen an.
    4. Starte das Makro, um die beiden CSV-Dateien zu vergleichen.

    Häufige Fehler und Lösungen

    • Fehlende C-Datei: Stelle sicher, dass für jede A-Datei eine entsprechende C-Datei vorhanden ist. Das Makro gibt eine Fehlermeldung aus, wenn die C-Datei nicht gefunden wird.
    • Falsches Trennzeichen: Wenn die Daten nicht korrekt geladen werden, überprüfe das Trennzeichen in den CSV-Dateien. Das Beispiel verwendet Semikolons.
    • Blattnamen: Achte darauf, dass die Blattnamen in Deiner Arbeitsmappe mit denen im Makro übereinstimmen.

    Alternative Methoden

    Wenn Du keine VBA-Programmierung nutzen möchtest, kannst Du auch die folgenden Methoden ausprobieren:

    1. Power Query: Importiere die CSV-Dateien in Power Query und vergleiche die Daten dort. Power Query bietet eine benutzerfreundliche Oberfläche für Datenmanipulation.
    2. Excel-Funktionen: Verwende Excel-Funktionen wie SVERWEIS oder VERGLEICH, um die Daten aus beiden CSV-Dateien zu vergleichen. Dies erfordert jedoch, dass die Daten in Excel geladen sind.

    Praktische Beispiele

    Angenommen, Du hast die folgenden CSV-Daten:

    A-Datei:

    1;06.11.2013;15:00:00;;;
    2;23456789;;0;;
    2;23456789;;0;;

    C-Datei:

    1;06.11.2013;15:00:00;;;
    2;23456789;;0;;

    Nach dem Ausführen des Makros wird in der A-Datei angezeigt, dass der Wert 23456789 in der C-Datei fehlt, da er nicht in Spalte E markiert wird.


    Tipps für Profis

    • Fehlerbehandlung: Implementiere eine Fehlerbehandlung im Makro, um unerwartete Fehler abzufangen.
    • Datenformatierung: Achte darauf, dass die Datenformate in beiden CSV-Dateien übereinstimmen, um Missverständnisse zu vermeiden.
    • Automatisierung: Du kannst das Makro so anpassen, dass es automatisch beim Öffnen der Arbeitsmappe ausgeführt wird.

    FAQ: Häufige Fragen

    1. Wie kann ich zwei CSV-Dateien vergleichen, die sich in unterschiedlichen Ordnern befinden?
    Du kannst den Pfad zur A-Datei im Makro anpassen, sodass das Skript die C-Datei im entsprechenden Ordner erkennt.

    2. Funktioniert das auch mit großen CSV-Dateien?
    Ja, das Makro kann auch mit großen Dateien umgehen, allerdings kann die Leistung von Excel bei sehr großen Datenmengen leiden. In solchen Fällen ist Power Query eine bessere Wahl.

    3. Muss ich Excel VBA aktivieren?
    Ja, um das Makro auszuführen, musst Du sicherstellen, dass Makros in Deinen Excel-Einstellungen aktiviert sind.

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige