Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1584to1588
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

Makro beschleunigen

Makro beschleunigen
04.10.2017 20:13:54
Anja
Hallo zusammen,
ich bin absoluter Makro-Neuling und habe mir folgendes Makro "zusammengebastelt". Ziel soll es sein, aus einem Tabellenblatt all diejenigen Zeilen zu kopieren, in denen in einer Spalte die Werte mit einer bestimmten Zahl bzw. Buchstaben anfangen. Diese Zeilen sollen in ein anderes Tabellenblatt kopiert werden.
Soweit klappt das. Allerdings ist das Makro sehr langsam, da über 100000 Zeilen durchsucht werden müssen. Gibt es eine Möglichkeit, das Makro zu ändern, damit es schneller läuft?
Hier in meinem Beispielmakro habe ich nur zwei verschiedene Werte, in der Realität werden es später mehr sein.
Ich danke Euch schon mal vorab für Eure Hilfe bzw. Hinweise.
Viel Grüsse
Sub Kopieren()
Application.ScreenUpdating = False
' Tabelle: Tabelle1
' Tabelle Ziel: Ziel
Const Blatt1 = "Tabelle1"           ' Source
Const Blatt2 = "Ziel" ' Ziel
Dim I As Long
Dim iAnz As Long
Dim letzte As Long
Worksheets("Ziel").Activate
letzte = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
Worksheets("Ziel").Range("A2:AA" & letzte).Clear
Worksheets("Ziel").Range("a2").Activate
Sheets(Blatt1).Activate
Range("e2").Select
iAnz = 0
I = 0
Do Until I = ActiveSheet.UsedRange.Rows.Count
If ActiveCell Like "1*" Then
Selection.EntireRow.Copy
Sheets(Blatt2).Activate
ActiveSheet.Paste
ActiveCell.Offset(1, 0).Select
Sheets(Blatt1).Select
ActiveCell.Offset(1, 0).Select
iAnz = iAnz + 1
ElseIf ActiveCell Like "A2*" Then
Selection.EntireRow.Copy
Sheets(Blatt2).Activate
ActiveSheet.Paste
ActiveCell.Offset(1, 0).Select
Sheets(Blatt1).Select
ActiveCell.Offset(1, 0).Select
iAnz = iAnz + 1
Else
ActiveCell.Offset(1, 0).Select
End If
I = I + 1
Loop
MsgBox "Es wurden " & iAnz & " Sätze übertragen"
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub

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

Betreff
Datum
Anwender
Anzeige
Grundregeln
04.10.2017 20:22:14
lupo1
1. Nicht den Cursor Gassi führen (ein Spruch von Hajo), also weder .Activate noch .Select (beides mit Ausnahmen), sondern Objekte ansprechen.
2. Keine Zellen in der Massenverarbeitung lesen und schreiben, sondern die zu bearbeitenden Bereiche in ein VBA-Variant überführen. Das ist zugegeben jetzt nicht Anfängerstunde Nr. 2.
AW:Autofilter
04.10.2017 21:41:45
Fennek
Hallo,
teste bitte einmal, ob es möglich ist, die Auswahl "1..." oder "A1.." als Autofilter zu erzeugen. Falls ja, kann man dies und das kopieren mit wenigen Zeilen VBA enbloc machen. Damit sollte es sehr schnell gehen.
mfg
(als Anregung:

with cells(1).currentregion
.autofilter 1, Array der beiden Abfragen
.copy sheets(2).cells(1,1)
.autofilter
end with
)
Anzeige
AW: Makro beschleunigen
04.10.2017 22:08:40
Daniel
Hi
beim kopieren von Zellen sollte man darauf achten, dass man nicht jede Zeile einzeln kopiert, sondern dass man immer möglichst große und lückenlose Zellblöcke in einem Stück kopiert.
das Kopieren des Bereichs 1:1000 ist fast genauso schnell wie das kopieren des Bereichs 1:1.
Hierbei hilft das Sortieren.
ich würde hier so vorgehen.
1. per Formel in einer Hilfsspalte alle zu kopierenden Zellen markieren
2. die Liste nach der Hilfsspalte sortieren, damit ein Zellblock entsteht
3. die den Zellblock kopieren
4. ggf die Zellen in der Ursprungsliste wieder zurücksortieren.
sieht als Code für dein Beispiel dann so aus:

Sheets("Ziel").UsedRange.Offset(1, 0).Clear
With Sheets("Tabelle1").UsedRange
With .Columns(.Columns.Count + 1)
.FormulaR1C1 = "=IF(OR(Left(RC1,1)=""1"",Left(RC1,2)=""A2""),1,"""")"
.Formula = .Value
.EntireRow.Sort key1:=.Cells(1, 1), order1:=xlAscending, Header:=xlYes
If .Cells(2, 1) = 1 Then
With Range(.Cells(2, 1), .Cells(2, 1).End(xlDown))
.Select
.ClearContents
.EntireRow.Copy Sheets("Ziel").Cells(2, 1)
End With
End If
End With
End With
End Sub
zu den Grundregeln von Lupo solltest du dir vielleicht noch das durchlesen:
http://www.online-excel.de/excel/singsel_vba.php?f=78
Gruß Daniel
Anzeige
AW: Makro beschleunigen
05.10.2017 11:37:27
Anja
Hallo zusammen,
Danke für Eure Antworten. Ich werde mir alles in Ruhe anschauen und versuchen, mich tiefer in die ganze Materie "hineinzuknien".
Danke nochmals und viele Grüsse

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige