Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1516to1520
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

Performance Tuning in eigener Funktion

Performance Tuning in eigener Funktion
09.10.2016 13:31:46
F
Ich habe 2 eigene Funktionen geschrieben die über die gesamte Arbeitsmappe verteilt aufgerufen werden. Die Neuberechnung dauert dann bei jeder Aktualisierung ca.4-6 Sekunden - zu lange.
Hatte als erste Maßnahme 4 Konstanten angelegt, weil diese immer fest sind.
Kann man an der Performance evtl noch schrauben?
Aufrufe der Funktionen in der gesamten Arbeitsmappe:
VS() ca.3000x
GB() ca.12000x
Beschreibung:
VS() = ruft einen vergebenen Range Namen aus einer Schlüsseltabelle auf.
Welcher RangeName ergibt sich aus
>Zelle(aktuelle Zeile, Spaltennr aus Konstante SpalteVTS)
und
>Zelle(Zeilennr aus Konstante ZeileGSB, aktuelle Spalte)
das ganze dann multipliziert mit den Wert aus
>Zelle(aktuelle Zeile, Spaltennr aus Konstante SpalteSBU)
GB() = führt eine IF Bedingung aus und übernimmt bei True einen Wert Links weiter links von der Zelle
>Bedingung:
WENN Zelle(aktuelle Zeile, Spalte aus Konstante SpalteGB) =
Zelle(Zeile aus Konstante ZeileGSB, aktuelle Spalte)
DANN
WERT aus Zelle(aktuelle Zeile, Spalte aus Konstante SpalteSBU) übernehmen
Public Const SpalteVTS As Integer = 6
Public Const ZeileGSB As Integer = 7
Public Const SpalteSBU As Integer = 5
Public Const SpalteGB As Integer = 4
Function VS()
Application.Volatile
VS = Range("VS_" & Application.ThisCell.Parent.Cells _
(Application.Caller.Row, SpalteVTS) & _
Application.ThisCell.Parent.Cells(ZeileGSB, Application.Caller.Column)).Value * _
Application.ThisCell.Parent.Cells(Application.Caller.Row, SpalteSBU)
End Function

Function GB()
Application.Volatile
If Application.ThisCell.Parent.Cells _
(Application.Caller.Row, SpalteGB) = _
Application.ThisCell.Parent.Cells(ZeileGSB, Application.Caller.Column) Then
GB = Application.ThisCell.Parent.Cells(Application.Caller.Row, SpalteSBU)
End If
End Function

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Performance Tuning in eigener Funktion
09.10.2016 15:12:18
Daniel
Hi
1. Volatile Funktionen haben die Eigenschaft, dass die bei jeder Änderung in Excel neu berechnet werden, egal wo in Excel die Änderung stattfindet.
Nicht-volatile Funktionen werden nur dann neu berechnet, wenn sich in den Zellbereichen der Eingabeparameter eine Änderung ergeben hat.
dh auf volatile Funktionen sollte man soweit wie möglich verzichten und vorallem nie in großer Anzahl einsetzen.
bei selbst geschriebenen Funktionen sollte man die Zellen, die einen Einfluß auf das Funktionsergebnis haben, daher als Eingabeparameter angeben und somit die Volatilität unnötig machen.
2. Wenn sich eine Funktion einfach durch originale Excelfunktionen darstellen läßt, sollte man das auch tun und auf das Schreiben einer eigenen Funktion verzichten. Das ist in der Regel schneller als eine eigene Funktion.
dein GB ist ja im Prinzip nichts anderes als folgende Formel (hier geschrieben für A1)
=Wenn($D1=A$7;$E1;"")

das jetzt als UDF zu schreiben, bringt nichts.
wenn, dann könnte GB als Namen definieren, da hier absolute und relative Zellbezüge vorkommen, muss man beim definieren des Namens darauf achten, dass man die Zellbezüge immer aus sicht der gereade aktiven Zelle schreibt.
auch deine Funktion VS ist nichts anderes als:
=Indirekt("VS_"&$F1&A$1)*$E1

hier lässt sich die Volatilität jetzt nicht vermeiden, da du den Zellbezug erst in der Formel "berechnest", aber auch das dürfte schneller sein als die selbstgeschriebene Funktion.
hier wäre es Sinnvoll, die Volatilität aufzuheben, dh man müsste den Namensbezug aufheben und die Werte in eine Kreuztabelle einfügen mit den entsprechenden Überschriften, so dass das Ergebnis über INDEX(Vergleich();Vergleich()) ermittelt werden kann.
Gruß Daniel
Anzeige
AW: Performance Tuning in eigener Funktion
09.10.2016 18:54:19
F
Danke für deinen Beitrag Daniel. Das war sehr hilfreich.
Ich habe nun alle Zellen mit den Funktionen mit VS() und GB() durch original Excelfunktionen ersetzt. Nun dauert die Berechnung gefühlte 0.5 Sek - also kaum der Rede Wert und somit akzeptabel.
Um dennoch die zukünftige Eingabe von einen der beiden Formeln zu verkürzen bzw. zu vereinfachen, fange Ich zudem im Workbook_SheetChange Ereigniss untenstehende Texteingaben ab und wandle diese direkt in die jeweilige Formel (mit R1C1 Bezügen) um:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If UCase(Target) = "GB" Then Target.FormulaR1C1 = "=IF(RC4=R7C,RC5,)"
If UCase(Target) = "VS" Then Target.FormulaR1C1 = "=INDIRECT(""VS_""&RC6&R7C)*RC5"
End Sub
Spricht hier irgendetwas dagegen?
Anzeige
AW: Performance Tuning in eigener Funktion
09.10.2016 20:57:12
Daniel
Hi
da spricht jetzt nichts gegen.
alternativ könntest du auch versuchen, diese Formeln Definition für einen Excel-Namen zu verwenden.
die Namen können nämlich nicht nur Zellbezüge repräsentieren, sondern auch Berechnungen durchführen.
hierbei muss man nur beachten, dass man in der Formel die absoluten und relativen Zellbezüge richtig setzt und die Formel aus sicht der aktiven Zelle schreibt.
Wird dann der Name in eine andere Zelle geschrieben, werden die Zellbezüge korrekt übernommen.
das hätte auch den Vorteil, dass du diese Funktionen auch in komplexere Formeln direkt einbinden kannst:
dh die Namensdefintion erfoglt dann so (Tabellenblatt ggf anpassen):
Zelle A1 anklicken:
Name: GB bezieht sich auf: =Wenn(Tabelle1!$D1=Tabelle1!A$7;$E1;)
dann kannst du in die Zellen einfach =GB schreiben und die Berechnung erfolgt.
Gruß Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige