21.07.2017, 10:43
(20.07.2017, 21:52)Ego schrieb: Hallo Olli,
wie schon geschrieben würde ich snb's Version nutzen. Seine letzte Version (nicht ADO) benötigt auf meinem Rechner < 17 Sekunden, hat aber den enormen Vorteil, dass die einzelnen Listen nicht sortiert sein müssen.
Achtung! Im Augenblick können sich die Ergebnisse unsere beiden Programme unterscheiden ( aber nicht mit deinen Beispieldaten).
A) Mein Programm durchläuft die Kundenliste und fügt im Ergebnis die passenden Daten der anderen drei Listen hinzu (ähnlich der Formellösung).
Hierbei werden Einträge aus den Einzellisten, die keine entsprechenden Eintrag in der Kundenliste haben ignoriert.
B) snb's Programme fügen passenden Einträge aus den drei Einzellisten zusammen.
Falls in der Kundenliste Kundennummern vorhanden sind, die in den Einzellisten nicht vorkommen, werden sie im Ergebnis nicht ausgewiesen.
!!!Man kann aber beide Programme ohne bemerkbare Erhöhung der Rechenzeit so anpassen, dass sie das gleiche von dir gewünschte Ergebnis liefern.
C) Man könnte die Programme auch so modifizieren dass sowohl alle Einträge aus der Kundenliste als auch alle Einträge aus den Einzellisten berücksichtigt werden.
Hallo Helmut,
vielen Dank für die Info.
Ich denke da wäre die Variante c am sinnvollsten. Denn die Kundenliste umfasst immer alle Kunden.
In den anderen Listen sind mitunter nur Einträge vorhanden für Kunden bei denen es zB auch einen Umsatz oder einen Besuch gab, ansonsten fehlt der Eintrag in diesen Listen.
C) Man könnte die Programme auch so modifizieren dass sowohl alle Einträge aus der Kundenliste als auch alle Einträge aus den Einzellisten berücksichtigt werden.
Kannst du mir eventuell noch weiterhelfen inwieweit man den Code dann modifizieren müsste?
Und generell würde mich einfach interessieren wie dieses Makro eigentlich genau funktioniert, einfach damit ich zukünftig hoffentlich auch selber in der Lage bin das bei kleinen Modifikationen auf die Reihe zu bringen.
Es ist ja eh sehr kurz was die Zeilen angeht. Ich muss nur dazusagen, dass ich leider von Arrays etc. derzeit noch keine Ahnung habe und einfach gerne die Funktionsweise dahinter verstehen würde.
Ich wäre also um ein paar Kommentare im Code sehr dankbar, damit ich weiß wo der Abgleich passiert, wo die Reihenfolge der Spalten definiert wird etc.
Code:
Sub M_snb()
'Hier wird ein Timer gestartet damit man die Ausführungszeit messen kann
t1 = Timer
'Hier wird .... gemacht
Dim sp(3 * 10 ^ 5, 10)
'Hier wird das scripting.dictionary eingebunden
With CreateObject("scripting.dictionary")
'Hier wird die Anzahl der Blätter definiert, in diesem Fall "Umsatz" / "Artikel" / "Besuche"
For j = 1 To 3
'Hier wird .... gemacht
sn = Sheets(Choose(j, "Umsatz", "Artikel", "Besuche")).Cells(1).CurrentRegion
'Hier wird .... gemacht
For jj = 2 To UBound(sn)
'Hier wird .... gemacht
If Not .exists(sn(jj, 1)) Then .Item(sn(jj, 1)) = .Count
'Hier wird .... gemacht
y = .Item(sn(jj, 1))
'Hier wird .... gemacht
For jjj = 1 To 5
'Hier wird .... gemacht
sp(y, Choose(jjj, 0, 1, 1 + j, 4 + j, 7 + j)) = sn(jj, jjj)
Next
Next
Next
'Hier wird .... gemacht
Sheet9.Cells(1).Resize(.Count, 10) = sp
End With
'Hier wird der Wert aus dem Timer in einer Messagebox ausgegeben
MsgBox Timer - t1
End Sub
Vielen Dank und ein schönes Wochenende
Olli
WIN 10 64-Bit Pro / EXCEL Microsoft Office 365 ProPlus 64-Bit