"Wert"-Suche mit .FIND
16.07.2019 17:59:02
Path
die ist meine erster Beitrag, ich hoffe mein Anliegen möglichst klar rüberbringen zu können :o)
Folgendes Problem:
Ich habe eine "Kundendatenbank" eine einer Exceldatei mit einer eindeutigen ID je Kunde. Ich erhalte in unregelmäßigen Abständen einen CSV-Export, der alle Kunden enthält. Hier können jedoch auch neue Kunden vorhanden sein, die bislang nicht in der Kundendatenbank enthalten sind. Genau diese will ich finden und in die Kundendatenbank kopieren.
Das Ganze klappt bislang auch schon so halbwegs. Das Problem ist nur, dass in dem CSV-Export machen Datensätze doppelt vorhanden sind. Ich möchte jedoch nur jeden Datensatz einmal in der Kundendatenbank haben.
Leider kopiert mein bisheriges Script jeden Datensatz des ID bislang nicht in der Kundendatenbank enthalten ist.
Mein Script sieht wie folgt aus:
Sub Daten_einlesen()
Dim einlesIID As String, IIDSuche As Range, IIDFinde As Range, QuellZeile As Long
Dim Heute
KundenDatei = ActiveWorkbook.Name
Heute = Now
letzte_Zeile = Sheets("Kundendaten").Cells(Rows.Count, 4).End(xlUp).Row 'letzte Zeile in _
Kundendaten als Wert übergeben
'Einlesen ausschließlich von CSV-Dateien
DateiName = Application.GetOpenFilename( _
FileFilter:="Alle .csv-Dateien (*.csv), *.csv", _
Title:="Aktuellen Kvasy-Report auswählen", MultiSelect:=False) 'Dialogbox zur Öffnung der _
_
_
_
_
_
_
einzulesenden CSV-Datei öffnen
If TypeName(DateiName) = "Boolean" Then
MsgBox "Sie haben keine Datei ausgewählt ! ", vbInformation, "Kvasy-Report auswählen"
Exit Sub
End If
s = InStrRev(DateiName, "\")
STRFOLDER = Left(DateiName, s)
KvasyDatei = Right(DateiName, Len(DateiName) - s)
Application.ScreenUpdating = False
Sheets("Kundendaten").Select 'Tabellenblatt Übersicht öffnen
If ActiveSheet.FilterMode = True Then
ActiveSheet.ShowAllData 'Filter ausschalten
End If
Application.DisplayAlerts = False
Workbooks.Open Filename:=STRFOLDER & KvasyDatei, Local:=True ' Datei zum Einlesen öffnen. _
_
_
_
_
_
_
Local:... für Excel Format
Application.DisplayAlerts = True
Windows(KundenDatei).Activate
letzte_Zeile_KvasyDatei = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row 'letzte Zeile in _
Kundendaten als Wert übergeben
Set IIDFinde = Workbooks(KundenDatei).Worksheets("Kundendaten").Range("A1:A10000")
If ActiveSheet.FilterMode = True Then
ActiveSheet.ShowAllData 'Filter ausschalten
End If
NeueDaten = 0
Spalte_Moni_IID = Workbooks(KundenDatei).Sheets("Konfig").Cells(11, 2)
Spalte_Kvasy_IID = Workbooks(KundenDatei).Sheets("Konfig").Cells(11, 4)
Spalte_Moni_Name = Workbooks(KundenDatei).Sheets("Konfig").Cells(13, 2)
Spalte_Kvasy_Name = Workbooks(KundenDatei).Sheets("Konfig").Cells(13, 4)
Spalte_Moni_Telefon = Workbooks(KundenDatei).Sheets("Konfig").Cells(14, 2)
Spalte_Kvasy_Telefon = Workbooks(KundenDatei).Sheets("Konfig").Cells(14, 4)
Spalte_Moni_VstStraße = Workbooks(KundenDatei).Sheets("Konfig").Cells(15, 2)
Spalte_Kvasy_VstStraße = Workbooks(KundenDatei).Sheets("Konfig").Cells(15, 4)
Spalte_Moni_VstHausnr = Workbooks(KundenDatei).Sheets("Konfig").Cells(16, 2)
Spalte_Kvasy_VstHausnr = Workbooks(KundenDatei).Sheets("Konfig").Cells(16, 4)
'Spalte_Moni_VstZusatz = Workbooks(KundenDatei).Sheets("Konfig").Cells(, 2)
Spalte_Kvasy_VstZusatz = Workbooks(KundenDatei).Sheets("Konfig").Cells(17, 4)
Spalte_Moni_VstPLZ = Workbooks(KundenDatei).Sheets("Konfig").Cells(18, 2)
Spalte_Kvasy_VstPLZ = Workbooks(KundenDatei).Sheets("Konfig").Cells(18, 4)
Spalte_Moni_VstOrtOT = Workbooks(KundenDatei).Sheets("Konfig").Cells(19, 2)
Spalte_Kvasy_VstOrtOT = Workbooks(KundenDatei).Sheets("Konfig").Cells(19, 4)
Spalte_Datum_einles = Workbooks(KundenDatei).Sheets("Konfig").Cells(21, 2)
Windows(KvasyDatei).Activate
For i = 2 To letzte_Zeile_KvasyDatei
Windows(KvasyDatei).Activate
einlesIID = Workbooks(KvasyDatei).Worksheets(1).Cells(i, Spalte_Kvasy_IID)
Windows(KundenDatei).Activate
Set IIDSuche = IIDFinde.Find(What:=einlesIID, LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByColumns, SearchDirection:=xlNext) 'IID in Kundenliste suchen
If IIDSuche Is Nothing Then
NeueDaten = NeueDaten + 1
ZielZeile = letzte_Zeile + NeueDaten
Workbooks(KundenDatei).Worksheets("Kundendaten").Cells(ZielZeile, _
Spalte_Datum_einles) = Heute
Workbooks(KundenDatei).Worksheets("Kundendaten").Cells(ZielZeile, Spalte_Moni_IID) = _
_
_
_
_
_
_
_
Workbooks(KvasyDatei).Sheets(1).Cells(i, Spalte_Kvasy_IID)
Workbooks(KundenDatei).Worksheets("Kundendaten").Cells(ZielZeile, Spalte_Moni_Name) = _
_
_
_
_
_
_
_
Workbooks(KvasyDatei).Sheets(1).Cells(i, Spalte_Kvasy_Name)
Workbooks(KundenDatei).Worksheets("Kundendaten").Cells(ZielZeile, _
Spalte_Moni_Telefon) = _
Workbooks(KvasyDatei).Sheets(1).Cells(i, Spalte_Kvasy_Telefon)
Workbooks(KundenDatei).Worksheets("Kundendaten").Cells(ZielZeile, _
Spalte_Moni_VstStraße) = _
Workbooks(KvasyDatei).Sheets(1).Cells(i, Spalte_Kvasy_VstStraße)
Workbooks(KundenDatei).Worksheets("Kundendaten").Cells(ZielZeile, _
Spalte_Moni_VstHausnr) = _
Workbooks(KvasyDatei).Sheets(1).Cells(i, Spalte_Kvasy_VstHausnr)
Workbooks(KundenDatei).Worksheets("Kundendaten").Cells(ZielZeile, _
Spalte_Moni_VstPLZ) = _
Workbooks(KvasyDatei).Sheets(1).Cells(i, Spalte_Kvasy_VstPLZ)
Workbooks(KundenDatei).Worksheets("Kundendaten").Cells(ZielZeile, _
Spalte_Moni_VstOrtOT) = _
Workbooks(KvasyDatei).Sheets(1).Cells(i, Spalte_Kvasy_VstOrtOT)
Else
gefunden wurde "QuellZeile" übergeben
'MsgBox "ACHTUNG Nicht gefunden - ABBRUCH"
GoTo gefunden
Exit Sub
End If
gefunden:
Next i
Set IIDFinde = Nothing
Set IIDSuche = Nothing
Application.StatusBar = False
Workbooks(KundenDatei).Worksheets("Kundendaten").Cells(5, 2) = NeueDaten ' Anzahl neuer Kunden
Windows(KvasyDatei).Activate
Application.DisplayAlerts = False
ActiveWindow.Close
Application.DisplayAlerts = True
Windows(KundenDatei).Activate
Sheets("Übersicht").Select
End Sub
Mir erscheint das Problem bei der Find-Methode zu liegen. Ich gebe anfangs einen Bereich an in der er nach der IID (die Kunden-ID) such soll.
Jedes mal wenn er die in der Kundendatenbank nicht gefunden hat, kopiert er den Datensatz aus dem CSV-Export (KvasyDatei)an das Ende der Kundendatenbank.
Sofern nun in dem CSV-Export hintereinander die gleichen IID vorkommen, "übersieht" das Script leider den zuvor bereits kopierten Datensatz. Es scheint als würde die FIND-Methode nicht auf den neuen Datensatz angewendet zu werden.
Frage:
Ist das generell so, dass mit der Methode nur ein zu Beginn festgelegter Bereich mit den zu diesem Zeitpunkt vorhandenen Daten berücksichtigt wird und nicht die zur Laufzeit neu erzeugten Daten?
Frage:
Ich gehe ja so vor, dass ich aus dem Export Zeile für Zeile die IIDs einlese und in der Kundendatenbank suche.
Würde es einen Unterschied machen genau anders rum vorzugehen: In der Kundendatenbank Zeile für Zeile die IID einlesen und prüfen, ob diese im CSV-Export vorhanden sind? Ich müsste dann auf jeden Fall die Zeilennummern des CSV-Exports bekommen, um bei einer "Treffer"-Zeile den Datensatz gezielt ansprechen und damit kopieren zu können.
Vielen Dank für eure Aufmerksamkeit.