Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
Anzeige
Archiv - Navigation
1828to1832
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

Wie kann dieses Code schneller werden?

Wie kann dieses Code schneller werden?
05.05.2021 12:10:19
Ali
Hallo Zusammen,
mein Code läuft aber es ist extrem langsam. Es nimmt viel Zeit bis die checkbox geklickt ist.
Hier geht es um: Wenn die Checkbox geklickt ist, werden die daten von eine ini datei ausgelesen und verglichen und dann im Ziel Worksheet aktualisiert.
Wie kann ich das schneller machen?
Vielen Dank im Voraus!
------------------------------------------------------------------------------------------------------------------------

Private Sub chk_AddCDH_Click()
Application.ScreenUpdating = False
Dim Wsp, Wsi, Wsm As Worksheet
Dim colValueM, colParaM, rowM, rowsM As Integer
Dim colParaI, colValue, colSteuerbI, colFeldI, colResultI, colDefaultI, colValueI As Integer, rowI, rowsI As Integer    ' ini3
Set Wsp = Worksheets("Input")
Set Wsi = Worksheets("ini3")
Set Wsm = Worksheets("M6L")
colSteuerbI = 1: colParaI = 2: colValueI = 3: colFeldI = 4: colResultI = 5: colDefaultI = 7
rowsI = Wsi.Cells(Rows.Count, 1).End(xlUp).row
rowsM = Wsm.Cells(Rows.Count, 1).End(xlUp).row
For rowI = 2 To rowsI
For rowM = 2 To rowsM
If chk_AddCDH.Value = True Then
Wsm.Range(Wsi.Cells(rowI, colFeldI).Value) = Wsi.Cells(rowI, colResultI).Value
Else
If chk_AddCDH.Value = False Then
Wsm.Range(Wsi.Cells(rowI, colFeldI).Value) = Wsi.Cells(rowI, colDefaultI).Value
End If
End If
Next
Next
Application.ScreenUpdating = True
End Sub

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

Betreff
Datum
Anwender
Anzeige
AW: Wie kann dieses Code schneller werden?
05.05.2021 12:17:18
AlterDresdner
Hallo,
wenn Du neben Screenupdating auch noch Calculation auf manual und am Ende wieder auf Automatic schaltest, sollte es helfen.
Gruß der AlteDresdner
AW: Wie kann dieses Code schneller werden?
05.05.2021 14:59:32
Ali
Danke für die Rückmeldung! Dein Vorschlag hat den Code schneller gemacht.
Gruß
Ali Sha
AW: Wie kann dieses Code schneller werden?
05.05.2021 12:24:06
Rudi
Hallo,
mir erschließt sich der Sinn der For rowM = 2 To rowsM-Schleife nicht. Lass sie weg.
Außerdem ist If chk_AddCDH.Value = False Then überflüssig. Was soll es sonst sein, wenn es nicht True ist?
Gruß
Rudi
AW: Wie kann dieses Code schneller werden?
05.05.2021 15:09:30
Ali
Hallo,
Ohne chk_AddCDH.Value = False kann die checkbox nicht zurückgesetzt werden.
Aber For rowM = 2 To rowsM war echt überflüssig. Ich habe das weg gemacht.
Danke für die schnelle Antwort!
Gruß
Ali Sha
Anzeige
AW: Wie kann dieses Code schneller werden?
05.05.2021 12:48:14
Daniel
Hi
grundregel bei Schleifen:
- alles, was sich über die Schleife nicht ändert (also nicht von den Schleifenvariablen abhängig ist), möglichst vor oder nach der Schleife abarbeiten, denn macht man das IN der Schleife, wird es unnötig oft wiederholt.
bei dir gehört die Abfrage If chk_AddCDH.Value definitiv vor die Schleife:
also nach dem Prinzip:

dim colX as long
If chk_AddCDH.Value then
colX = colResultI
else
colX = colDefaultI
end if
For rowI = 2 To rowsI
For rowM = 2 To rowsM
Wsm.Range(Wsi.Cells(rowI, colFeldI).Value) = Wsi.Cells(rowI, colX).Value
Next
Next
die übliche Beschleuigungsmaßname, nämlich lückenlos zusammenhängende Zellblöcke möglichst in einem Schritt zu verändern, kann hier nicht greifen, zumindest kann man das aus dem Code nicht schließen, da du hier ja offensichtlich spezielle Zellen, deren Adresse in einer Tabelle hinterlegt ist, ändern willst.
bleibt nur das übliche, wie schon erwähnt, die Automatische Bildschirmakuialisierung (hast du ja schon), automatische Neuberechnung der Formeln (Application.Calculation) sowie die automatsiche Auführung der Eventmakros (Application.EnableEvents) auszuschalten.
Weiters dazu findest du im Archiv oder im Internet unter GetMoreSpeed.
Gruß Daniel
Anzeige
und rudi hat natürlich recht
05.05.2021 13:36:21
Daniel
da der Schleifenzähler rowM in der Schleife nie verwendet wird, ist diese Schleife auch überflüssig.

dim colX as long
If chk_AddCDH.Value then
colX = colResultI
else
colX = colDefaultI
end if
For rowI = 2 To rowsI
Wsm.Range(Wsi.Cells(rowI, colFeldI).Value) = Wsi.Cells(rowI, colX).Value
Next
Gruß Daniel
AW: Wie kann dieses Code schneller werden?
05.05.2021 15:16:46
Ali
Hallo,
Vielen Dank für die ausführliche Antwort! Mein Problem ist schnell gelöst.
Mit application.calculation läuft der Code einwandfrei.
Gruß
Ali Sha

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige