Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1156to1160
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 langsam - tunen möglich?

Makro langsam - tunen möglich?
jens
Hallo Excel Profis,
ich habe ein Makro:
Sub Ermittlung(row, d)
iv = 1
Do While row - iv > 0
If Cells(row - iv, 12) = d Then Cells(row - iv, 12).Activate: Cells(1, 15).Value = Cells( _
ActiveCell.row, ActiveCell.Column - 8): Cells(1, 8).Value = Cells(1, 15)
If Cells(row - iv, 12) = d Then iv = row
iv = iv + 1
Loop
End Sub
Das Makro wird von einem anderen aufgerufen und immer wieder ausgeführt.
Kann man diesen Code beschleunigen/tunen? Das Activate ist wahrscheinlich blöd aber ich weiß nicht wie es ohne geht.
Da ich das Makro in einem bestimmten Blatt ausführen muß, mache ich vorher
Sheets("Statistik").Select
Geht das besser/schneller?
Danach kommt
Dim Zeile As Long
Zeile = ActiveSheet.UsedRange.Rows.Count
Das müßte man evt. dann mit ändern?
Wäre toll, wenn mir jemand helfen könnte.
Viele Grüße Jens

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
wie wäre es mit einer Beispieldatei
31.05.2010 10:35:30
Tino
Hallo,
kannst Du ein Beispiel hochladen mit dem man spielen kann?
Ich denke schon, dass man einiges rausholen kann.
Gruß Tino
AW: wie wäre es mit einer Beispieldatei
31.05.2010 11:08:26
jens
Hallo Tino,
Beispiel ist wegen der Daten schlecht.
Hier mal das Gesamtkonstrukt:
Sub TLB_New()
Sheets("Statistik").Select
Reverse = 5
JC_SL = 500
JC_SH = 500
row = 2
col = 8
x = 1
y = 1
Dim Zeile As Long
Zeile = ActiveSheet.UsedRange.Rows.Count
'----------------------------------------------------------------------------------------------- _
Cells(1, 8).Value = JC_SL
Cells(1, 9).Value = JC_SL
Cells(1, 12).Value = JC_SH
Cells(1, 13).Value = JC_SH
'----------------------------------------------------------------------------------------------- _
For i = 1 To Zeile - 2
If Cells(row, 4)  Reverse Then c = Cells(row, 8) - Reverse: Call  _
Ermittlung1_new(row, c)
If Cells(row, 4)  Cells(1, 12) Then Cells(row, 12) = y Else Cells(row, 12) = 0
If Cells(row, 4) > Cells(1, 12) Then Cells(row, 12).Interior.ColorIndex = 36
If Cells(row, 12) = 1 Then Cells(1, 14) = Cells(row, 4)
If Cells(row, 4) > Cells(1, 12) Then y = y + 1
If Cells(row, 12) > Reverse Then d = Cells(row, 12) - Reverse: Call  _
Ermittlung2_new(row, d)
If Cells(row, 4) > Cells(1, 12) Then Cells(1, 12).Value = Cells(row, 4)
If Cells(row, 12) = 1 Then x = 1
If Cells(row, 8) = 1 Then y = 1
row = row + 1
Next i
End Sub
Sub Ermittlung1_new(row, c)
iii = 1
Do While row - iii > 0
If Cells(row - iii, 8) = c Then Cells(row - iii, 8).Activate: Cells(1, 11).Value = Cells( _
ActiveCell.row, ActiveCell.Column - 4): Cells(1, 12).Value = Cells(1, 11)
If Cells(row - iii, 8) = c Then iii = row
iii = iii + 1
Loop
End Sub
Sub Ermittlung2_new(row, d)
iv = 1
Do While row - iv > 0
If Cells(row - iv, 12) = d Then Cells(row - iv, 12).Activate: Cells(1, 15).Value = Cells( _
ActiveCell.row, ActiveCell.Column - 8): Cells(1, 8).Value = Cells(1, 15)
If Cells(row - iv, 12) = d Then iv = row
iv = iv + 1
Loop
End Sub

Ich hoffe, das hilft.
Ich denke, wenn man die Selects rausbekommen würde. bringt das schon was.
Wie ist es denn eigentlich mit
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlManual
und am Ende alles wieder zurück? Bringt das was bzw. geht das?
Gruß Jens
Anzeige
damit kann ich nix anfangen... (ich bin raus)
31.05.2010 11:25:24
Tino
Hallo,
und habe auch keine Zeit o. Lust mir etwas passendes zusammenzureimen.
Beispiel wie es ohne Selektion geht hast Du von Thorsten bekommen.
Ich bin somit raus.
Gruß Tino
AW: Makro langsam - tunen möglich?
31.05.2010 10:44:18
Oberschlumpf
Hi Jens
Versuch mal so:
hier der Code ohne Erklärung, dafür aber übersichtlicher
Sub Ermittlung(row, d)
Dim Zeile As Long
iv = 1
With Sheets("Statistik")
Do While row - iv > 0
If .Cells(row - iv, 12) = d Then
.Cells(1, 15).Value = .Cells(row - iv, 4)
.Cells(1, 8).Value = .Cells(1, 15)
End If
If .Cells(row - iv, 12) = d Then
iv = row
End If
iv = iv + 1
Loop
Zeile = .UsedRange.Rows.Count
End With
End Sub

jetzt der Code mit Erklärung:
Sub Ermittlung(row, d)
'Dim-Zeilen muss man nicht am Anfang schreiben,
'aber sollten immer zuerst im Code stehen
Dim Zeile As Long
iv = 1
'ohne das Blatt mit Activate zu wechseln,
'wird mit With... trotzdem das gewünschte
'Blatt angesprochen
With Sheets("Statistik")
Do While row - iv > 0
'jeder Zugriff auf eine Zelle im Blatt,
'welches mit With... eingeleitet wurde,
'muss mit einem vorangestellten Punkt (.)
'beginnen
If .Cells(row - iv, 12) = d Then
.Cells(1, 15).Value = .Cells(row - iv, 4)
.Cells(1, 8).Value = .Cells(1, 15)
End If
If .Cells(row - iv, 12) = d Then
iv = row
End If
iv = iv + 1
Loop
Zeile = .UsedRange.Rows.Count
End With
End Sub

Du schreibst:
Cells( ActiveCell.row, ActiveCell.Column - 8)
ich hab daraus gemacht:
.Cells(row - iv, 4)
also aus ActiveCell.Column - 8 wird einfach nur 4
Denn mir war aufgefallen, dass in deinem Code immer 12-8 als Spaltenvorgabe errechnet wird.
So kannst du also auch gleich 4 schreiben.
Mein Code ist ungetestet, da auch ich, wie Tino, deine Datei nicht kenne.
Hilfts denn?
Ciao
Thorsten
Anzeige
AW: Makro langsam - tunen möglich?
31.05.2010 11:10:07
jens
Hallo Thorsten,
ich baue das mal ein, habe aber das Problem mit dem Tabellenblatt:
Ich muß am Anfang der Prozedur das Tabellenblatt ansprechen...
Hier mal das Gesamtkonstrukt:
Sub TLB_New()
Sheets("Statistik").Select
Reverse = 5
JC_SL = 500
JC_SH = 500
row = 2
col = 8
x = 1
y = 1
Dim Zeile As Long
Zeile = ActiveSheet.UsedRange.Rows.Count
'----------------------------------------------------------------------------------------------- _
Cells(1, 8).Value = JC_SL
Cells(1, 9).Value = JC_SL
Cells(1, 12).Value = JC_SH
Cells(1, 13).Value = JC_SH
'----------------------------------------------------------------------------------------------- _
For i = 1 To Zeile - 2
If Cells(row, 4)  Reverse Then c = Cells(row, 8) - Reverse: Call  _
Ermittlung1_new(row, c)
If Cells(row, 4)  Cells(1, 12) Then Cells(row, 12) = y Else Cells(row, 12) = 0
If Cells(row, 4) > Cells(1, 12) Then Cells(row, 12).Interior.ColorIndex = 36
If Cells(row, 12) = 1 Then Cells(1, 14) = Cells(row, 4)
If Cells(row, 4) > Cells(1, 12) Then y = y + 1
If Cells(row, 12) > Reverse Then d = Cells(row, 12) - Reverse: Call  _
Ermittlung2_new(row, d)
If Cells(row, 4) > Cells(1, 12) Then Cells(1, 12).Value = Cells(row, 4)
If Cells(row, 12) = 1 Then x = 1
If Cells(row, 8) = 1 Then y = 1
row = row + 1
Next i
End Sub
Sub Ermittlung1_new(row, c)
iii = 1
Do While row - iii > 0
If Cells(row - iii, 8) = c Then Cells(row - iii, 8).Activate: Cells(1, 11).Value = Cells( _
ActiveCell.row, ActiveCell.Column - 4): Cells(1, 12).Value = Cells(1, 11)
If Cells(row - iii, 8) = c Then iii = row
iii = iii + 1
Loop
End Sub
Sub Ermittlung2_new(row, d)
iv = 1
Do While row - iv > 0
If Cells(row - iv, 12) = d Then Cells(row - iv, 12).Activate: Cells(1, 15).Value = Cells( _
ActiveCell.row, ActiveCell.Column - 8): Cells(1, 8).Value = Cells(1, 15)
If Cells(row - iv, 12) = d Then iv = row
iv = iv + 1
Loop
End Sub

Ich hoffe, das hilft.
Ich denke, wenn man die Selects rausbekommen würde. bringt das schon was.
Wie ist es denn eigentlich mit
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlManual
und am Ende alles wieder zurück? Bringt das was bzw. geht das?
Gruß Jens
Anzeige
AW: Makro langsam - tunen möglich?
31.05.2010 11:15:10
Oberschlumpf
Hi Jens
Sorry, aber wenn ich deine Datei nicht kenne, hilft mir auch nur der Code nicht viel.
Denn woher weiß ich, dass du vllt nicht etwas Entscheidendes vergessen hast, was deine Original-Datei betrifft?
Und anstelle der Originaldaten könntest du selbige ja durch Bsp-Daten ersetzen.
Wünsche weiter viel Erfolg!
Ciao
Thorsten
AW: Makro langsam - tunen möglich?
31.05.2010 11:46:16
jens
Hallo Thorsten,
kann ich verstehen.
Ich habe jetzt mal
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlManual
und am Ende wieder zurück gesetzt - das bringt schon einiges.
Du hattest mir ja das Ermittlungs1 Makro umgeschrieben - ich habe es mal mit dem 2er probiert aber nicht hinbekommen.
Wäre sehr nett, wenn Du das noch mal analog umschreiben würdest.
Sub Ermittlung2(row, c)
iii = 1
Do While row - iii > 0
If Cells(row - iii, 8) = c Then Cells(row - iii, 8).Activate: Cells(1, 11).Value = Cells( _
ActiveCell.row, ActiveCell.Column - 4): Cells(1, 12).Value = Cells(1, 11)
If Cells(row - iii, 8) = c Then iii = row
iii = iii + 1
Loop
End Sub
Das war von Dir (nur mit . davor wegen des Sheets)
Sub Ermittlung1(row, d)
iv = 1
Do While row - iv > 0
If Cells(row - iv, 12) = d Then
Cells(1, 15).Value = Cells(row - iv, 4)
Cells(1, 8).Value = Cells(1, 15)
End If
If Cells(row - iv, 12) = d Then
iv = row
End If
iv = iv + 1
Loop
End Sub
Ich werde mich dann mal an das oberste Makro machen und das mit dem .cells... machen und dem with beim Tabellenblatt. (Muß das dann in den Ermittlungsmakros auch drin bleiben? Ich habe das mal rausgenommen weil ich ja im Hauptmakro das Blatt selektiere)
Nochmals vielen Dank für Deine Hilfe
Viele Grüße
Jens
Anzeige
Zwei Lösungsansätze:
31.05.2010 11:42:48
Martin
Hallo Jens,
prinzipiell können Makros über zwei Möglichkeiten wesentlich schneller arbeiten:
1. Mit "Application.Screenupdating = False" muss der Bildschirminhalt nicht immer aktualisiert werden. Bitte am Ende des Makros wieder auf "True" setzen.
2. Bei jeder Änderung des Zellinhalts werden alle Zellen neu berechnet. Die Makros werden um ein Vielfaches beschleunigt, wenn diese automatische Berechnung vorübergehend mit "Application.Calculation = xlCalculationManual" deaktiviert wird. Falls aber im Makro eine Neuberechnung der Zellen notwendig ist, setze zuvor "Application.Calculate" ein. Am Ende des Makros solltest du die automatische Berechnung mit "Application.Calculation = xlCalculationAutomatic" wieder aktivieren.
Viele Grüße
Martin
Anzeige
AW: Zwei Lösungsansätze:
31.05.2010 11:49:09
jens
Hallo Martin,
vielen Dank.
Ich habe es jetzt mit
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlManual
und am Ende wieder zurück gemacht und das hat schon etwas gebracht.
Wenn ich jetzt noch mein 2tes Ermittlungsmakro umgeschrieben bekomme dann sollte es schnell genug sein. (Siehe Tread mit Oberschlumpf)
Vielen Dank Gruß Jens

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige