Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1312to1316
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
Code schneller machen
16.05.2013 13:56:50
Anfängerin13
Hallo,
ich habe jetzt einen Code, der durch fast 8790 Zeilen läuft, und daher etwas lange (über 40 min) braucht.
Kann man den vielleicht etwas schlauer schreiben und dadurch schneller machen?
Vielen Dank an euch schon mal.
Sub Optimize()
Dim noCells As Integer
Dim highDemandRow As Integer
Dim sumCheck As Integer
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlAutomatic
.MaxChange = 0.001
.StatusBar = True
End With
Worksheets("DATA").Select
noCells = WorksheetFunction.CountA(Range(Cells(3, 68), Cells(3, 68).End(xlDown)))
Range(Cells(3, 9), Cells(noCells + 2, 9)).ClearContents
Range(Cells(3, 11), Cells(noCells + 2, 11)).ClearContents
For i = 1 To noCells
sumCheck = WorksheetFunction.Sum(Range("BQ:BQ"))
Columns("BP:BP").Select
Columns("BP:BP").Find(What:=i, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True _
, SearchFormat:=False).Select
On Error Resume Next
highDemandRow = Selection.row
Application.StatusBar = "Completed " & i & " of " & noCells & " hours"
If (sumCheck = 0) Then
If (Cells(highDemandRow, 10) > 0) Then
If Cells(highDemandRow, 10) >= Cells(highDemandRow, 8) Then
Cells(highDemandRow, 9).Value = Cells(highDemandRow, 8)
Cells(highDemandRow, 11).Value = Cells(highDemandRow, 8)
Else
Cells(highDemandRow, 9).Value = Cells(highDemandRow, 10)
Cells(highDemandRow, 11).Value = Cells(highDemandRow, 10)
End If
End If
Else
Columns("BP:BP").Find(What:=(i - 1), After:=ActiveCell, LookIn:=xlValues, LookAt:=  _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, SearchFormat:=False).Select
highDemandRow = Selection.row
Range(Cells(highDemandRow, 9), Cells(highDemandRow, 9)).ClearContents
Range(Cells(highDemandRow, 11), Cells(highDemandRow, 11)).ClearContents
End If
Next i
Application.StatusBar = ""
With Application
.ScreenUpdating = True
.Calculation = xlAutomatic
.StatusBar = False
End With
End Sub

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
.Calculation=xlCalculationManual
16.05.2013 14:14:38
ransi
Hallo
Hat das einen bestimmten Grund warum du die Berechnung auf automatik stellst ?
Das ist nämlich die Bremse.
Versuch mal so:
.Calculation=xlCalculationManual
ransi

AW: .Calculation=xlCalculationManual
16.05.2013 14:43:53
Anfängerin13
Hallo ransi,
du hast Recht, aber leider läuft der Code dann auch nicht mehr korrekt.
Vielleicht überspringt er dann meine Prüfung:
sumCheck = WorksheetFunction.Sum(Range("BQ:BQ"))
If (sumCheck = 0) Then....
grüße zurück

AW: Code schneller machen
16.05.2013 14:15:29
Klaus
Hallo Mylady (da schließe ich mich Luc an),
9000 Zeilen zu durchlaufen dauert numal seine Zeit. Ich hab mal die paar Selects rausgenommen, die Refernenzierung verbessert und ein paar Artefakte entfernt. Vielleicht bringt das schon was.
Sub Optimize()
Dim noCells As Integer
Dim highDemandRow As Integer
Dim sumCheck As Integer
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlAutomatic
.MaxChange = 0.001
.StatusBar = True
End With
With Worksheets("DATA")
noCells = WorksheetFunction.CountA(.Range(.Cells(3, 68), .Cells(3, 68).End(xlDown)))
.Range(.Cells(3, 9), .Cells(noCells + 2, 9)).ClearContents
.Range(.Cells(3, 11), .Cells(noCells + 2, 11)).ClearContents
sumCheck = WorksheetFunction.Sum(.Range("BQ:BQ"))
For i = 1 To noCells
On Error Resume Next
highDemandRow = .Columns("BP:BP").Find(What:=i, LookIn:=xlValues, LookAt:=xlWhole).Row
Application.StatusBar = "Completed " & i & " of " & noCells & " hours"
If (sumCheck = 0) Then
If (.Cells(highDemandRow, 10).Value > 0) Then
If .Cells(highDemandRow, 10).Value >= .Cells(highDemandRow, 8) Then
.Cells(highDemandRow, 9).Value = .Cells(highDemandRow, 8).Value
.Cells(highDemandRow, 11).Value = .Cells(highDemandRow, 8).Value
Else
.Cells(highDemandRow, 9).Value = .Cells(highDemandRow, 10).Value
.Cells(highDemandRow, 11).Value = .Cells(highDemandRow, 10).Value
End If
End If
Else
highDemandRow = .Columns("BP:BP").Find(What:=i - 1, LookIn:=xlValues, LookAt:= _
xlWhole).Row
.Cells(highDemandRow, 9).ClearContents
.Cells(highDemandRow, 11).ClearContents
End If
Next i
Application.StatusBar = ""
End With
With Application
.ScreenUpdating = True
.Calculation = xlAutomatic
.StatusBar = False
End With
End Sub
deine Prüfung
sumCheck = WorksheetFunction.Sum(Range("BQ:BQ"))
begreife ich vom Logikverständniss her nicht. In BQ wird das ganze Makro über nichts geändert, warum prüfst du das jedes mal neu? An Formelbeziehungen kann es nicht liegen, denn du hast die Auto-Berechnung ausgeschaltet. Hab ich über die Schleife gehoben.
HighDemandRow holst du dir zweimal, kann sich aber in der Zeit nicht geändert haben. Einmal für i, einmal für i-1. Solltest du, allein wegen der Übersichtlichkeit, anders machen. Vielleicht eine zweite Variable einführen?
Weiteres Potential kann ich erstmal nicht sehen, da ich ja auch deine Masterdatei nicht kenne.
Grüße,
Klaus M.vdT.

Anzeige
AW: Code schneller machen
16.05.2013 14:40:05
Anfängerin13
Hallo Klaus,
vielen Dank zunächst einmal :)
Nun zum Code: In der Reihe sumCheck = WorksheetFunction.Sum(Range("BQ:BQ") geht es darum zu prüfen, ob meine Werte in Column 10 jemals negativ werden, denn das dürfen sie nicht. Und da diese Optimierung, beginnend vom höchsten Demand (welchen ich in BP descending geranked habe), immer wieder Werte einfügt (in Col 9 und 11) und somit die Menge ändert, ist es wichtig zu prüfen, ob meine Werte auch positiv bleiben.
Das mache ich mit sumCheck, denn wenn die Werte positiv sind, ist eine "0" deklariert. Sind sie negativ ist eine "1" deklariert. Das heisst nur solange SumCheck=0 ist soll die Optimierung funktionieren.
Gehen die Werte ins negative, folgt ClearContent und er macht weiter, da zwischendrin immer wieder neu hinzugefügte Menge kommt. Zur Info: Ich schreibe meine Masterarbeit und optimiere ein Staumdamm dazu :// (Column 10 ist Wassermenge, welche steigt aber nach Nutzung sinkt und BP ist die gerankte Nachfrage beginnend vom höchsten Wert, BQ prüft mit den Nullen, ob bei jedem Vorgang wir auch noch positiv Wasser verfügen).
Wenn ich den Code auf .Calculation = xlCalculationManual setze, dann läuft Column 10 (wasser) ins negative.
Dein Code läuft übrigens gerade nebenbei, leider noch auf automatic und daher langsam. Aber mal schauen, ob es diesmal weniger als 45 min dauert.
Vielen Dank!!
Grüße,
Mylady (sehr höflich von euch) :)

Anzeige
AW: Code schneller machen
16.05.2013 14:48:03
Klaus
Hallo Mylady,
sorry - ohne den genauen Vorgang zu kennen kann ich da nicht weiterhelfen. Aber wenn du schreibst "Masterarbeit zu Staudämmen" dann würde ich den Vorgang warscheinlich eh nicht verstehen :-)
Eine ganz doofe Frage hab ich dann aber. Ich kann mir vorstellen, dass die Berechnungen von Staudämmen und Wassermassen nicht ganz ohne ist. Bist du dir sicher, dass Excel das richtige Programm für dich ist? Ich meine, ich kenne eine handvoll Geologen, Physiker usw ... die geben sich mit Excel nicht ab, sondern nutzen zB Matlab oder programmieren ihre Formeln gleich in Fortran oder C.
Zb über die Problematik der Fliesskommaberechnung in Excel bist du dir bewusst? Maximal 15 signifikante Stellen usw?
Zu deinem selbstgewählten Spitznamen :-) Was machst du denn, wenn du nach 6 Jahren regelmäßigem herber.de Konsum eine solide Basis an Formel- und VBA-Wissen angesammelt hast und plötzlich feststellst, dass du mehr Fragen beantwortest als stellst? Benennst du dich dann um?
Grüße,
Klaus M.vdT.

Anzeige
AW: Code schneller machen
16.05.2013 14:59:31
Anfängerin13
Hey Klaus,
ja ich dachte eigentlich nie daran, jemals gut im Bereich VBA zu werden, jedoch bin ich erstaunt wie logisch es doch ist. Sollte ich jemals wirklich gut werden und anderen helfen, melde ich mich einfach neu an ;)
Ja Matlab wäre in der Tat ein besseres Programm, jedoch besitzt man nicht mal eben so Matlab, Excel hingegen schon. Da die Logik auch nicht sonderlich aufwändig ist und ich das Ganze nicht mit physikalischen Bedingungen (wie Fallhöhe des Wassers, Gravitation oder Turbinengröße) erstelle, dachte ich, dass Excel reichen sollte. Für mich auf jeden Fall eine neue Erfahrung, da ich eigentlich nur Rentabilität maximieren möchte (und Finanzen studiere) ;)

Anzeige
AW: Code schneller machen
16.05.2013 15:15:40
Klaus
(und Finanzen studiere)
Dafür ist Excel tatsächlich das richtige! :-)
Viel Erfolg wünsche ich dir. Ich sehe grad das Rudi sich eingeschaltet hat, darum lehne ich mich jetzt entspannt zurück und überlasse das Feld dem besseren VBA-ler.
Grüße,
Klaus M.vdT.
(ich hab grad mal gegoogelt, MatLab kostet inklusiver aller Addins schmale 83.000,00€. Das kann man sich doch privat mal gönnen, oder?)

AW: Code schneller machen
16.05.2013 15:09:11
Rudi
Hallo,
lad doch mal einen Auschnitt der Mappe hoch.
Vermutlich kann man das auch in ein paar Sekunden erledigen.
Gruß
Rudi

16 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige