Anzeige
Archiv - Navigation
944to948
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
944to948
944to948
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Schnellerer Ablauf

Schnellerer Ablauf
25.01.2008 01:13:00
Gordon
Moin,
hab mal da 'ne allgemeine Frage. Gibt es Möglichkeien, zB durch bestimmte Optionen, dass ein Programm schneller abläuft?
Ich meine andere Möglichkeiten als 'ne schnellere CPU zu benutzen oder den Quelltext zu kürzen. Ich kann mir zwar die Antwort schon denken, aber ich frage einfach mal so nach. Vielleicht gibt's ja 'nen Expertentipp.
Gruß
Gordon

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

Betreff
Datum
Anwender
Anzeige
AW: Schnellerer Ablauf
25.01.2008 01:36:01
Daniel
Hi
Aus der reinen Quelltextlänge lässt sich noch kein Rückschluss auf die Programmlaufzeit bilden.
In Excel selbt wären mir keine Schalter bekannt, wo man von schnell auf langsam umschalten kann.
der schlüssel zum schnellen Programmablauf ist immer eine intelligente Programmierung.
ein kleines Beispiel, wie man eine Aufgabe unterschiedlich lösen kann, findest du hier:
https://www.herber.de/forum/messages/944011.html
wenn du die verschiedenen Varianten ausprobierst, wirst du feststellen, daß der kürzeste Kode nicht der schnellste ist.
Gruß, Daniel

Anzeige
AW: Schnellerer Ablauf
25.01.2008 22:40:51
Gordon
Verstehe ich.
Nur leider bin ich nicht so der versierte Programmiere in VBA, als das ich verschiedene Kode ausprobieren könnte, geschweige überhaupt einen intelligenten Ablauf hinzubekommen.
Ich habe folgenden Quelltext in einem Modul:

Sub Januar()
Dim z As Long           'Zeile
Dim honorare As Long    '4181 Honorare
Dim fahrt As Long       '4000 TN_Fahrt u. Reisek.
Dim mittel As Long      '4010 TN_Lehr-u. Lernmittel
Dim kleidung As Long    '4020 TN Berufskleid.
Dim bewirtung As Long   '4050 TN Bewirtung
Dim pädagogisch As Long '4060 TN Pädag. Sonderm.
Dim transport As Long   '4781 Transport- kosten
Dim porto As Long       '4910 Porto- Post-gebühren
Dim büro As Long        '4930 Büro- Verwaltungs-bedarf
Dim bücher As Long      '4940 Bücher Zeitschriften
With Worksheets("Januar")
For z = .Range("H500").End(xlUp).Row To 4 Step -1
If .Cells(z, 8) = Worksheets("Jahresübersicht").Range("A24") Then
Select Case .Cells(z, 6)
Case 4181: honorare = honorare + .Cells(z, 7)
Case 4000: fahrt = fahrt + .Cells(z, 7)
Case 4010: mittel = mittel + .Cells(z, 7)
Case 4020: kleidung = kleidung + .Cells(z, 7)
Case 4050: bewirtung = bewirtung + .Cells(z, 7)
Case 4060: pädagogisch = pädagogisch + .Cells(z, 7)
Case 4781: transport = transport + .Cells(z, 7)
Case 4910: porto = porto + .Cells(z, 7)
Case 4930: büro = büro + .Cells(z, 7)
Case 4940: bücher = bücher + .Cells(z, 7)
End Select
End If
Next
End With
With Worksheets("Jahresübersicht")
.Range("B26") = honorare
.Range("C26") = fahrt
.Range("d26") = mittel
.Range("e26") = kleidung
.Range("f26") = bewirtung
.Range("g26") = pädagogisch
.Range("h26") = transport
.Range("i26") = porto
.Range("j26") = büro
.Range("k26") = bücher
End With
honorare = 0
fahrt = 0
mittel = 0
kleidung = 0
bewirtung = 0
pädagogisch = 0
transport = 0
porto = 0
büro = 0
bücher = 0
With Worksheets("Januar")
For z = .Range("H500").End(xlUp).Row To 4 Step -1
If .Cells(z, 8) = Worksheets("Jahresübersicht").Range("A42") Then
Select Case .Cells(z, 6)
Case 4181: honorare = honorare + .Cells(z, 7)
Case 4000: fahrt = fahrt + .Cells(z, 7)
Case 4010: mittel = mittel + .Cells(z, 7)
Case 4020: kleidung = kleidung + .Cells(z, 7)
Case 4050: bewirtung = bewirtung + .Cells(z, 7)
Case 4060: pädagogisch = pädagogisch + .Cells(z, 7)
Case 4781: transport = transport + .Cells(z, 7)
Case 4910: porto = porto + .Cells(z, 7)
Case 4930: büro = büro + .Cells(z, 7)
Case 4940: bücher = bücher + .Cells(z, 7)
End Select
End If
Next
End With
With Worksheets("Jahresübersicht")
.Range("B44") = honorare
.Range("C44") = fahrt
.Range("d44") = mittel
.Range("e44") = kleidung
.Range("f44") = bewirtung
.Range("g44") = pädagogisch
.Range("h44") = transport
.Range("i44") = porto
.Range("j44") = büro
.Range("k44") = bücher
End With
honorare = 0
fahrt = 0
mittel = 0
kleidung = 0
bewirtung = 0
pädagogisch = 0
transport = 0
porto = 0
büro = 0
bücher = 0
With Worksheets("Januar")
For z = .Range("H500").End(xlUp).Row To 4 Step -1
If .Cells(z, 8) = Worksheets("Jahresübersicht").Range("A60") Then
Select Case .Cells(z, 6)
Case 4181: honorare = honorare + .Cells(z, 7)
Case 4000: fahrt = fahrt + .Cells(z, 7)
Case 4010: mittel = mittel + .Cells(z, 7)
Case 4020: kleidung = kleidung + .Cells(z, 7)
Case 4050: bewirtung = bewirtung + .Cells(z, 7)
Case 4060: pädagogisch = pädagogisch + .Cells(z, 7)
Case 4781: transport = transport + .Cells(z, 7)
Case 4910: porto = porto + .Cells(z, 7)
Case 4930: büro = büro + .Cells(z, 7)
Case 4940: bücher = bücher + .Cells(z, 7)
End Select
End If
Next
End With
With Worksheets("Jahresübersicht")
.Range("B62") = honorare
.Range("C62") = fahrt
.Range("d62") = mittel
.Range("e62") = kleidung
.Range("f62") = bewirtung
.Range("g62") = pädagogisch
.Range("h62") = transport
.Range("i62") = porto
.Range("j62") = büro
.Range("k62") = bücher
End With
honorare = 0
fahrt = 0
mittel = 0
kleidung = 0
bewirtung = 0
pädagogisch = 0
transport = 0
porto = 0
büro = 0
bücher = 0
With Worksheets("Januar")
For z = .Range("H500").End(xlUp).Row To 4 Step -1
If .Cells(z, 8) = Worksheets("Jahresübersicht").Range("A78") Then
Select Case .Cells(z, 6)
Case 4181: honorare = honorare + .Cells(z, 7)
Case 4000: fahrt = fahrt + .Cells(z, 7)
Case 4010: mittel = mittel + .Cells(z, 7)
Case 4020: kleidung = kleidung + .Cells(z, 7)
Case 4050: bewirtung = bewirtung + .Cells(z, 7)
Case 4060: pädagogisch = pädagogisch + .Cells(z, 7)
Case 4781: transport = transport + .Cells(z, 7)
Case 4910: porto = porto + .Cells(z, 7)
Case 4930: büro = büro + .Cells(z, 7)
Case 4940: bücher = bücher + .Cells(z, 7)
End Select
End If
Next
End With
With Worksheets("Jahresübersicht")
.Range("B80") = honorare
.Range("C80") = fahrt
.Range("d80") = mittel
.Range("e80") = kleidung
.Range("f80") = bewirtung
.Range("g80") = pädagogisch
.Range("h80") = transport
.Range("i80") = porto
.Range("j80") = büro
.Range("k80") = bücher
End With
honorare = 0
fahrt = 0
mittel = 0
kleidung = 0
bewirtung = 0
pädagogisch = 0
transport = 0
porto = 0
büro = 0
bücher = 0
With Worksheets("Januar")
For z = .Range("H500").End(xlUp).Row To 4 Step -1
If .Cells(z, 8) = Worksheets("Jahresübersicht").Range("A96") Then
Select Case .Cells(z, 6)
Case 4181: honorare = honorare + .Cells(z, 7)
Case 4000: fahrt = fahrt + .Cells(z, 7)
Case 4010: mittel = mittel + .Cells(z, 7)
Case 4020: kleidung = kleidung + .Cells(z, 7)
Case 4050: bewirtung = bewirtung + .Cells(z, 7)
Case 4060: pädagogisch = pädagogisch + .Cells(z, 7)
Case 4781: transport = transport + .Cells(z, 7)
Case 4910: porto = porto + .Cells(z, 7)
Case 4930: büro = büro + .Cells(z, 7)
Case 4940: bücher = bücher + .Cells(z, 7)
End Select
End If
Next
End With
With Worksheets("Jahresübersicht")
.Range("B98") = honorare
.Range("C98") = fahrt
.Range("d98") = mittel
.Range("e98") = kleidung
.Range("f98") = bewirtung
.Range("g98") = pädagogisch
.Range("h98") = transport
.Range("i98") = porto
.Range("j98") = büro
.Range("k98") = bücher
End With
honorare = 0
fahrt = 0
mittel = 0
kleidung = 0
bewirtung = 0
pädagogisch = 0
transport = 0
porto = 0
büro = 0
bücher = 0
With Worksheets("Januar")
For z = .Range("H500").End(xlUp).Row To 4 Step -1
If .Cells(z, 8) = Worksheets("Jahresübersicht").Range("A114") Then
Select Case .Cells(z, 6)
Case 4181: honorare = honorare + .Cells(z, 7)
Case 4000: fahrt = fahrt + .Cells(z, 7)
Case 4010: mittel = mittel + .Cells(z, 7)
Case 4020: kleidung = kleidung + .Cells(z, 7)
Case 4050: bewirtung = bewirtung + .Cells(z, 7)
Case 4060: pädagogisch = pädagogisch + .Cells(z, 7)
Case 4781: transport = transport + .Cells(z, 7)
Case 4910: porto = porto + .Cells(z, 7)
Case 4930: büro = büro + .Cells(z, 7)
Case 4940: bücher = bücher + .Cells(z, 7)
End Select
End If
Next
End With
With Worksheets("Jahresübersicht")
.Range("B116") = honorare
.Range("C116") = fahrt
.Range("d116") = mittel
.Range("e116") = kleidung
.Range("f116") = bewirtung
.Range("g116") = pädagogisch
.Range("h116") = transport
.Range("i116") = porto
.Range("j116") = büro
.Range("k116") = bücher
End With
honorare = 0
fahrt = 0
mittel = 0
kleidung = 0
bewirtung = 0
pädagogisch = 0
transport = 0
porto = 0
büro = 0
bücher = 0
End Sub


Dieser Quelltext liegt in zwölf Modulen. Es ist immer der gleiche Ablauf, bis auf die Namensgebung. In jedem Modul liegt ein Monat. Diese ganzen Module werden mit einem Buttonklick ausgeführt. Und je nach CPU-Stärke dauert dieser Ablauf recht lange.
Wo könnte ich denn hier am besten ansetzen, diesen Code intelligenter zu gestalten?

Anzeige
AW: Schnellerer Ablauf
26.01.2008 20:34:02
MichaV
Hi,
eine grundlegende Sache: Wenn Du in Schleifen immer die gleichen Objekt- Eigenschaften abfragst (wie z.B. Cells(z,7)), dann speichere den Wert vorher in eine Variablen:
t=Cells(z,7) '-- Objekt-Eigenschaft in Variable gespeichert
For i=500 to 4 Step -1
If Cells(i,2)=t Then '-- schnellerer Zugriff auf Variable
...
Next
...das ist deutlich schneller. Ansonsten gibts da nicht so wahnsinnig viel zu optimieren. Vielleicht eine etwas übersichtlichere Variante, ungetestet:


Sub Eintragen()
Dim i As Integer
For i = 24 To 114 Step 18
  Uebersicht "Januar", i
Next i
End Sub
Function Uebersicht(strMonat As String, lngZeile As Long)
   Dim z As Long           'Zeile
   Dim honorare As Long    '4181 Honorare
   Dim fahrt As Long       '4000 TN_Fahrt u. Reisek.
   Dim mittel As Long      '4010 TN_Lehr-u. Lernmittel
   Dim kleidung As Long    '4020 TN Berufskleid.
   Dim bewirtung As Long   '4050 TN Bewirtung
   Dim pädagogisch As Long '4060 TN Pädag. Sonderm.
   Dim transport As Long   '4781 Transport- kosten
   Dim porto As Long       '4910 Porto- Post-gebühren
   Dim büro As Long        '4930 Büro- Verwaltungs-bedarf
   Dim bücher As Long      '4940 Bücher Zeitschriften
   Dim lngAbfrage As Long
   Dim sngEintrag As Single
   With Worksheets(strMonat)
      lngAbfrage = Worksheets("Jahresübersicht").Range("A" & lngZeile)
      For z = .Range("H500").End(xlUp).Row To 4 Step -1
         If .Cells(z, 8) = lngAbfrage Then
            sngEintrag = .Cells(z, 7)
            Select Case .Cells(z, 6)
               Case 4181: honorare = honorare + sngEintrag
               Case 4000: fahrt = fahrt + sngEintrag
               Case 4010: mittel = mittel + sngEintrag
               Case 4020: kleidung = kleidung + sngEintrag
               Case 4050: bewirtung = bewirtung + sngEintrag
               Case 4060: pädagogisch = pädagogisch + sngEintrag
               Case 4781: transport = transport + sngEintrag
               Case 4910: porto = porto + sngEintrag
               Case 4930: büro = büro + sngEintrag
               Case 4940: bücher = bücher + sngEintrag
            End Select
         End If
      Next
   End With
   With Worksheets("Jahresübersicht")
      .Range("B" & lngZeile + 2) = honorare
      .Range("C" & lngZeile + 2) = fahrt
      .Range("d" & lngZeile + 2) = mittel
      .Range("e" & lngZeile + 2) = kleidung
      .Range("f" & lngZeile + 2) = bewirtung
      .Range("g" & lngZeile + 2) = pädagogisch
      .Range("h" & lngZeile + 2) = transport
      .Range("i" & lngZeile + 2) = porto
      .Range("j" & lngZeile + 2) = büro
      .Range("k" & lngZeile + 2) = bücher
   End With
End Function


Gruß- Micha
PS: Rückmeldung wäre nett.

Anzeige
AW: Schnellerer Ablauf
28.01.2008 10:19:00
Gordon
Danke erstmal für den Tipp,
habe es leider aus Zeitmangel selbst noch nicht probieren können, aber den Quelltext den du mir da mitgesendet hast, habe ich mal nun in mein Modul "Januar" eingefügt. Leider kam gleich eine Fehlermeldung beim ausprobieren:

Fehler beim Kompilieren
Argumenttyp ByRef unverträglich


Dabei makiert er die Variable "i" in Zeile 5 blau.
Gruß
Gordon

AW: Schnellerer Ablauf
28.01.2008 10:50:31
Wolli
Hallo Gordon, ersetze mal
Dim i As Integer
durch
Dim i As Long
Gruß, Wolli

AW: Schnellerer Ablauf
29.01.2008 08:38:32
Gordon
Ok,
jetzt lief es. Danke für die Hilfe und den Tip zu den Variablen. Leider hat, zumindest der angegebene Quelltext, keine Geschwindigkeitsverbesserungen gebracht. Dennoch danke für den Tip...
Beste Grüße
Gordon

Anzeige
AW: Schnellerer Ablauf
29.01.2008 21:35:30
MichaV
Hi,
ach was? Naja, Du klapperst ja auch tausende Zellen einzeln ab. Versuch mal so (angetestet):


Option Explicit
Sub Eintragen()
Dim i As Long
For i = 24 To 114 Step 18
  Uebersicht "Januar", i
Next i
End Sub
Function Uebersicht(strMonat As String, lngZeile As Long)
   With Worksheets("Jahresübersicht")
      .Range("B" & lngZeile + 2) = Evaluate("SUMPRODUCT((" & strMonat & "!H4:H500=Jahresübersicht!A" & lngZeile & ")*(" & strMonat & "!F4:F500=4181)*(" & strMonat & "!G4:G500))")
      .Range("C" & lngZeile + 2) = Evaluate("SUMPRODUCT((" & strMonat & "!H4:H500=Jahresübersicht!A" & lngZeile & ")*(" & strMonat & "!F4:F500=4000)*(" & strMonat & "!G4:G500))")
      .Range("d" & lngZeile + 2) = Evaluate("SUMPRODUCT((" & strMonat & "!H4:H500=Jahresübersicht!A" & lngZeile & ")*(" & strMonat & "!F4:F500=4010)*(" & strMonat & "!G4:G500))")
      .Range("e" & lngZeile + 2) = Evaluate("SUMPRODUCT((" & strMonat & "!H4:H500=Jahresübersicht!A" & lngZeile & ")*(" & strMonat & "!F4:F500=4020)*(" & strMonat & "!G4:G500))")
      .Range("f" & lngZeile + 2) = Evaluate("SUMPRODUCT((" & strMonat & "!H4:H500=Jahresübersicht!A" & lngZeile & ")*(" & strMonat & "!F4:F500=4050)*(" & strMonat & "!G4:G500))")
      .Range("g" & lngZeile + 2) = Evaluate("SUMPRODUCT((" & strMonat & "!H4:H500=Jahresübersicht!A" & lngZeile & ")*(" & strMonat & "!F4:F500=4060)*(" & strMonat & "!G4:G500))")
      .Range("h" & lngZeile + 2) = Evaluate("SUMPRODUCT((" & strMonat & "!H4:H500=Jahresübersicht!A" & lngZeile & ")*(" & strMonat & "!F4:F500=4781)*(" & strMonat & "!G4:G500))")
      .Range("i" & lngZeile + 2) = Evaluate("SUMPRODUCT((" & strMonat & "!H4:H500=Jahresübersicht!A" & lngZeile & ")*(" & strMonat & "!F4:F500=4910)*(" & strMonat & "!G4:G500))")
      .Range("j" & lngZeile + 2) = Evaluate("SUMPRODUCT((" & strMonat & "!H4:H500=Jahresübersicht!A" & lngZeile & ")*(" & strMonat & "!F4:F500=4930)*(" & strMonat & "!G4:G500))")
      .Range("k" & lngZeile + 2) = Evaluate("SUMPRODUCT((" & strMonat & "!H4:H500=Jahresübersicht!A" & lngZeile & ")*(" & strMonat & "!F4:F500=4940)*(" & strMonat & "!G4:G500))")
   End With
End Function


Gruß- Micha
PS: Rückmeldung wäre nett
@Wolli: danke

Anzeige
AW: Schnellerer Ablauf
30.01.2008 10:44:00
Gordon
Danke,
es funktionierte zwar, aber leider lief dadurch auch nicht schneller. Hab sogar mit 'ner Stopuhr gearbeitet.
Aber mal etwas anderes:
Ich teste das immer mit dem Tabellenblatt "Januar". In deinem text benutzt du den Code:

Uebersicht "Januar", i



.Range("B" & lngZeile + 2)


Wenn ich aber es dann für's nächste Tabellenblatt (nämlich "Februar") anweden will ändert sich eine Kleinigkiet und daher müßte ich es so schreiben:


Uebersicht "Februar", i



.Range("B" & lngZeile + 3)


Gibt's da auch noch 'nen Trick, um Geschwindigkeit rauszuholen?
Gruß
Gordon

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige