AW: Benutzerdef. Fkt zu langsam
22.04.2008 19:21:00
Reinhard
Hallo Danuel,
jaja, immer diese bösen Editoren :-)
Kann es sein daß du das End-pre vergessen hast?
Gruß
Reinhard
Hi
prinziiell würde ich versuchen, solche Auswertungen mit Pivot-Tabelle zu machen, das geht sehr einfach ohne Programmierung und ist auch recht flexibel.
sollte sich die Pivot-Tabelle nicht anwenden lassen, so könnte man dein Marko noch in folgenden Punkten optimieren:
1. in einem "Wort zum Sonntag" wurde mal erklärt, daß Variablen, die als Zeilen- und Spalten-Nr in Range-Objekten verwendet werden, immer in LONGINTEGER umgerechnet werden.
daher sollten Variablen, die so verwendet werden, immer als LONG deklariert werden, da sie sonst zeitaufwendig umgewandelt werden müssen. Werden sie gleich als LONG deklariert, entfällt die Umwandlung.
Ok, der Zeitgewinn dürfte hier recht gering sein, aber so rein prinzipiell....
2. du führst pro Zeile jeweils 5 x 3 Stringvergleiche durch, davon sind aber immer 2 x 5 Vergleiche für jede Zeile gleich.
diese könntest du vorab abprüfen und das Ergebnis in einer Boolschen Variable ablegen.
Im Schleifendruchlauf müsstest du dann nur noch diese Boolsche Variable prüfen, was deutlich schneller ist, als 2 Stringergleiche.
der Code dazu könnte so aussehen:
Option Explicit
Const alle As String = "(Alle)"
Public Function mySummewenn(ByVal SummeSpalte As String, Bereich As Range, _
Optional ParameterName_1 As String, Optional ParameterWert_1 As String, _
Optional ParameterName_2 As String, Optional ParameterWert_2 As String, _
Optional ParameterName_3 As String, Optional ParameterWert_3 As String, _
Optional ParameterName_4 As String, Optional ParameterWert_4 As String, _
Optional ParameterName_5 As String, Optional ParameterWert_5 As String)
Dim anzahlSpalten As Long
Dim anzahlZeilen As Long
Dim intHelp As Long
Dim parameterSpaltenindex_1 As Long
Dim parameterSpaltenindex_2 As Long
Dim parameterSpaltenindex_3 As Long
Dim parameterSpaltenindex_4 As Long
Dim parameterSpaltenindex_5 As Long
Dim Prüfung_1 As Boolean
Dim Prüfung_2 As Boolean
Dim Prüfung_3 As Boolean
Dim Prüfung_4 As Boolean
Dim Prüfung_5 As Boolean
Dim mySumme As Single
Dim summeSpaltenindex As Long
Dim IndexLetzteNichtleereZeile As Long
anzahlSpalten = Bereich.Columns.Count
anzahlZeilen = Bereich.Rows.Count
mySumme = 0
On Error Resume Next
For intHelp = 1 To anzahlSpalten
If Bereich(1, intHelp) = ParameterName_1 Then parameterSpaltenindex_1 = intHelp
If Bereich(1, intHelp) = ParameterName_2 Then parameterSpaltenindex_2 = intHelp
If Bereich(1, intHelp) = ParameterName_3 Then parameterSpaltenindex_3 = intHelp
If Bereich(1, intHelp) = ParameterName_4 Then parameterSpaltenindex_4 = intHelp
If Bereich(1, intHelp) = ParameterName_5 Then parameterSpaltenindex_5 = intHelp
If Bereich(1, intHelp) = SummeSpalte Then summeSpaltenindex = intHelp
Next
Prüfung_1 = (ParameterName_1 = "" Or ParameterWert_1 = alle)
Prüfung_2 = (ParameterName_2 = "" Or ParameterWert_2 = alle)
Prüfung_3 = (ParameterName_3 = "" Or ParameterWert_3 = alle)
Prüfung_4 = (ParameterName_4 = "" Or ParameterWert_4 = alle)
Prüfung_5 = (ParameterName_5 = "" Or ParameterWert_5 = alle)
For intHelp = 2 To anzahlZeilen
If Bereich(intHelp, parameterSpaltenindex_1) = ParameterWert_1 OrPrüfung_1 Then
If Bereich(intHelp, parameterSpaltenindex_2) = ParameterWert_2 OrPrüfung_2 Then
If Bereich(intHelp, parameterSpaltenindex_3) = ParameterWert_3 Or Prüfung_3 _
Then
If Bereich(intHelp, parameterSpaltenindex_4) = ParameterWert_4 Or Prüfung_4 _
_
_
_
Then
If Bereich(intHelp, parameterSpaltenindex_5) = ParameterWert_5 Or Prü _
fung_5 Then
mySumme = mySumme + CSng(Bereich(intHelp, summeSpaltenindex))
End If
End If
End If
End If
End If
Next
mySummewenn = mySumme
End Function
Gruß Daniel
ps für die vielen Leerzeilen kann ich leider nichts, die werden vom Edior automatisch eingefügt