@ > Home > Inhalt > Formel-Zwischenschritte bilden und abrufen (SETV,GETV) Excel 4+, SpreadCE

Problem: Eine Formel enthält Ausdrücke, die sich wiederholen und dabei lang sind oder viel Rechenzeit benötigen (oder beides). Deren Zwischenergebnis lässt sich ohne Hilfszelle nicht vorab ermitteln, sondern muss innerhalb der Formel jedes Mal wieder neu berechnet werden. Ähnlich: 0053.htm.

Beispiel: =WENN(ISTFEHLER(SVERWEIS("X";A1:B9999;2;));"nix";SVERWEIS("X";A1:B9999;2;))

Lösung: Die Zelle eines Makroblatts (Excel4-Makrosprache) speichert den Zwischenschritt als Argument einer benutzerdefinierten Funktion =SETV(Ausdruck[;Index]). Deren Schwester =GETV([Index]) liest ihn beliebig oft aus, solange SETV ihn nicht erneut überschreibt.

Syntax: =WENN(ISTFEHLER(SETV(SVERWEIS("X";A1:B9999;2;)));"nix";GETV())

Ersparnis: Es sei angenommen, dass "X" zu 90% tatsächlich in der langen Liste vorkommt. Das Ergebnis wird im Rahmen des ISTFEHLER-Teils ermittelt und dann einfach mit GETV abgerufen, statt noch einmal ermittelt zu werden. Dies bedeutet eine Rechenersparnis von 90/190 = 47%, abzüglich eines gewissen Verwaltungsaufwands durch die Makrofunktion.

Es folgt die benutzerdefinierte Makrofunktion SETV() als Version 1 und Version 2.

Version 1 ist kurz und schnell. Für mehrere Variablen innerhalb einer Formel braucht es dann aber entsprechend vervielfachte Funktionen, z.B. SET1(Ausdruck)/GET1() usw.

       A                       B                     
  1 Inhalt                                           
  2                                                  
  3 SETV   =ARGUMENT(;95;B1)                         
  4        =RÜCKSPRUNG(B1)                           
  5                                                  
  6 GETV   =RÜCKSPRUNG(B1)                           
  7                                                  
oder verkürzt auch als:
       A                       B                     
  1 Inhalt                                           
  2                                                  
  3 SETV   =ARGUMENT(;95;B1)                         
  4 GETV   =RÜCKSPRUNG(B1)                           
  5                                                  
Version 1 (im Makroblatt)

Version 2 bildet das Gegenteil von Version 1 durch langsamere, aber praktisch unbeschränkte Variablenverwendung durch Ansteuerung mittels Index: SETV(Ausdruck;Index)/GETV(Index).

       A                       B                     
  1 Inhalt                                           
  2 Index                                            
  3                                                  
  4 SETV   =ARGUMENT(;95;B1)                         
  5        =ARGUMENT(;1;B2)                          
  6        =WERT.FESTLEGEN(B2;WENN(ISTZAHL(B2);B2;1))
  7        =WERT.FESTLEGEN(INDIREKT("C"&B2);B1)      
  8        =RÜCKSPRUNG(INDIREKT("C"&B2))             
  9                                                  
 10 GETV   =ARGUMENT(;1;B2)                          
 11        =WERT.FESTLEGEN(B2;WENN(ISTZAHL(B2);B2;1))
 12        =RÜCKSPRUNG(INDIREKT("C"&B2))             
 13                                                  
Version 2 (im Makroblatt)
Hinweis: In Spalte A stehen Bezeichner für Spalte B. B4 ist hier also als SETV benannt. Die Funktion ist außerhalb von laufenden Indizes wie =ZEILE(1:10) auch in Matrixformeln {} verwendbar. Sie ist im Rahmen der Grenzen des Tabellenkalkulationsprogramms verschachtelbar. Excel: Gegenüber VBA kann die Verwendung von Makros schneller sein, da nicht so viele Übergaben stattfinden.

Vorteil: Kürzere Formeln, keine Hilfszellen nötig, schnellere Tabelle. Dies gilt aber nur, wenn GETV umfangreich eingesetzt werden kann.

Empfehlung: Da es sich bei der Verwendung der Funktion je nach Kalkulationsmodell um ein Rechenzeit-Nadelöhr handeln kann, sollte man Version 1 in nachfolgender Abwandlung verwenden, auch wenn eine Mehrfachdeklaration ein- und derselben Funktion äußerst plump erscheint. Man bedenke aber: Durch 4-fachen Einsatz von Version 1 wird gerade erst die Codelänge von Version 2 erreicht - und 4 Speicherplätze reichen eigentlich immer.

       A                       B                     
  1                                                  
  2                                                  
  3                                                  
  4                                                  
  5 SET1   =ARGUMENT(;95;B1)                         
  6 GET1   =RÜCKSPRUNG(B1)                           
  7 SET2   =ARGUMENT(;95;B2)                         
  8 GET2   =RÜCKSPRUNG(B2)                           
  9 SET3   =ARGUMENT(;95;B3)                         
 10 GET3   =RÜCKSPRUNG(B3)                           
 11 SET4   =ARGUMENT(;95;B4)                         
 12 GET4   =RÜCKSPRUNG(B4)                           
 13                                                  
Empfohlene Anwendung der Version 1 (im Makroblatt)

Quellen: Laurent Longré hat für SETV/GETV das Excel- Add-In MOREFUNC.XLL geschrieben (kostenlos). Die hier davon inhaltlich abgeleitete Lösung erlaubt die sofortige Verwendung ohne (Excel) Add-In (praktisch, um die Anwendung unkompliziert weiterzugeben) und - im Falle früherer Betriebssystem-Versionen - auch ohne Makrowarnung.