Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1700to1704
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

"Wert"-Suche mit .FIND

"Wert"-Suche mit .FIND
16.07.2019 17:59:02
Path
Hallo zusammen,
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.

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: "Wert"-Suche mit .FIND
16.07.2019 18:51:11
Werner
Hallo,
kopier dir doch die Daten aus der CSV komplett ans Ende deiner Kundendatenbank. Anschließend auf die Daten der Kundendatenbank Daten - Datentools - Duplikate entfernen anwenden mit der Spalte der ID als Kriterium.
Das kannst du dir dann ja mit dem Makrorekorder aufzeichnen.
Gruß Werner
AW: "Wert"-Suche mit .FIND
16.07.2019 19:03:24
Path
Das habe ich auch schon überlegt, allerdings empfand/empfinde ich das als nicht so "elegant".
Ich werde es auf jeden Fall mal probieren.
Jedoch würde ich schon gern noch wissen, ob es eine Lösung gibt, die verhindert, dass es überhaupt erst zu diesen doppelten Kopien kommt.
AW: "Wert"-Suche mit .FIND
16.07.2019 19:30:47
Werner
Hallo,
was heißt hier "nicht so elegant"?
Das ist auf alle Fälle schneller als in einer Schleife über keine Ahnung wieviele Zeilen zu laufen und jeden Datensatz einzeln zu kopieren - so viel zu "nicht so elegant".
Gruß Werner
Anzeige
AW: "Wert"-Suche mit .FIND
16.07.2019 21:49:49
Path
Ich habe mir deinen Vorschlag durch den Kopf gehen lassen.
Das Problem ist, dass in der Kundendatenbank auf Grundlage des CSV-Exports weitere Spalten gepflegt wurden. Bei der von Dir vorgeschlagenen Variante wird nun streng nach der ID geschaut und doppelte Einträge gelöscht. Um dies zu umgehen, habe ich in einer separaten Spalte eine Verkettung von der ID sowie weiteren, in der Kundendatenbank mittlerweile zusätzlich vorhandenen Attributen vorgenommen.
Diese Verkettung habe ich genutzt, um die doppelten Einträge zu entfernen. Jetzt bleiben jedoch die neu importierten Einträge vorhanden.
Es müsste aus meiner Sicht daher doch vor dem Import eine Prüfung auf Vorhandensein erfolgen.
Ist es evtl. ratsam statt der FIND-Methode über den Range eine zweite FOR-Schleife in die bereits vorhandene zu integrieren:
For i = Tabellenanfang bis Tabellenende des CSV-Export
ID-Wert_CSV = Wert in Zelle (i, ID-Spalte)
For i = Tabellenanfang bis Tabellenende der Kundendatenbank
ID-Wert_KundenDB = Wert in Zelle (i, ID-Spalte)
If ID-Wert_KundenDB = ID-Wert_CSV then
Go to Ende
Else
Schreibe Werte aus Zeile i des CSV-Exports an Tabellenende+1 der KundenDB
End if
Ende:
Next i
End sub

Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige