Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1084to1088
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 vereinfachen - Bitte Hilfe

Code vereinfachen - Bitte Hilfe
Marc
Hallo,
ich möchte den u.g. Code gerne optimieren. Denn seit dem ich die beiden Variablen "RaZelle3" und "RaZelle4" in die For-Schleife eingefügt habe kommt mein Rechner nicht mehr mit. Also es geht um eine Performance optimierung.

Sub von_raw_nach_cat()
Dim RaZelle1 As Range, bereich1 As Range
Dim RaZelle2 As Range, bereich2 As Range
Dim RaZelle3 As Range, bereich3 As Range
Dim RaZelle4 As Range, bereich4 As Range
Dim LZ1 As String, LZ2 As String, LZ3 As String, LZ4 As String
LZ1 = Workbooks("Raw DATA 062909.XLS").Sheets("tmp8").Range("A1000").End(xlUp).Address( _
RowAbsolute:=False, ColumnAbsolute:=False)
LZ1 = "A2:" + LZ1
LZ2 = Workbooks("Summary 2009Monthly with HEATT June 2009.XLS").Sheets("CAT").Range("A1000"). _
End(xlUp).Address(RowAbsolute:=False, ColumnAbsolute:=False)
LZ2 = "A2:" + LZ2
LZ3 = Workbooks("Raw DATA 062909.XLS").Sheets("tmp8").Range("A1000").End(xlUp).Offset(0, 4). _
Address(RowAbsolute:=False, ColumnAbsolute:=False)
LZ3 = "E2:" + LZ3
LZ4 = Workbooks("Summary 2009Monthly with HEATT June 2009.XLS").Sheets("CAT").Range("A1000"). _
End(xlUp).Offset(0, 2).Address(RowAbsolute:=False, ColumnAbsolute:=False)
LZ4 = "G2:" + LZ4
' Application.ScreenUpdating = False
Set bereich1 = Workbooks("Raw DATA 062909.XLS").Sheets("tmp8").Range(LZ1)
Set bereich3 = Workbooks("Raw DATA 062909.XLS").Sheets("tmp8").Range(LZ3)
Set bereich2 = Workbooks("Summary 2009Monthly with HEATT June 2009.XLS").Sheets("CAT").Range( _
LZ2)
Set bereich4 = Workbooks("Summary 2009Monthly with HEATT June 2009.XLS").Sheets("CAT").Range( _
LZ4)
For Each RaZelle1 In bereich1
For Each RaZelle2 In bereich2
For Each RaZelle3 In bereich3
For Each RaZelle4 In bereich4
If RaZelle1 = RaZelle2 And RaZelle3 = RaZelle4 And status = True Then
RaZelle1.EntireRow.Copy
RaZelle2.EntireRow.PasteSpecial
End If
Next RaZelle4
Next RaZelle3
Next RaZelle2
Next RaZelle1
'  Application.ScreenUpdating = True
End Sub


Besten Dank.
Gruß
Marc

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

Betreff
Benutzer
Anzeige
AW: Code vereinfachen - Bitte Hilfe
06.07.2009 21:02:19
Jochen
Hi,
meinst du im Ernst, das baut jemand nach?
Ein Beispiel hochgeladen wäre hilfreich.
mfg Jochen
AW: Code vereinfachen - Bitte Hilfe
06.07.2009 21:46:50
mbrausen
Eigentlich nicht, ich dachte das man es vielleicht auch so lösen kann.
Ansich möchte ich nichts anderes als Zelle für Zelle 2 Ranges miteinander zu vergleichen, wenn die 2 abgefragten Bedingungen gleich sind, sollte die komplette Zeile kopiert werden.
Ich weiss auch nicht warum ich mich da momentan so schwer tue und würde mich über eure Hilfe freuen.
Vielen Dank und noch einen schönen Abend.
Gruß
Marc
AW: Code vereinfachen - Bitte Hilfe
06.07.2009 21:40:55
Christian
Hallo Marc,
bei 4 verschachtelten Schleifen à 1000 Zeilen bist du schon bei 10^12 Durchläufen.
sollte dein Hochleistungs-Rechner eine Milliarde Durchläufe pro Sekunde schaffen, dann braucht er dafür immer noch 1000 Sekunden (ca. 3 Stunden). Schafft er nur 1 Mio Durchläufe pro Sekunde läuft dein Script gute 11 Tage.
Letzteres ist wahrscheinlicher, aber ich tippe eher auf 10.000 bis 100.000 Durchläufe pro Sekunde. Die Laufzeit hierzu kannste dir ja mal ausrechnen.
Mein Tipp:
vor Allem:
- arbeite mit Arrays, Dictionary oder Collection statt 1 Billionen mal Bereiche zu kopieren.
des Weiteren:
- immer Variablendeklaration erzwingen (Option Explicit). Bsp: deine Variable status ist nicht deklariert.
- referenziere korrekt.
und überhaupt:
- Copy und PasteSpecial ist sehr viel langsamer als die direkte Übergabe der Werte à la ...Value = ...Value
- verzichte auf Konstrukte wie LZ1 = "A2:" + LZ1 ... .Range(LZ1). Das ist im konkreten Fall zwar nicht ausschlaggebend, ist aber auch sehr viel langsamer als zB .Cells(2, 1).Resize(...)
die größte Bremse ist die 4-fach-Verschachtelung.
Grüße
Christian
Anzeige
AW: Code vereinfachen - Bitte Hilfe
07.07.2009 12:07:06
ChrisL
Hallo Marc
Finde die Fragestellung auch nicht ganz optimal, aber zurück zum Thema...
Zusammenfassend sehe ich da einen Vergleich von zwei Tabellen mit mehreren Kriterien. Du könntest mal die Recherche für Inspiration durchforsten, Stichwort "Tabellen vergleichen".
Für Vergleiche mit einem Kriterium verwendet man i.d.R. Application.Match (ein Ergebnis) oder Application.Find (mehrere Ergebnisse), weil schneller als mit Schleife.
Aufgefallen ist mir ebenfalls das Kriterium "status". Unter Umständen kannst du die Tabellen vorher sortieren/filtern, dann musst du die Einträge mit falschem Status gar nicht durchsuchen.
cu
Chris
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige