Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1540to1544
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

Makro über Sverweis dauert ewig

Makro über Sverweis dauert ewig
09.02.2017 13:03:18
Berndt
Hallo zusammen,
ich habe folgenden Code erstellt:
Sub Makro1()
'Tabelle1
Application.ScreenUpdating = False
Sheets("Auswertung BW-Version Bestand").Activate
Columns("G:H").Insert Shift:=xlToRight
Cells.Select
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("G1").Select
ActiveCell.FormulaR1C1 = "Verkettung"
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("H1").Select
ActiveCell.FormulaR1C1 = "SVerweis"
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("G2").Select
Selection.NumberFormat = "General"
ActiveCell.FormulaR1C1 = "=+CONCATENATE(RC[-6],RC[-5],RC[-4],RC[-3],RC[-2],RC[-1])"
Range("G2").Select
Selection.AutoFill Destination:=Range(Selection, Selection.End(xlDown))
'Tabelle2
Sheets("Hilfsblatt aus ETS addon").Activate
Columns("H:H").Insert Shift:=xlToRight
Range("H1").Select
ActiveCell.FormulaR1C1 = "Verkettung"
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("H2").Select
Selection.NumberFormat = "General"
ActiveCell.FormulaR1C1 = "=+CONCATENATE(RC[-7],RC[-6],RC[-5],RC[-4],RC[-3],RC[-1])"
Range("H2").Select
Selection.AutoFill Destination:=Range(Selection, Selection.End(xlDown))
'Tabelle1
Sheets("Auswertung BW-Version Bestand").Activate
Range("H2").Select
Selection.NumberFormat = "General"
ActiveCell.FormulaR1C1 = "=+VLOOKUP(RC[-1],'Hilfsblatt aus ETS addon'!C,1,0)"
Range("H2").Select
Selection.AutoFill Destination:=Range(Selection, Selection.End(xlDown))
Application.ScreenUpdating = True
End Sub
Dabei wird als letzter Schritt ein Sverweiß angewendet.
Problem 1: ich habe ungefähr 600.000 Zeilen
mit autofill xl.down wird der sverweis bis zur letzten Zeile gerechnet (Zeile 1048576). Das ist allerdings zuviel. Das Autofill xl.down sollte sich an die Zeilenanzahl wie z.B. in Spalte A steht ausrichten.
Problem 2: die Dauer
ich war immer der Ansicht, sobald ich ein Makro verwende rechnet er die 600.000 Zeilen schnell durch. Doch auch wenn ich den Sverweiß über Makro mache, warte ich ewig.
Kann jmd. bei den Problemen behilflich sein?
VG Berndt

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro über Sverweis dauert ewig
09.02.2017 13:13:35
Daniel
Hi
Autofill brauchst du nicht.
du kannst die Formel auch gleich in alle Zellen schreiben.
Wenn sich das an Spalte A orientieren soll, so:
Range("H2:H" & Cells(Rows.count, 1).end(xlup).Row).Formular1C1 = "=+VLOOKUP(RC[-1],'Hilfsblatt aus ETS addon'!C,1,0)"
ein weiteres Problem besteht, wenn der Suchbereich (2. Parameter) viele Werte enthält.
Denn jeder SVerweis durchsucht diesen Bereich von oben nach unten und das dauert.
Wenn die Datenmenge hier sehr groß ist, kann man diesen Bereich aufsteigend sortieren und dann den SVerweis mit 4. Parameter = WAHR bzw 1 verwenden.
dieser ist wesentlich schneller, weil er aufgrund der Sortierung eine andere Suchmehtode verwenden kann.
Problem hierbei ist, dass es dann keine Fehlermeldung mehr gibt, wenn der gesuchte Wert nicht vorhanden ist, sondern dann der nächstkleinere Wert verwendet wird.
Wenn man beim Nichtvorhandensein dann trotzdem eine Fehlermeldung haben will, muss man das so machen:
=Wenn(Suchwert=SVerweis(Suchwert;Suchmatrix;Spalte;wahr);SVerweis(Suchwert;Suchmatrix;Spalte;wahr); NV())
Gruß Daniel
Anzeige
AW: Makro über Sverweis dauert ewig
09.02.2017 13:30:53
ChrisL
Hi Berndt
Sub Makro1()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With Sheets("Auswertung BW-Version Bestand")
.Columns("G:H").Insert Shift:=xlToRight
With .Columns("G:H").Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
.Range("G1") = "Verkettung"
With .Range("G1:H1").Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With .Range("G2:G" & .Cells(Rows.Count, 1).End(xlUp).Row)
.NumberFormat = "General"
.FormulaR1C1 = "=+CONCATENATE(RC[-6],RC[-5],RC[-4],RC[-3],RC[-2],RC[-1])"
End With
With .Range("H2:H" & .Cells(Rows.Count, 1).End(xlUp).Row)
.NumberFormat = "General"
.FormulaR1C1 = "=+VLOOKUP(RC[-1],'Hilfsblatt aus ETS addon'!C,1,0)"
End With
End With
With Sheets("Hilfsblatt aus ETS addon")
.Columns("H:H").Insert Shift:=xlToRight
.Range("H1") = "Verkettung"
With .Range("H1").Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With .Range("H2:H" & .Cells(Rows.Count, 1).End(xlUp).Row)
.NumberFormat = "General"
.FormulaR1C1 = "=+CONCATENATE(RC[-7],RC[-6],RC[-5],RC[-4],RC[-3],RC[-1])"
End With
End With
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

cu
Chris
Anzeige
AW: Makro über Sverweis dauert ewig
09.02.2017 16:07:32
Berndt
Vielen Dank für eure Hilfe.
Habe das Makro jetzt so gekürzt in Verwendung. Es läuft klasse.
Allerdings (damit werde ich aber klar kommen müssen) habe ich immernoch eine Rechenzeit (aufgrund des SVerweises) von ca. 10 min.
Ich danke euch erstmal :-)
VG Berndt
AW: Makro über Sverweis dauert ewig
09.02.2017 17:28:25
ChrisL
Hi Berndt
Bei 600'000 Datensätzen würde sich evtl. Access anbieten, was sich dann aber mit Formatierungen "beisst".
Falls die Daten von Extern (im Sinne eines Datenbank-Imports) kommen, könnte man evtl. bereits beim Import ein SQL-Statement machen, um die Daten zu verbinden (=Ersatz SVERWEIS).
cu
Chris
Anzeige
geht schon mit Excel
10.02.2017 17:52:36
Michael
Hi,
anbei Datei zum Spielen: https://www.herber.de/bbs/user/111370.xlsm
Bei einem Test mit 100.000 Datensätzen in der Auswertung und 2000 im Hilfsblatt läuft ChrisLs Makro im Bereich von 10, 20 Sekunden.
Bei 2000 in der Auswertung und 100.000 im Hilfsblatt gibt es kaum einen meßbaren Unterschied.
Die Verwendung eines Dictionarys ist rund 10 Mal schneller.
Es kann gut sein, daß diese Variante weniger abhängig von Randbedingungen ist.
Der große Unterschied zwischen 10 Minuten und ein paar Sekunden kann meines Erachtens nämlich nicht primär an der größeren Datenmenge liegen (ob 100.000 oder 600.000), sondern evtl. auch daran, daß Du mehrere, rechenintensive Excel-Dateien gleichzeitig geöffnet hast: dann funktioniert das .calculationmanual nämlich (leider, leider) nicht mehr sauber, d.h. mehrere Dateien bremsen sich gegenseitig aus.
Im Übrigen finde ich die Ausgabe etwas nichtssagend: wozu brauche ich in Spalte H das Gleiche wie in Spalte G?
Man sollte meinen, daß die Spalte G überflüssig ist (ich schreibe sie zwar als WERT...), aber eigentlich nur die Info benötigt wird, ob Daten in der Auswertung im Hilfsblatt vorhanden sind.
Schöne Grüße,
Michael
Anzeige
AW: geht schon mit Excel
10.02.2017 19:35:03
ChrisL
Hi Michael
Danke für den Vergleich. Ich muss meine Meinung zum Umgang von Excel mit grösseren Datenmengen revidieren. Die 65536 Zeilenbegrenzung ist verjährt.
Und zur (Un-)Sinn Frage...
https://www.herber.de/forum/messages/1540526.html
Sieht nach SUMMEWENNS() resp. Tabellen-Vergleich mit mehreren Kriterien aus. Der Lösungsweg über eine Verknüpfung der Kriterien scheint mir machbar (natürlich ist Dictionary schneller).
@ Berndt
Gibt es noch andere Makros (z.B. Change-Event) oder andere Formeln?
cu
Chris
Anzeige
AW: geht schon mit Excel
11.02.2017 14:14:12
Michael
Hi Chris,
gern geschehen: ich weiß immer ganz gerne, wie sich was verhält, und mit ein paar Testdaten wird's plausibel.
Die Frage ist halt, was tatsächlich benötigt wird...
Die concat wird ja (wahrscheinlich) nur vorgenommen, um sie in beiden Blättern im SVerweis verwenden zu können. Mit reinem VBA (also Arrays bzw. Dictionary) sind diese beiden Hilfsspalten (wenn sie denn wirklich *nur* dafür da sind) unnötig und man kann eigentlich jede Art von weiterzuverarbeitendem Ergebnis ausgeben (z.B. anstelle meiner 1 die Zeilennummer, falls man die benötigt).
Eine andere Geschichte ist das von Berndt und Dir verwendete Einfügen der Spalten G bzw. G+H, das ich stillschweigend unterschlagen habe (damit meine Buttons nicht nach rechts rutschen): das sorgt aber im Original dazu, daß pro Aufruf 600.000 mal 2 Spalten und x-1000 mal 1 Spalte, die FORMELN enthalten, zusätzlich erzeugt werden: das bremst denn auch.
Ich weiß schon: dictionary ist mit "VBA Basiskenntnissen" zunächst etwas schwer verdaulich...
Wenn Berndt fragen würde, könnten wir es ihm aber erklären.
Schöne Grüße,
Michael
P.S.: Beim dictionary bin ich mir im Moment selbst nicht schlüssig, wie man es einsetzen sollte. Die Feinheit liegt in den Zeilen
b(i, 2) = o(s) ' a)
If o.exists(s) Then b(i, 2) = o(s) ' b)

a) erzeugt massenweise "leere" weitere Einträge im Dictionary, sofern der Begriff nicht vorhanden ist. Deshalb habe ich die Anzahl der Einträge mit k2=o.count direkt nach der ersten Schleife abgegriffen.
Das Verwunderliche ist, daß diese Variante trotzdem schneller ist als b)
b) verändert das Dictionary nicht, die o.exists-Abfrage (oder bereits das reine If?) benötigt aber rund 10% mehr Zeit.
Wir wissen weder, wie viele Zeilen das Hilfsblatt besitzt, noch wie das Verhältnis von Gefundenen und nicht Gefundenen in der Auswertung ist.
Bei a) hat das Dictionary auf alle Fälle alle Einträge des Hilfsblatts (ohne Doppelte, aber SVerweis gibt ja auch nur jeweils "einen" Eintrag zurück - Dict. den letzten, SVerweis den ersten) plus alle nicht Gefundenen.
Anzeige
AW: geht schon mit Excel
12.02.2017 09:17:54
ChrisL
Hi Michael
Ich muss zugeben, dass Dictionarys nicht mein Steckenpferd sind und Aufgabe/Ziel sind mir zu vage um weiter zu grüblen.
Grundsätzlich handelt es sich um eine Datenbank-Auswertung und dabei denke ich an SQL resp. Access (z.B. Verknüpfung mit mehreren Kriterien wäre ganz einfach).
Aber dann kommt die Formatierung und Zwischentotal hinzu und die Datenbankstruktur ist futsch. Viel Spass demjenigen, der die Liste lesen muss. ;)
cu
Chris

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige