Microsoft Excel

Herbers Excel/VBA-Archiv

for each

Betrifft: for each von: Ulf
Geschrieben am: 05.11.2020 11:32:08

Hallo Excel-Freunde,

um die Programmlaufzeit zu optimieren suche ich eine Möglichkeit

in einer "For Each rng_aktuell in rng_Bereich" Schleife

ein paar Zellen zu überspringen.

So geht es nicht: Set rng_aktuell=rng_aktuell.offset(15;0)

Spätestens bei Next bin ich wieder wo ich war.


Muss ich auf eine andere form der Schleife umsteigen?

Wenn ja stellt sich die Frage was ist am schnellsten.

Welchen Unterschied macht es geschwindigkeitemäßig ob ich

For i_Zeile = ... To ..

oder DO while ... nehme?

bzw. mit cells(i_Zeile,...) oder mit rng_Start.Offset(...,...) arbeite.


Viele Grüße

Ulf

Betrifft: AW: for each
von: RPP63
Geschrieben am: 05.11.2020 11:40:01

Moin!
Arbeite mit (temporären) Arrays.
Mehr kann man ob der rudimentären Threaderöffnung nicht sagen.

Gruß Ralf

Betrifft: AW: for each
von: Ulf
Geschrieben am: 05.11.2020 13:41:17

Hi,
guter Denkanstoß, ich nehme den Rangebereich und spreche die Zellen über die
Nummer im Rangebereich an, das sollte schnell sein und man ist flexibel.
Ulf

Betrifft: AW: for each
von: Daniel
Geschrieben am: 05.11.2020 11:57:42

Hi

bei Objektschleifen ist es nicht möglich, den "Schleifenzähler" in irgendeiner Form zu manipulieren, um Objekte aus der ursprünglichen Gruppe zu überspringen.
das geht nur mit normalen Zählschleifen, im Regelfall mit Step, im Einzelfall nach Bedingung auch dadurch, dass man den Schleifenzähler verändert.

For-Schleifen sind etwas schneller als Do-Schleifen
in den meisten fällen dürfte das aber nicht "kriegsentscheidend" sein.
Der unterschied ist, dass bei einer For-Schleife der Schleifenendwert fixiert abgelegt wird und somit schneller verfügbar ist, dafür aber auch nicht nachträglich veränderbar ist.

daher ist auch For Each bei Objekten sehr schnell, VBA legt sich hier die Objektmenge "zugriffsgünstig" zurecht, so dass das Schleifenzählerobjekt schneller verarbeitet werden kann als beim normalen Objektzugriff

der unterschied zwischen cells(i_Zeile,...) und rng_Start.Offset(...,...) dürfte auch sehr gering ausfallen. Hier würde ich mich daran orientieren, was für dich einfacher zu programmieren ist. Bei der Rangevariable rng_Start.Offset ist beispielsweise das Tabellenblatt über die Rangevariable vordefiniert. Bei Cells(i_Zeile,...) müsstest du das Tabellenblatt noch mit angeben.
ansonsten musst du halt schauen, obs einfacher ist mit dem Offset-Wert oder mit der absoluten Zeilennummer zu arbeiten, das hängt aber von der konkreten Aufgabenstellung ab.
Der Einfluss auf die Geschwindigkeit sollte gering sein.

Gruß Daniel

Betrifft: AW: for each
von: Ulf
Geschrieben am: 05.11.2020 12:19:39

Hallo Daniel,



danke für die Informationen,
Ich hatte in einer For Each für eine Untermenge eine Do While
und bin diese Untermenge sozusagen 2x also mit beiden Schleifen durchlaufen.
Die Do While werde ich weglassen, muß dafür paar Variablen mehr machen in denen
ich rückwirkend in bereits durchlaufenen Zeilen agiere.

Euch allen noch einen schönen und weiter so sonnigen Tag

Ulf