Re: eigene Funktion
10.01.2003 06:34:04
Hans W. Herber
Hallo Chris, Hajo,dieser Thread gibt mir Gelegenheit zu ein paar grundsätzlichen Anmerkungen zu VBA-Funktionen.
Hans Werner Hoffmann schrieb mal hier im Forum, dass Funktionen, die den Application.Volatile-Aufruf zur Neuberechnung benötigen, grundsätzlich zu misstrauen ist. Dem schließe ich mich an.
Funktionen, denen keine Parameter mitgegeben werden, bringen in der Regel Probleme. Die vorliegende Aufgabe - möchte man sie über eine benutzerdefinierte Funktion lösen - kommt an einem Application.Volatile nicht herum.
Application.Volatile löst eine Neuberechnung aus, wenn in irgendeinem Blatt irgendeiner Arbeitsmappe irgendein Wert eingegeben wird. Hat man jetzt eine ganze Reihe von diesen Formeln - im aktuellen Fall ist das zu vermuten - wird die benutzerdefinierte Funktion für jede Formel einmal durchlaufen. Irgendwann wirkt sich das zumindest störend aus.
Nebenbei: Auf keinen Fall benutzerdefinierte Funktionen mit Application.Volatile in die Personl.xls einfügen, sie werden bei jeder Zellberechnung aufgerufen.
Application.Volatile führt aber auch noch zu anderen Problemen, die auf einen Bug in Excel 97 und früher zurückzuführen sind. Dort erscheint beim Öffnen der Arbeitsmappe mit einer solchen benutzerdefinierten Funktion eine Fehlermeldung oder das Gleiche bei einem Blattwechsel.
Dann noch eine Application.Volatile-Falle, in die Hajo bei seiner Umsetzung getappt ist:
Ohne Application.Volatile erfolgt die Neuberechnung einer paramterlosen benutzerdefinierten Funktion beim Editieren der Zelle mit der Formel. Hier sind also Application.Caller (aufrufende Zelle) und ActiveCell identisch. Mit Application.Volatile wird die Funktion aber bei jeder Zelleingabe in irgendeinem Arbeitsblatt irgendeiner Arbeitsmappe aufgerufen und hier ist die Identität nicht mehr gegeben. Im aktuellen Fall wird also bei Zelleingaben ein falscher Zeilenwert übergeben.
Ach ja: Die beste Möglichkeit, Application.Volatiles zu umgehen ist der Rückgriff auf die altmodischen Excel-Funktionen, hier also:
=INDIREKT("auswerter!"&ADRESSE(4;INDIREKT("auswerter!"&ADRESSE(ZEILE()-2;16))-1))
Entschuldigt meine Langatmigkeit ;-)
hans