Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema InputBox
BildScreenshot zu InputBox InputBox-Seite mit Beispielarbeitsmappe aufrufen

Schleife zu langsam | Herbers Excel-Forum


Betrifft: Schleife zu langsam von: Cimmer
Geschrieben am: 30.11.2009 13:16:55

Hi,
ich habe ein Makro das in einer Schleife für mehrere 100.000 Zeilen in 20 Spalten Berechnungen durchführt. Die Folge ist, dass das Makro fast 5 Minuten läuft. Der Startpunkt des Makros wird von Hand festgelegt (Startzelle).
Wie kann ich das Makro schneller machen?
Vielleicht kommt man ja irgendwie ohne Schleife aus?
Als Beispiel habe ich die Berechnung für 2 Spalten eingefügt.

Danke

Leon

Sub Schleife()
Dim Startzelle As Range
Dim intZeile, intZeileQ As Integer
Dim intSpalte As Integer
Dim A, h, s As Integer

A = 2
h = 15
s = 16

d = 235.2
r = 117.6
d0 = 18.4

Set Startzelle = Application.InputBox("Markieren Sie die Startzelle", Type:=8)
'Application.ScreenUpdating = False

intZeileQ = Startzelle.Row
intSpalte = Startzelle.Column
For intZeile = intZeileQ To Cells(Rows.Count, intSpalte).End(xlUp).Row


    Cells(intZeile, h).Value = r - d0 - Cells(intZeile, A).Value

    If Cells(intZeile, h).Value <= r Then
        Cells(intZeile, s).Value = 2 * (r ^ 2 - (r - Cells(intZeile, h).Value) ^ 2) ^ 0.5
    Else
        Cells(intZeile, s).Value = d + d - (2 * (r ^ 2 - (r - Cells(intZeile, h).Value) ^ 2) ^   _
_
0.5)
    End If
    
'Application.ScreenUpdating = True

Next intZeile
End Sub

  

Betrifft: AW: Schleife zu langsam von: Ramses
Geschrieben am: 30.11.2009 13:49:38

Hallo

Das Makro ist etwas schleierhaft.

1. "...If Cells(intZeile, h).Value <= r..."
Die Prüfung ergibt eigentlich keinen Sinn

r - d0 - cells(intZeile,A).Value = 117.6 - 18.4 - cells(intZeile,A).Value

weil dieser Wert in der Zelle IMMER kleiner sein wird als "r = 117.6".

Die könntest du dir also eigentlich sparen

2. Schalte die Berechnung auf während des Makros auf Manuell und aktiviere die Bildschirmaktualisiserung
With Application
.Calculation = xlManual
.ScreenUpdating = False

Dein Code

.Calculation = xlAutomatic
.ScreenUpdating = True
End with

3. ".-..einer Schleife für mehrere 100.000 Zeilen in 20 Spalten Berechnungen ..:"
Das sind dann im Minimum mehr als 20 Millionen Berechnungen,... was erwartest du denn ? :-)


Gruss Rainer


  

Betrifft: AW: Schleife zu langsam von: Cimmer
Geschrieben am: 01.12.2009 14:18:13

Hallo Rainer, Ansgar und Daniel,

vielen Dank für die hilfreichen Tips. Wieder was dazugelernt.
Rainer: Die Prüfung ergibt dann Sinn, wenn "Cells(intZeile, A).Value" negativ wird oder sollte es hier eine Besonderheit in VBA geben, die ich übersehen habe?

Gruß
Leon


  

Betrifft: AW: Schleife zu langsam von: Albrecht
Geschrieben am: 30.11.2009 13:52:26

Servus Leon,

das Einschalten der Bildschirm-Aktualisierung solltest Du außerhalb der Schleife platzieren, wenn Du es wieder aktivieren möchtest (im Moment nur Kommentar).

Außerdem sollte das Neuberechnen abgeschaltet werden, so lange in den Schleifen Zelleinträge vorgenommen werden und neue Einträge keinen Einfluss auf die laufenden Schleifen haben:
Application.Calculation = xlCalculationManual

Außerhalb der Schleife und vor End Sub das Neuberechnen wieder auf automatisch stellen:
Application.Calculation = xlCalculationAutomatic

Gruß
Ansgar


  

Betrifft: AW: Schleife zu langsam Formeln sind schneller von: Daniel
Geschrieben am: 30.11.2009 19:28:31

Hi

in den meisten Fällen ist es günstiger, derartige Berechnungen nicht in VBA über Schleifen, sondern direkt in Excel über Formeln rechnen zu lassen.
Das Makro hat dann nur noch die Funktion, die Formeln in den Zellbereich zu schreiben und ggf. die Formeln durch Werte zu ersetzen.

desweiteren solltest du beachten, daß:

Dim intZeile, intZeileQ As Integer 

nur die die Variable intZeileQ als Integer deklariert, die Variable intZeile hingegen als Variant!
Die Dimensionierung muss für jede Variable erfolgen:
Dim intZeile as Long, intZeileQ As Long 

(Integer ist für Zeilenwerte ungeignet, da der Zahlenraum bei Integer zu klein ist.)

Außerdem solltest du dir angewöhnen IMMER mit OPTION EXPLICIT zu arbeiten, ein Teil der Variablen ist bei dir nicht deklariert.

Gruß, Daniel


Beiträge aus den Excel-Beispielen zum Thema "Schleife zu langsam"