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

Code beschleunigen

Code beschleunigen
19.03.2017 18:44:53
Frank
Hallo Zusammen und allen noch einen schönen Sonntagabend!
Ich hoffe, dass man anhand des Codes welchen ich gleich einfüge erkennen kann, wie er zu beschleunigen ist. Nach meiner Uhr, läuft der Code 35 Sekunden, dass geht doch bestimmt schneller.
Hab ich selbst gebastelt und bin schon froh, dass er macht was er soll, nur halt extrem langsam!
Weiss jemand Rat? Bin wie immer für jede Hilfe dankbar!
Application.ScreenUpdating = False
For lng = 9 To 217
For lng1 = 3 To 92
For i = 5 To 17
If Sheets("Südamerika").Cells(lng, 4) = Sheets("Südamerika").Cells(lng1, 109) Then
Sheets("Südamerika").Cells(lng, i) = Sheets("Südamerika").Cells(lng1, i + 105)
End If
Next i
Next lng1
Next lng
For lng = 8 To 222
For lng1 = 2 To 198
For i = 25 To 34
If Sheets("Südamerika").Cells(lng, 22) = Sheets("Südamerika").Cells(lng1, 135) And Sheets("Südamerika").Cells(lng, 22) "" Then
Sheets("Südamerika").Cells(lng, i) = Sheets("Südamerika").Cells(lng1, i + 112)
End If
Next i
Next lng1
Next lng
Range("E5").Select
Application.ScreenUpdating = True
Gruß Frank H.

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

Betreff
Datum
Anwender
Anzeige
AW: Code beschleunigen
19.03.2017 19:02:37
{Boris}
Hi Frank,
weitere Bremsen können die Events und die Kalkulation sein.
Schalte beide zu Beginn auch noch ab - und am Ende wieder an.
Application.EnableEvents = False 'und am Ende wieder auf True setzen
Application.Calculation = xlCalculationManual 'und am Ende wieder auf xlCalculationAutomatic setzen
Beides davon ausgehend, dass Du die Events standardmäßig an und die Kalkulation auf Automatik hast.
Gibt auch ne kleine Prozedur dazu - such mal in der Recherche unter "GetMoreSpeed" oder "GMS"
VG, Boris
AW: Code beschleunigen
20.03.2017 06:49:41
GraFri
Hallo
Ich würde die benötigten Bereiche in ein Array schreiben und mit dem dann weiterrechnen. Ist sicher um einiges schneller, als jeden Zellinhalt einzeln zu vergleichen, da die benötigten Werte schon im Speicher sind.
Spalte in ein 1-dimensionales Array:
Dim myArr() As Variant
' eindimensionales Array A1:A20
With objWks
myArr = Application.Transpose(.Range(.Cells(1, 1), .Cells(20, 1)))
End With
' eindimensionales Array beginnend mit A2
With ThisWorkbook.Worksheets("Tabelle1")
myArr = Application.Transpose(.Range(.[A2], .Cells(Rows.Count, "A").End(xlUp)))
End With
' oder auch
' eindimensionales Array beginnend mit D3
With ThisWorkbook.Worksheets("Tabelle1")
myArr = Application.Transpose(.Range(.Cells(3, 4), .Cells(Rows.Count, "D").End(xlUp)))
End With

mfg, GraFri
Anzeige
AW: Code beschleunigen
20.03.2017 07:36:30
Daniel
Hi
anstelle deines VBA-Codes kannst du auch den SVerweis bzw eine Kombi aus Index und Vergleich in die Zellen schreiben.
da du diese Formel dann ohne Schleife in alle Zellen gleichzeitig schreiben kannst, ist das schneller als jede Zelle einzeln zu beschreiben.
du mehrere Spalten mit dem gleichen Suchwert hast, würde ich erstmal die Zeilennummer der Fundstelle in einer Hilfsspalte ablegen, damit du diesen Wert mehrfach verwenden kannst, ohne dass er jedes mal neu berechnet werden muss.
anstelle der ersten drei schleifen so:
1. die Hilfsspalte in Spalte 18 (fall diese nicht frei ist, eine andere)
Formel in R9:R217: =Vergleich(D9;$DE$3:$DE$92;0)
2. um die Werte auszulesen:
Formel in E9:Q217: =Wenn(IstFehler(R9);"";Index(DF$3:DF$92;R9;1))
3. die Formel in E9:Q217 kopieren und als Wert einfügen, dann die Hilfsspalte löschen.
sieht als Code dann so aus:
Range("R9:R217").FormulaLocal = "=Vergleich(D9;$DE$3:$DE$92;0)"
With Range("E9:Q217")
.FormulaLocal = "=Wenn(IstFehler(R9);"";Index(DF$3:DF$92;R9;1))"
.Formula = .value
end with
Range("R9:R217").ClearContents
für den zweiten Schleifenblock dann anlog mit entsprechend geänderten Bezügen und der zusätzlichen WENN-Abfrage.
Gruß Daniel
Anzeige
AW: Code beschleunigen
20.03.2017 08:41:02
Frank
Hallo Ihr lieben Helfer!
Werde mir alles in ruhe ansehen und es versuchen umzusetzen. Sollte ich nicht zu Recht kommen melde ich mich noch einmal!
Also vorab herzlichst Danke!
Gruß und eine schöne Wcche, Frank H.
AW: Code beschleunigen 2
20.03.2017 08:33:33
Daniel
mal abgesehen davon, dass man hier besser mit Formeln arbeitet, sollte man generell bei Schleifen und IF-Bedingungen darauf achten, dass man diese sinnvoll kombiniert.
beispielsweise gehören Aktionen, die sich innerhalb einer Schleife nicht ändern, bzw deren Ergebnis nicht vom Schleifenzähler abhängt, nicht in die Schleife, sondern außerhalb.
wenn du mehrere mit AND verknüpfte Bedingungen im IF hast, ist es oft auch günstiger, diese in mehrere geschachtelte IFs umzuschreiben.
der zweite Schleifenblock sollte so etwas schneller sein:
For lng = 8 to 222
if Sheets("Südamerika").Cells(lng, 22)  "" then
for lng1 = 2 to 198
If Sheets("Südamerika").Cells(lng, 22) = Sheets("Südamerika").Cells(lng1, 135)
for i = 25 to 34
Sheets("Südamerika").Cells(lng, i) = Sheets("Südamerika").Cells(lng1, i +  _
112)
Next
end if
Next
end if
Next

aber wie gesagt, mit Formeln, die ohne Schleifen verwendet werden könnnen, bist du hier immer noch schneller.
Gruß Daniel
Anzeige
AW: Get more speed
23.03.2017 21:11:48
Gerd
Hi Frank!
Sub ddd()
Dim WS As Worksheet, RNG As Range, VNT As Variant
Dim lng As Long, lng1 As Long, i As Long
Set WS = Worksheets("Südamerika")
Set RNG = WS.Cells(2, 1).Resize(221, 146)
VNT = RNG.Value
For lng = 8 To 216
For lng1 = 2 To 91
If VNT(lng, 4) = VNT(lng1, 109) Then
For i = 5 To 17
VNT(lng, i) = VNT(lng1, i + 105)
Next i
End If
Next lng1
Next lng
For lng = 7 To 221
If VNT(lng, 22)  "" Then
For lng1 = 1 To 197
If VNT(lng, 22) = VNT(lng1, 135) Then
For i = 25 To 34
VNT(lng, i) = VNT(lng1, i + 112)
Next i
End If
Next lng1
End If
Next lng
RNG.Value = VNT
Erase VNT
Set RNG = Nothing
Set WS = Nothing
End Sub
Gruß Gerd
Anzeige
AW: Get more speed
23.03.2017 21:41:58
Frank
Hallo und Guten Abend Gerd!
Scheint 'ne gute Idee deiner Seits zu sein, doch meine Zellen die gefüllt werden sollen bleiben leer. Hast du 'ne Idee, worandas liegen kann?
Danke und Gruß Frank H.
AW: Get more speed
23.03.2017 21:46:41
Gerd
Hi Frank,
an fehlenden Testdaten u. Musterergebnis, denke ich, wird es liegen.
Gruß Gerd

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige