Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
848to852
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
848to852
848to852
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Code beschleunigen

Code beschleunigen
25.02.2007 12:15:43
Thorsten_Z
Moin Forum,
ist es möglich, folgenden Code zu "beschleunigen"? Es laufen ca. 12 codes hintereinander ab und das dauert geschätzte eineinhalb Minuten... ist zwar kein Drama, aber wenn es schneller gehen könnte wär das toll.
<pre>Sub Mrz()
Dim a As Integer
Dim i As Integer
a = 11
For i = 6 To 12
Workbooks("Dienstplan.xls").Sheets("Dienstplan").Cells(a, 17).Value = Workbooks("Zeitzuschläge.xls").Sheets("Mrz").Cells(i, 15).Value
Workbooks("Dienstplan.xls").Sheets("Dienstplan").Cells(a, 18).Value = Workbooks("Zeitzuschläge.xls").Sheets("Mrz").Cells(i, 16).Value
a = a + 2
Next i
daten_kopieren2 'hier wird das nächste makro gestartet
End Sub
</pre>
Hat jemand einen Tip für mich?
Gruß
Thorsten

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

Betreff
Datum
Anwender
Anzeige
AW: Code beschleunigen
25.02.2007 12:32:08
EtoPHG
Hallo Thorsten,
Versuch's mal so:

Sub Mrz()
Dim a As Integer
Dim i As Integer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
a = 11
For i = 6 To 12
Workbooks("Dienstplan.xls").Sheets("Dienstplan").Cells(a, 17).Value = Workbooks("Zeitzuschläge.xls").Sheets("Mrz").Cells(i, 15).Value
Workbooks("Dienstplan.xls").Sheets("Dienstplan").Cells(a, 18).Value = Workbooks("Zeitzuschläge.xls").Sheets("Mrz").Cells(i, 16).Value
a = a + 2
Next i
daten_kopieren2 'hier wird das nächste makro gestartet
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

Irgendwelche Verbesserung?
Gruss Hansueli
Anzeige
AW: Code beschleunigen
25.02.2007 13:04:00
daniel
Hallo
einfach mal ein paar verschiedene Ansätze.
1. Objektvariablen verwenden
macht den Code nicht viel schneller, aber wesentlich einfacher zu lesen und zu schrieben:
Dim shQuelle as worksheet
Dim shZiel as Worksheet
set shZiel = Workbooks("Dienstplan.xls").Sheets("Dienstplan")
set shQuelle =  Workbooks("Zeitzuschläge.xls").Sheets("Mrz")
For i = 1 to 6
shziel.Cells(a, 17).Value =shQuelle.Cells(i, 15).Value
...

2.Ranges zusammenfassen
die beiden Zellen die du pro umlauf kopierst, liegen ja direkt hintereinander, also kann man sie auch auf einen Schlag kopieren, somit sparst du pro Umlauf eine Befehlszeile:
shZiel.cells(a,17).resize(1,2).value  = shQuelle(cells(i,15).resize(1,2).value
ersetzt beide Zeilen in der oberen Schleife alternativ könnte man auch schreiben:
range(shQ.cells(a,17),shQuelle(cells(a,18)).value = range(shQuelle.cells(i,15), shQuelle.cells(i,16)).value
Probier mal aus wieviel das bringt. man kann es sicherlich noch mehr beschleunigen, aber dann müsste man tiefer einsteigen. Gruß, Daniel
Anzeige
AW: Code extrem beschleunigen
25.02.2007 14:55:47
Daniel
Hallo
hier nochmal ne schnellere Variante.
ich hoffe es funktioniert, ich konnte es leider nicht testen.
Grundlage der Idee ist, daß:
VBA sehr langsam ist, wenn mit Excelobjekten wie RANGE oder CELLS gearbeitet wird.
VBA ist viel schneller, wenn es mit internen Variablen arbeiten kann.
Gott sei dank kann man recht einfach die Werte der Excel-Zellen in solche Internen Variablen kopieren und auch wieder zurückschreiben und genau das macht das Makro auch.
1. die Zellbereiche aus DIENSTPLAN und ZEITZUSCHLÄGE in interne Array-Variablen kopieren
2. die Werte in einer Schleife innerhalb der Array-Variablen austauschen
3. die geänderten Werte der Array-Variable nach DIENSTPLAN zurückschreiben.
Sub Mrz()
Dim a1 As Integer, a2 As Integer, b1 As Integer, b2 As Integer
Dim i As Integer, j As Integer
Dim shZiel As Worksheet, shquelle As Worksheet
Dim rngZiel As Range, rngQuelle As Range
Dim arrZiel, arrQuelle
Set shZiel = Workbooks("Dienstplan.xls").Sheets("Dienstplan")
Set shquelle = Workbooks("Zeitzuschläge.xls").Sheets("Mrz")
b1 = 6
b2 = 12
a1 = 11 - 1
a2 = a1 + (b2 - b1) * 2+1
'zellbereiche für Quelle und Ziel festlegen
Set rngZiel = Range(shZiel.Cells(a1, 17), shZiel.Cells(a2, 18)).Value
Set rngQuelle = Range(shquelle.Cells(b1, 15), shquelle.Cells(b2, 17)).Value
'Zellbereiche in Array-Variablen kopiern
arrZiel = rngZiel.formulalocal
arrQuelle = rngQuelle.Value
'Datenübertragung von Quelle zu Ziel
For i = 1 To UBound(arrQuelle, 1)
For j = 1 To UBound(arrQuelle, 2)
arrZiel(i * 2, j) = arrQuelle(i, j)
Next j
Next i
'geändertes Array in Zellbereich Ziel zurückschreiben
rngZiel.Value = arrZiel
End Sub

Das ganze ist zwar in der Programmierung etwas aufwendiger und abstrakter, aber um Weltklassen schneller, als wenn man die Zellwerte einzeln verändert.
Gruß, Daniel
Anzeige
AW: Code extrem beschleunigen
25.02.2007 15:29:01
Thorsten_Z
@Hansueli: Die automatische Berechnung auszuschalten hat schon sehr viel gebracht. Ich bin begeistert. Werde es auch dabei belassen. Vielen Dank.
@Daniel: An deinen Code werde ich mich noch ran machen und erstmal versuchen, ihn zu verstehen. Das Arrays schnell sind wußte ich schon, aber das übersteigt dann doch (noch) meinen VBA Horizont. Trotzallem vielen Dank für deine Mühe und die neue Lernvorlage :-).
Wünsche euch beiden noch ein schönes Restwochenende
Gruß
Thorsten

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige