Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1588to1592
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
02.11.2017 10:30:18
Tobias
Hallo zusammen!
Ich bin gerade dabei, einen bereits vorhandenen Code umzuschreiben, sodass er "schneller" läuft. Zuvor wurde jedes Blatt immer wieder einzeln aktiviert, dann wurden Bereiche selected, kopiert, das Zielblatt aktiviert und dann kopiert und das immer und immer wieder.
Anbei ein Ausschnitt des Codes, wie ich ihn aktuell umgeschrieben habe:
With Sheets("XYZ")
If .AutoFilterMode Then .AutoFilterMode = False
.Range("$A$1:$AN$" & o).AutoFilter Field:=10, Criteria1:= _
"a"
.Range(anruw).Copy Destination:=Tabelle31.Range("A1")
If .AutoFilterMode Then .AutoFilterMode = False
.Range("$A$1:$AN$2113").AutoFilter Field:=10, Criteria1:= _
"b"
Application.CutCopyMode = False
.Range(anruw).Copy Destination:=Tabelle31.Range("F1")
If .AutoFilterMode Then .AutoFilterMode = False
.Range("$A$1:$AN$2113").AutoFilter Field:=10, Criteria1:= _
"c"
Application.CutCopyMode = False
.Range(anruw).Copy Destination:=Tabelle31.Range("K1")
If .AutoFilterMode Then .AutoFilterMode = False
.Range("$A$1:$AN$2113").AutoFilter Field:=10, Criteria1:= _
"d"
Application.CutCopyMode = False
.Range(anruw).Copy Destination:=Tabelle31.Range("BJ1")
If .AutoFilterMode Then .AutoFilterMode = False
.Range("$A$1:$AN$2113").AutoFilter Field:=10, Criteria1:= _
"e"
Application.CutCopyMode = False
.Range(arw).Copy Destination:=Tabelle31.Range("P1")
If .AutoFilterMode Then .AutoFilterMode = False
.Range("$A$1:$AN$2113").AutoFilter Field:=10, Criteria1:= _
"f"
Application.CutCopyMode = False
.Range(arw).Copy Destination:=Tabelle31.Range("T1")
End With
Meine Frage:
Macht der Application.CutCopyMode = False - Befehl hier überhaupt noch Sinn? Oder kann man den auch rausstreichen? Wie gesagt: Obiger Ausschnitt wiederholt sich so oder so ähnlich immer und immer wieder. Und sollte der Code dadurch schneller laufen?
Bei weiteren Ideen, wie man beschleunigen kann ... jederzeit gerne!
VG

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code beschleunigen
02.11.2017 10:38:16
Peter(silie)
Hallo,
ich würde Copy immer vermeiden, ist extrem langsam und
VBA gibt dir mit den Range objekten haufenweise möglichkeiten
dinge zu verschieben, kopieren etc.
Ohne Beispiel Mappe kann man keinen optimierten Code schreiben.
Hier also ein wenig Pseudo/Beispielcode:
Option Explicit
Public Sub Copy_To()
Dim anruw, arw As Range
With ThisWorkbook.Sheets("XYZ")
'AutofilterCode...
Tabelle31.Range("A1").Resize(anruw.Rows.Count, anruw.Columns.Count) = anruw
'AutofilterCode...
'gleiches wie oben nur anpassen
End With
End Sub

AW: als Anregung
02.11.2017 10:45:28
Fennek
Hallo,
ohne Daten und die Bereitschaft mir selbst eine Demo-Datei zu basteln, nur eine erste Anregung:

Ar = array("a","b","c","d","e")
with sheets("XYZ").cells(1).currentregion
for i = 0 to ubound(Ar)
.autofilter 10, Ar(i).copy
.copy sheets("Tabelle31").cells(1,1).offset(,5*i+1)
next i
end with
Die Verschiebung muss sicher noch angepasst werden.
mfg
Anzeige
AW: Code beschleunigen
02.11.2017 11:01:08
Daniel
Hi
Kannst du meiner Erfahrung nach Weglassen und nur ganz am Schluss verwenden, damit du keine Rückfrage bekommst, wenn du Excel direkt nach diesem Makro schließt.
Für die Geschwindigkeit bringt es aber nichts. (kannst du ja selber testen)
Weitere Optimierungen wären folgende:
Da du den Autofilter immer in der gleichen Zeile anwendest, reicht es aus, das If .AutoFilterMode Then .AutoFilterMode = False einmal ganz am Anfang auszuführen.
Dann kannst du auch die Withklammer über den Zellbereich bilden und nicht nur über das Blatt.
Zusätzlich solltest du die Tabelle nach der Filterspalte sortieren, so dass dann beim Kopieren immer ein lückenloser Zellblock kopiert werden kann.
Wenn du sortiert hast, könnte man auch überlegen, dass du nicht mit dem Autofilter arbeitest, sondern mit der .Find-Funktion die erste und letzte Zelle mit dem Filterkriterium ermittels (kann man über den Parameter "SearchDirection") einstellen und dann die dazwischen liegenden Zellen kopierst.
Auch das dürfte schneller sein als jedes mal den Autofilter zu setzen, außerdem bleibt der Bildschirm ruhig (sofern das Blatt aktiv ist).
Gruß Daniel
Anzeige
Nicht mit Autofilter ...
02.11.2017 12:47:03
lupo1
... sondern:
- sortiere nach K (zum Rücksortieren vorher eine lfdNr an die Tabelle anhängen)
- mit Match Beginn der Buchstaben/Nachfolger ermitteln und den Tabellenteil in die Zielspalten zuweisen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige