Zwischenwerte

Nackte Zahlenreihen kleide ich einerseits wegen “Ein Bild sagt mehr als 1000 Worte” in Diagramme, andererseits hat sich deswegen schon so manches unplausible “Eck” insbesondere in Punkt (XY)-Diagrammen als Fehler entpuppt. Damit solche “Ecken” nicht von zu wenig Punkten herrühren, sorge ich für ausreichend viele Zwischenwerte, nicht zuletzt auch wegen der teilweise fragwürdigen Windungen zufolge der Option “Linie glätten”.
Diese Zwischenwerte will ich allerdings nicht auf dem Tabellenblatt haben, da dadurch nur die Übersichtlichkeit in Mitleidenschaft gezogen wird und es das Diagramm nicht erzwingt. Ich verwende dazu schon länger Namen und verzichte auf sonstige Tricks.

Bisher habe ich mich dazu 2er Methoden bedient:

  • Wie in Vektoren beschrieben, nutzte ich am häufigsten Namen mit Werten zwischen einem Start- und einem Endwert. Nachteilig war, dass etwaige weitere vorgegebene Werte im errechneten Vektor keine Entsprechung mehr fanden, im Diagramm also nicht auftauchten. Darüber hinaus liefert diese Methode natürlich nur monoton steigende oder fallende Zahlenreihen.
  • Obigen Nachteil behob ich in Kubischer Spline und dessen Weiterentwicklung Parametrische Spline-Interpolation durch eine benutzerdefinierte Funktion, die den aufrufenden Namen entsprechend befüllte.
    Die Nutzung von VBA ist nie meine erste Wahl, weil es aus Sicherheitsgründen und wegen geringerer Transparenz bei vielen Anwendern Argwohn hervorruft oder gar auf Ablehnung stößt!

Nunmehr habe ich eine Methode gefunden, die die Vorteile beider Ansätze vereint, ohne deren Nachteile zu haben:

  • Der fürs Diagramm benötigte Vektor liegt als Name “x_1” vor
  • Er enthält die ursprünglichen Werte mit dazwischen gleichmäßig angeordneten Zwischenwerten
  • Er ergibt sich als Matrizenmultiplikation aus dem Vektor der Ursprungswerte “x_0” mit einer Matrix, benötigt also kein VBA
  • Diese Matrix liegt ebenfalls als Name “Matrix” vor. Die Formel lautet:
    “=((ZEILE(M)>=(n_ZW+1)*SPALTE(M)-2*n_ZW)*(ZEILE(M)<=(n_ZW+1)*SPALTE(M)))*ABS(2*(n_ZW+1)*(ZEILE(M)>((n_ZW+1)*(SPALTE(M)-1)+1))-(ZEILE(M)-(n_ZW+1)*(SPALTE(M)-1)+n_ZW))/(n_ZW+1)”
    Geht’s (noch) einfacher? 😉
  • Wegen der Begrenzung auf 255 Zeichen, der Übersichtlichkeit und vor allem der darin mehrfach benutzten Funktionen ZEILE und SPALTE wird eine weitere Matrix mit kurzem Namen “M” herangezogen
  • Diese Matrix bezieht sich mittels nicht volatiler Funktion INDEX (Bezugsversion) auf ein “very hidden” Tabellenblatt “X”, um “bezugsgefährdenden” Änderungen zu entgehen

Restriktion für Excel 97-2003:

  • Der finale Vektor darf nicht mehr als 5.461 Elemente umfassen. Bei gegebener Ausgangsanzahl “n_0” ergibt sich also die höchstzulässige Anzahl der Zwischenwerte “n_ZW” als “=GANZZAHL((5461-n_0)/(n_0-1))”.

Die folgende Datei zeigt die Umsetzung obig beschriebener Erzeugung von Zwischenwerten: