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

Wieso so langsam

Wieso so langsam
06.06.2016 16:24:49
Gregor
Hallo zusammen
Habe einen einfachen Code geschrieben, läuft aber sehr, sehr langsam. Wieso das bzw. wie löse ich das schneller. Spalte 6 hat rund 1000 Zeilen.
Sub test()
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim c As Range
Dim Vergleich As Variant
Dim intLastRow As Double, start As Double
With Worksheets("Liste")
intLastRow = Worksheets("Daten").Cells(Rows.Count, 1).End(xlUp).Row
For start = 2 To intLastRow
Vergleich = Worksheets("Daten").Cells(start, 1)
For Each c In Intersect(.UsedRange.Cells, Columns(6))
If c.Text = Vergleich Then
.Cells(c.Row, "G") = Worksheets("Daten").Cells(start, 2)
.Cells(c.Row, "H") = Worksheets("Daten").Cells(start, 3)
End If
Next
Next
End With
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Danke und Gruss
Gregor

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Wieso so langsam
06.06.2016 16:42:26
Daniel
Hi
das kommt in erster Linie darauf an, was der Code machen soll.
so beim ersten Drüberschauen ohne ein paar erklärende Worte von dir dazu würde ich mal sagen, du baust hier den SVerweis als VBA-Makro nach.
das wird langsam, weil du jede Zelle einzeln befüllst.
wenn du stattdessen die entsprechende SVerweis-Formel in die Zellen schreibst, wird das ganze schneller, weil du nicht mehr jede Zelle einzeln beschreiben musst, sondern die Formel in alle Zellen gleichzeitig schreiben kannst.
Richtig schnell wird der SVerweis, wenn du Quelltabelle (Daten) nach der Spalte mit dem Suchbegriff aufsteigend sortierst und den SVerweis mit 4. Parameter = WAHR verwendest.
aufgrund der Sortiertung kann er eine Suchmethode verwenden, bei der nicht mehr jeder Zellwert einzeln miteinander verglichen werden muss.
gruß Daniel

Anzeige
AW: Wieso so langsam
06.06.2016 17:02:24
Luschi
HZallo Gregor,
wenn die äußeren For-Schleife 100 mal und die innere For-Schleife 1.000 mal durchlaufen wird, dann sind das schon 100 x 1.000 Durchläufe.
Da die automatische Berechnung (Application.Calculation) nicht ausgeschalten ist, wird das natürlich sehr langsam.
Den Durchlauf der inneren Schleife solltest Du nochmals bedenken, denn das ist so nicht sehr berständlich.
Gruß von Luschi
aus klein-Paris

AlgoArray
06.06.2016 18:43:03
Michael
Hi zusammen,
ich habe mal damit herumgespielt.
In der Datei befinden sich drei Schaltflächen mit Zeitmessung:
a) Original: der originale Code, mit einer kleinen Anpassung, weil ich *numerische* Spielwerte habe:
Vergleich = Worksheets("Daten").Cells(start, 1).Text
Klar, wenn ich einmal .text nähme und einmal nicht, wäre der Vergleich NIE wahr.
b) Array: Zeit bei je 100 Zeilen quasi 0; ich habe beide ein paar Mal laufen lassen, um das Ergebnis zu verifizieren: paßt anscheinend.
c) Wie?: Ich frage mich, ob der Algorithmus überhaupt das tut, was erwünscht ist: so, wie er ist, überschreibt er (natürlich je nach Natur der tatsächlichen Daten mehr oder weniger häufig) nämlich bereits gefundene Werte durch später gefundene.
Mit diesem Button wird das anschaulich: er schreibt zusätzlich in die Spalten I und J ALLE Werte, die während der Schleifen gefunden wurden.
@Gregor: Du mußt Dir ernsthaft überlegen, was Du willst.
Der Array-Code:
Sub testGenauso()
Dim maxL&, maxD&    ' max. Zeilen in Liste, Daten
Dim zL&, zD&        ' Laufvariablen L/D
Dim aL_F, aL_GH, aD ' Arrays aus jeweiligen L/D
Dim t0 As Single
t0 = Timer
maxD = Worksheets("Daten").Cells(Rows.Count, 1).End(xlUp).Row
maxL = Worksheets("Liste").Cells(Rows.Count, 6).End(xlUp).Row
aD = Worksheets("Daten").Range("A1:C" & maxD)
aL_F = Worksheets("Liste").Range("F1:F" & maxL)
'Worksheets("Liste").Range("G1:H" & maxL).Clear ' evtl. verwenden
aL_GH = Worksheets("Liste").Range("G1:H" & maxL)
For zD = 2 To maxD
For zL = 1 To maxL
If aD(zD, 1) = aL_F(zL, 1) Then
aL_GH(zL, 1) = aD(zD, 2)
aL_GH(zL, 2) = aD(zD, 3)
End If
Next
Next
Worksheets("Liste").Range("G1:H" & maxL) = aL_GH
Sheets("Daten").Range("H5") = (Timer - t0) * 1000 & " ms"
End Sub
Die Datei: https://www.herber.de/bbs/user/106034.xlsm
Schöne Grüße,
Michael

Anzeige
AW: AlgoArray
07.06.2016 08:49:07
Gregor
Hallo zusammen
Hallo Michael
Danke für die Infos und Erläuterungen.
Der Code "testGenauso" von Michael ist perfekt und läuft superschnell, vielen Dank. Noch eine Anschlussfrage:
Kann ich die Daten in aD = Worksheets("Daten").Range("A1:C" & maxD) anstatt in ein Blatt auch direkt in den Code schreiben, zB mit einem Array. Und wenn ja wie?
Gruss Gregor

AW: AlgoArray
07.06.2016 16:09:58
Michael
Hi Gregor,
z.B. so:
Sub testGenausoUserDefArr()
Dim maxL&, maxD&    ' max. Zeilen in Liste, Daten
Dim zL&, zD&        ' Laufvariablen L/D
Dim aL_F, aL_GH, aD() ' Arrays aus jeweiligen L/D
Dim t0 As Single
t0 = Timer
maxL = Worksheets("Liste").Cells(Rows.Count, 6).End(xlUp).Row
ReDim aD(2 To 3, 1 To 3)
aD(2, 1) = 1: aD(2, 2) = "B1": aD(2, 3) = "C1"
aD(3, 1) = 2: aD(3, 2) = "B2": aD(3, 3) = "C2"
maxD = UBound(aD)
aL_F = Worksheets("Liste").Range("F1:F" & maxL)
'Worksheets("Liste").Range("G1:H" & maxL).Clear ' evtl. verwenden
aL_GH = Worksheets("Liste").Range("G1:H" & maxL)
For zD = 2 To maxD
For zL = 1 To maxL
If aD(zD, 1) = aL_F(zL, 1) Then
aL_GH(zL, 1) = aD(zD, 2)
aL_GH(zL, 2) = aD(zD, 3)
End If
Next
Next
Worksheets("Liste").Range("G1:H" & maxL) = aL_GH
Sheets("Daten").Range("H5") = (Timer - t0) * 1000 & " ms"
End Sub
Bei mehr als nur ein paar Werten wäre mir das aber viel zu viel Schreibarbeit: den Bereich aus dem Blatt einzulesen geht so viel schöner...
Einen Einstieg in Arrays findest Du u.a. hier: http://www.online-excel.de/excel/singsel_vba.php?f=154
Schöne Grüße,
Michael

Anzeige
AW: AlgoArray
08.06.2016 09:32:02
Gregor
Hallo Michael
Vielen Dank auch für diese Variante.
Mit der Schreibarbeit hast du schon recht, dafür benötige ich jedoch kein zusätzliches Blatt mit Daten.
Beides funktioniert bestens.
Gruss Gregor

na fein, danke für die Rückmeldung
08.06.2016 09:36:04
Michael
und Grüße zurück,
Michael

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige