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