Anzeige
Archiv - Navigation
1848to1852
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

VBA - For Schleife extrem langsam

VBA - For Schleife extrem langsam
23.09.2021 19:17:18
Manuel
Hallo zusammen,
ich durchsuche jetzt seit längerer Zeit Google und diverse Foren, bin aber noch nicht fündig geworden. Mit folgendem Code will ich meine Zeilen in der Tabelle mit Farben versehen. Das funktioniert soweit auch gut, bremst das Makro aber tierisch aus. Kleinere Tabellen sind damit kein Problem, bei Tabellen mit >2.000 Zeilen kann es aber schonmal dauern.
Habe jetzt überlegt die bedingte Formatierung zu nutzen, aber ich hätte an sich gerne fixe Farben, da sich die Werte nicht mehr ändern. Jetzt hoffe ich ihr könnt helfen.
Hier der Code in Kurzversion (es gibt 13 Farben):

For aktuelleZeileNLSim = ErsteZeileNLSimAL To letzteZeileNLSim
If wsNLSim.Cells(aktuelleZeileNLSim, SpalteNachlassgruppe).Value = "B1" Then
wsNLSim.Range(Cells(aktuelleZeileNLSim, ErsteSpalteNLSimPrAL), Cells(aktuelleZeileNLSim, LetzteSpalteNLSimPrAL)).Interior.Color = wsNLSim.Cells(40, 4).Interior.Color
wsNLSim.Range(Cells(aktuelleZeileNLSim, ErsteSpalteNLSimConAL), Cells(aktuelleZeileNLSim, LetzteSpalteNLSimConAL)).Interior.Color = wsNLSim.Cells(40, 4).Interior.Color
ElseIf wsNLSim.Cells(aktuelleZeileNLSim, SpalteNachlassgruppe).Value = "B2" Then
wsNLSim.Range(Cells(aktuelleZeileNLSim, ErsteSpalteNLSimPrAL), Cells(aktuelleZeileNLSim, LetzteSpalteNLSimPrAL)).Interior.Color = wsNLSim.Cells(41, 4).Interior.Color
wsNLSim.Range(Cells(aktuelleZeileNLSim, ErsteSpalteNLSimConAL), Cells(aktuelleZeileNLSim, LetzteSpalteNLSimConAL)).Interior.Color = wsNLSim.Cells(41, 4).Interior.Color
Else
wsNLSim.Range(Cells(aktuelleZeileNLSim, ErsteSpalteNLSimPrAL), Cells(aktuelleZeileNLSim, LetzteSpalteNLSimPrAL)).Interior.Color = wsNLSim.Cells(52, 4).Interior.Color
wsNLSim.Range(Cells(aktuelleZeileNLSim, ErsteSpalteNLSimConAL), Cells(aktuelleZeileNLSim, LetzteSpalteNLSimConAL)).Interior.Color = wsNLSim.Cells(52, 4).Interior.Color
End If
Next aktuelleZeileNLSim
Falls ihr mehr Infos oder Code braucht, dann gerne Bescheid sagen.
Vielen Dank für Eure Hilfe vorab.
Liebe Grüße,
Manuel

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - For Schleife extrem langsam
23.09.2021 19:28:43
PawelPopolski
Da es nur einen Ausschnitt aus dem Code gibt hier ein Schuss ins Blaue:
Setze Folgendes and den Anfang deines Codes:
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Und ans Ende:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Das sollte ein paar Sekunden rausholen.
AW: VBA - For Schleife extrem langsam
23.09.2021 19:33:36
ChrisL
Hi Manuel
Ich glaube nicht, dass eine wesentliche Beschleunigung möglich ist. Darfst die Frage aber gerne wieder als offen markieren.
Ein klein wenig helfen könnte folgende Zeile gleich am Anfang vom Code:

Application.ScreenUpdating = False
Bei mehr als 2000 Zeilen würde ich eine Form der Datenauswertung/Analyse/Filter suchen. Farben bringen ja nur etwas wenn man es sich "durchliest", was bei der Zeilenzahl wenig praktisch ist. Und wenn doch, was spricht denn gegen die bedingte Formatierung. Aber egal, worauf ich eigentlich hinweisen möchte ist, dass du deine Referenzierung sauber durchziehen musst:

wsNLSim.Range(wsNLSim.Cells(aktuelleZeileNLSim, ErsteSpalteNLSimPrAL), wsNLSim.Cells(aktuelleZeileNLSim, LetzteSpalteNLSimPrAL)).Interior.Color = wsNLSim.Cells(40, 4).Interior.Color
cu
Chris
Anzeige
AW: VBA - For Schleife extrem langsam
23.09.2021 19:51:19
Peter
Noch ein paar Ansätze:

Dim col40 As Long, col41 As Long, col52 As Long
With wsNLSim
col40 = .Cells(40, 4).Interior.Color
col41 = .Cells(41, 4).Interior.Color
col52 = .Cells(52, 4).Interior.Color
For aktuelleZeileNLSim = ErsteZeileNLSimAL To letzteZeileNLSim
Select Case .Cells(aktuelleZeileNLSim, SpalteNachlassgruppe)
Case "B1"
.Range(.Cells(aktuelleZeileNLSim, ErsteSpalteNLSimPrAL), .Cells(aktuelleZeileNLSim, LetzteSpalteNLSimPrAL)).Interior.Color = col40
.Range(.Cells(aktuelleZeileNLSim, ErsteSpalteNLSimConAL), .Cells(aktuelleZeileNLSim, LetzteSpalteNLSimConAL)).Interior.Color = col40
Case "B2"
.Range(.Cells(aktuelleZeileNLSim, ErsteSpalteNLSimPrAL), .Cells(aktuelleZeileNLSim, LetzteSpalteNLSimPrAL)).Interior.Color = col41
.Range(.Cells(aktuelleZeileNLSim, ErsteSpalteNLSimConAL), .Cells(aktuelleZeileNLSim, LetzteSpalteNLSimConAL)).Interior.Color = col40
Case Else
.Range(.Cells(aktuelleZeileNLSim, ErsteSpalteNLSimPrAL), .Cells(aktuelleZeileNLSim, LetzteSpalteNLSimPrAL)).Interior.Color = col52
.Range(.Cells(aktuelleZeileNLSim, ErsteSpalteNLSimConAL), .Cells(aktuelleZeileNLSim, LetzteSpalteNLSimConAL)).Interior.Color = col52
End If
Next aktuelleZeileNLSim
End With
Insbesondere die Farben muss man ja nicht 2000 mal auslesen - einmal reicht!
Anzeige
AW: VBA - For Schleife extrem langsam
23.09.2021 19:52:46
Peter
Sorry, unten muss es natürlich "End Select" statt "End If" heißen...
AW: VBA - For Schleife extrem langsam
23.09.2021 20:04:34
Daniel
Hi
1. Grundsatzfehler, den wohl jeder mal machen muss:
Bei Range(Cells(), Cells()) muss das Tabellenblatt vor den beiden Cells stehen, nicht vor der Range!!!!!!!!!!!!!
2. es ist in Excel langsam, jede Zelle einzeln zu färben. du könntest den Autofilter nutzen, um bspw nach "B1" zu filtern um dann diese Zellen alle gemeinsam zu färben:
3. die Grundfarbe, die die meisten Zellen bekommen, weist man zunächst allen Zellen zu und überschreibt sie dann:

dim Spalten as Range
with wsNLSim.UsedRange
Set Spalten = Union(Range(.Columns(ErsteSpalteNLSimPrAL), .Columns(LetzteSpalteNLSimPrAL)), Range(.Columns(ErsteSpalteNLSimConAL), .Columns(LetzteSpalteNLSimConAL)))
Spalten.Interior.Color = wsNLSim.Cells(52, 4).Interior.Color
.Autofilter field:=SpalteNachlassgruppe, criteria1:="B1"
Spalten.SpecialCells(xlcelltypevisible).Interior.Color = wsNLSim.Cells(40, 4).Interior.Color
.Autofilter Field:=SpalteNachlassgruppe, criteria1:="B2"
Spalten.SpecialCells(xlcelltypevisible).Interior.Color = wsNLSim.Cells(41, 4).Interior.Color
... usw
.Autofilter
end with 
Code bitte nicht kopiern, den hab ich nur so hingeschrieben ohne Test und Kontrolle.
Bitte Lesen, verstehen und dann mit Hilfe der Intellisense selber schreiben. Danke.
Gruß Daniel
Anzeige
AW: VBA - For Schleife extrem langsam
23.09.2021 21:07:30
Manuel
Hi Daniel,
mega Tipp! Vielen Dank, der hat das Ganze richtig beschleunigt! :-) Habe die Range entsprechend angepasst und jetzt läufts sehr gut!
Vielen Dank und liebe Grüße,
Manuel

307 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige