Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1336to1340
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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.

    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

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige