Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
968to972
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
968to972
968to972
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Sorry für's hochschieben!

Sorry für's hochschieben!
15.04.2008 20:57:58
Jenny
Hallo an alle Excel-Freunde,
ich habe vor einigen Tagen hier eine Anfrage gestartet, die aber mittelweile wohl so weit nach unten gerutscht ist, daß sie niemand mehr wahrnimmt:
https://www.herber.de/forum/messages/968212.html
Es geht um die wachsende Dauer eines Schleifendurchlaufs.
Könnte bitte jemand mal die Codes meines letzten Beispiels ( https://www.herber.de/forum/messages/968304.html ) bei sich testen?
Könnt ihr das Verhalten bestätigen?
Und vielleicht sogar erklären?
Vielen Dank!
Grüße von Jenny im Excel-Land

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sorry für's hochschieben!
15.04.2008 21:30:00
Caruso
Hallo Jenny
bestätige Anstig der Laufzeiten.
Und so bleiben die Laufzeiten konstant

Sub testDictionary()
Dim a%, b%, c%, s&, x&, Z, t!
t = Timer
Cells(4, 1).CurrentRegion.Clear
For a = 1 To 100
For b = 1 To 100
      Set Z = CreateObject("scripting.dictionary")
For c = 1 To 100
x = x + 1
Z(x) = a & ";" & b & ";" & c
If x = 10000 Then
Debug.Print Timer - t
t = Timer
s = s + 1
x = 0
Cells(4, s).Resize(Z.Count) = WorksheetFunction.Transpose(Z.items)
'Z.RemoveAll (hat keinerlei Effekt, sondern verlangsamt nur)
End If
Next c
Set Z = Nothing
Next b
Next a
End Sub


LG
Carlo

Anzeige
AW: Sorry für's hochschieben!
15.04.2008 21:53:00
Jenny
Hallo Carlo,
ja, das stimmt; so bleiben die Laufzeiten konstant.
Vielen Dank dafür!
Was ist aber, wenn ich "wilde" Längen für die For-Next-Schleifen habe?
Dann funktioniert dein Vorschlag leider nicht:
For a = 1 To 67
For b = 1 To 53
For c = 1 To 47
Weißt du da auch Rat?
Grüße von Jenny im Excel-Land

AW: Sorry für's hochschieben!
15.04.2008 22:19:00
Uduuh
Hallo,
was beabsichtigst du eigentlich?
Gruß aus’m Pott
Udo

AW: Sorry für's hochschieben!
15.04.2008 22:32:23
Jenny
Hallo Udo,
ich versuche, die unterschiedlichen Kombinationen der Werte verschiedener Arrays aufzulisten.
In der Realität ist der If-Block noch um einiges komplexer, aber das ändert an der Situation nix.
Die For-Next-Schleifen beginnen jeweils natürlich mit
For i = 1 To UBound(BlaBla)
For j = 1 To Ubound(...
usw.
Außerdem geifen auch noch andere Prozeduren auf diese Schleife(n) zurück.
Die Frage ist und bleibt aber:
Warum steigt die Zeit pro Schleifendurchlauf?
Selbst wenn ich alle Werte in ein und die gleiche Spalte auswerfen lasse (und damit die vorhandenen Werte überschreibe), bleibt dieser mißliche Umstand.
Woran mag das liegen?
Grüße von Jenny im Excel-Land

Anzeige
AW: Sorry für's hochschieben!
15.04.2008 23:43:00
Uduuh
Hallo,
da kann ich dir nicht helfen. Keine Ahnung
Gruß aus’m Pott
Udo

AW: Sorry für's hochschieben!
15.04.2008 23:56:00
Jenny
Hallo Udo,
aber du beobachtest auch das gleiche Phänomen?
Oder ist das gar kein Phänomen?
Ist das immer so?
Kann doch nicht sein!
Grüße von Jenny im Excel-Land

AW: Sorry für's hochschieben!
16.04.2008 13:34:35
Jenny
Hallo nochmal,
ich habe nun versucht, das Dictionary-Object jeweils nach dem Schreiben der Werte zu leeren und neu zu initialisieren.
Leider wachsen die Zeiten auch weiterhin an.

Sub testDictionary()
Dim a%, b%, c%, s&, x&, Z, t!
Set Z = CreateObject("scripting.dictionary")
t = Timer
Cells(4, 1).CurrentRegion.Clear
For a = 1 To 97
For b = 1 To 91
For c = 1 To 83
x = x + 1
Z(x) = a & ";" & b & ";" & c
If x = 10000 Then
Debug.Print Timer - t
t = Timer
s = s + 1
x = 0
Cells(4, s).Resize(Z.Count) = WorksheetFunction.Transpose(Z.items)
Set Z = Nothing
Set Z = CreateObject("scripting.dictionary")
End If
Next c
Next b
Next a
End Sub


Grüße von Jenny im Excel-Land

Anzeige
AW: Sorry für's hochschieben!
16.04.2008 17:24:00
Caruso
Hallo Jenny,
m.E. liegt es nicht am Dictionary, sondern daran, dass du Text in das Tabellenblatt schreibst.
Probier mal

Sub testDictionary()
Dim a, b, c As Long
Dim s&, x&, Z, t!
Set Z = CreateObject("scripting.dictionary")
t = Timer
Cells(4, 1).CurrentRegion.Clear
For a = 1 To 97
For b = 1 To 91
For c = 1 To 83
x = x + 1
Z(x) = a * 10000 + b * 100 + c
If x = 10000 Then
Debug.Print Timer - t
t = Timer
s = s + 1
x = 0
Cells(4, s).Resize(Z.Count) = WorksheetFunction.Transpose(Z.items)
Set Z = Nothing
Set Z = CreateObject("scripting.dictionary")
End If
Next c
Next b
Next a
End Sub


Mit


Z(x) = a * 10000 + b * 100 + c

werden einfach eindeutige Zahlen verwendet - Laufzeiten konstant
Mit


Z(x) = CStr(a * 10000 + b * 100 + c) 

werden die Strings beim Schreiben in die Zellen in Zahlen konvertiert - Schreiben dauert etwas länger, aber Laufzeiten konstant
Mit


Z(x) = CStr(a * 10000 + b * 100 + c) & "a"

wird Text in die Zellen geschrieben - und das dauert mit wachsender Anzahl beschriebener Zellen scheinbar länger - Laufzeiten steigen an.
LG Carlo

Anzeige
AW: Sorry für's hochschieben!
16.04.2008 17:46:00
Jenny
Hallo Carlo,
stimmt, es scheint tatsächlich am "in-die-Tabelle-schreiben" zu liegen.
Andererseits steigt die Laufzeit auch an, wenn ich die Werte immer wieder überschreibe, also
Cells(4, 1).Resize(Z.Count) = WorksheetFunction.Transpose(Z.items)
Rätselhaft!
Grüße von Jenny im Excel-Land

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige