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

1 Range schnell (oft) kopieren

1 Range schnell (oft) kopieren
17.10.2016 19:58:28
Michael
Hi zusammen,
wie kopierte man einen Bereich am schnellsten?
Nachfolgend 3 Varianten mit Zeitangaben:
Option Explicit
Sub Makro1()
Dim t0 As Single, i&
t0 = Timer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Range("C6:D1006").Clear
Range("C4:D4").Select
Selection.Copy
For i = 6 To 1006
Range("c" & i).Select
ActiveSheet.Paste
Next
Application.Calculation = xlCalculationAutomatic
Range("A1") = (Timer - t0) * 1000
' t = 1
End Sub
Sub Makro2()
Dim t0 As Single, i&, r As Range
t0 = Timer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Range("C6:D1006").Clear
Set r = Range("C4:D4")
For i = 6 To 1006
r.Copy Range("c" & i)
Next
Application.Calculation = xlCalculationAutomatic
Range("A1") = (Timer - t0) * 1000
' t = ca. 3,2
End Sub
Sub Makro3()
Dim t0 As Single, i&, r As Range
t0 = Timer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Range("C6:D1006").Clear
Set r = Range("C4:D4")
r.Copy
For i = 6 To 1006
Range("c" & i).PasteSpecial xlPasteAll
Next
Application.Calculation = xlCalculationAutomatic
Range("A1") = (Timer - t0) * 1000
' t = ca. 1,27
End Sub
Makro 1: quasi wie Makrorekorder, nur leicht nachbearbeitet
Makro 2: r als Objekt, aber immer wieder kopiert, dauert am längsten
Makro 3: r nur einmal kopiert, aber mehrfach eingefügt: dauert immer noch länger als Makro 1.
Der Knackpunkt ist: wie füge ich "schnell" Infos aus der Zwischenablage ein?
Ich scheitere daran, daß .paste eine Methode von worksheet ist, nicht jedoch von range: hier gibt es nur .pastespecial
Das Beispiel hinkt insofern, als hier der Zielbereich zusammenhängt: DAS ginge natürlich in einem Rutsch ohne Schleife.
Tatsächlich hat der Quellbereich einige 100 Zellen, während der Zielbereich typischerweise auf ein paar 100 von ein paar 1000 Zellen in Spalte A verteilt ist: das Kriterium fürs Kopieren ist, daß die Zelle Ax nicht leer ist.
Hm, hm. Man muß die Frage nur richtig stellen, dann steckt auch schon die Antwort drin:
Sub Makro4()
Dim t0 As Single, i&, r As Range
t0 = Timer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Range("C6:D1006").Clear
Range("C4:D4").Copy Range("A6:A1006").SpecialCells(xlCellTypeConstants, 23).Offset(, 2)
Application.Calculation = xlCalculationAutomatic
Range("A1") = (Timer - t0) * 1000
' t = ca. 0,05
End Sub
Das fetzt richtig...
Was meint Ihr? Läuft das immer und zuverlässig, auch mit vielen Daten (10000 Zeilen mit ca. 800 Kopien)?
Der Test im "richtigen Leben" (von = 179, bis = ca. 5000) mit
Svon.Range("L251:HU259").Copy _
Snach.Range("A" & von).Resize(bis - von + 1).SpecialCells(xlCellTypeConstants, 23).Offset(, 11)

ist tatsächlich kaum meßbar schneller als die Schleife
While zeile 
Hat jemand Ideen?
Übrigens ist sichergestellt, daß sich die Zielbereiche nicht überschneiden.
(Der Quellbereich ist ziemlich übel und nicht auf meinem Mist gewachsen...)
Schöne Grüße,
Michael

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 1 Range schnell (oft) kopieren
17.10.2016 20:19:22
Nepumuk
Hallo,
du solltest mal die Hilfe zur Paste-Methode studieren
  For i = 6 To 1006
ActiveSheet.Paste Destination:=Cell(i, 3)
Next

Gruß
Nepumuk
AW: 1 Range schnell (oft) kopieren
17.10.2016 20:36:01
Michael
Hi Nepumuk,
das soll helfen...
Peinlich, sorry. Ich spiel mal damit herum und melde mich wieder.
Danke erst Mal und schöne Grüße,
Michael
erledigt
18.10.2016 18:07:19
Michael
Hi Nepumuk,
nach einigen Spielereien komme ich zu dem Schluß, daß prinzipiell der "Einzeiler" (wie "Makro4") am schnellsten ist: jede (getestete) Art von Schleife ist in einer Testdatei um einen Faktor 5 langsamer.
Allerdings hatte ich beim Praxistest nicht aufgepaßt und mir das komplette Tabellenblatt mit dem Quellbereich in eine Testdatei kopiert, so daß sich die Zellbezüge auf eine andere Datei bezogen hatten: der interne Verwaltungsaufwand für externe Bezüge hat offensichtlich die Zeitunterschiede der reinen Algorithmen glattgebügelt.
Das nur der Vollständigkeit halber.
Danke nochmal & Gruß,
Michael
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige