Bereich invers durchlaufen

In VBA verwendet man zum Durchlaufen von Aufzählungen (z. B. Workbooks, Worksheets,…) gewöhnlich die For Each…Next-Anweisung.
Will man dies in umgekehrter Reihenfolge tun, dann geht das mittels For *.Count To 1 Step -1…Next, wenn für die jeweilige Aufzählung die Eigenschaft Count vorliegt und auf die einzelnen Elemente per Index zugegriffen werden kann.
Ein Zellbereich bietet das mit Cells.Count zwar auch an, aber die Items beziehen sich nicht direkt auf den gesamten Bereich, sondern zuerst auf Areas, die sich schließlich auf den Bereich selbst beziehen. Da ein Bereich aus mehreren Areas bestehen kann, müssen also diese und die darin enthaltenen Items abgearbeitet werden.

Die Lösung sind 2 verschachtelte, invers laufende “For…Next”-Schleifen, die Areas und Cells abarbeiten und einer Collection übergeben. Anstatt der Aufzählung könnte auch ein temporärer Name mit den Bezügen gefüttert werden, was aber einen Eingriff im Tabellenblatt oder in der Arbeitsmappe bedeuten würde.

Die Benutzerdefinierte Funktion RANGEINVERSION(Bereich) erwartet einen Bereich, der sich aus einer Selektion, einem Namen oder aus VBA-Code heraus ergeben kann.
Das Tabellenblatt RANGEINVERSION der folgenden Arbeitsmappe bietet dazu einen Test mittels des Namens Testrange an:

UND für Matrixformeln

Der Funktion UND(Wahrheitswert1;[Wahrheitswert2];…) können bis zu 255 (30 in Excel 97 – 2003) Bedingungen übergeben werden, die entweder als WAHR oder als FALSCH bewertet werden können. Diese Argumente dürfen auch als Arrays (Matrizen) vorliegen, was einen verleiten könnte, UND auch in einer Matrixformel zu verwenden, was aber daran scheitert, dass immer nur ein Wert zurückgegeben wird!

Abhilfe

Anstatt UND(Wahrheitsarray1;Wahrheitsarray2;…) nehme man bei Matrixformeln das Produkt Wahrheitsarray1*Wahrheitsarray2*…

Alternative

Die Benutzerdefinierte Funktion AND4AF(Wahrheitswert1;[Wahrheitswert2];…) (Abkürzung für “AND for Array Formulas”) funktioniert wie das normale UND (allerdings werden beliebig viele Argumente entgegengenommen), wenn sie von einer “gewöhnlichen” Formel aufgerufen wird, in allen anderen Fällen (Aufruf durch Matrixformel, VBA,…) werden die Wahrheitswerte wie folgt abgearbeitet:

  • 2-dimensionale Matrix führt zum Fehler #WERT!
  • 1-dimensionale Matrizen können gemischt als Spalten- und Zeilenvektoren vorliegen
  • Der größte Vektor bestimmt den Ergebnisumfang
  • Fehlende Werte eines kleineren Vektors werden ignoriert
  • Ein Einzelwert wird zu einem Vektor mit einer Komponente
  • Dabei werden wie beim normalen UND Text und fast alle Zahlen ignoriert, denn 0 entspricht FALSCH

Die folgende Datei zeigt die Verwendung der Benutzerdefinierten Funktion AND4AF im Vergleich zum normalen UND anschaulich für die verschiedensten Fälle:

Signifikante Stellen

Soll in Excel eine Zahl abweichend vom “Standard” in bestimmter Art und Weise anzeigt werden, dann kann man mit Zahlenformaten, insbesondere der Kategorie “Benutzerdefiniert”, einiges erreichen.
Selbst Signifikante Stellen lassen sich mit der Kategorie “Wissenschaft” realisieren. Wenn mit diesem Wert noch weitergerechnet werden soll, dann dürfte man die gewöhnungsbedürftige Darstellung in Kauf nehmen, da eine Rundung erst möglichst spät innerhalb des Rechnungsgangs durchgeführt werden sollte.
Bei einem Endergebnis, das ohnehin auf mehrere unsichere Werte aufbaut, kann allerdings eine gerundet Darstellung anderer Art erwünscht sein!

So wie ich wurden offensichtlich viele auf Excelformeln fündig. Übrigens eine äußerst empfehlenswerte Seite! Ich habe alle 3 Bücher erstanden und kann sie jedem Wissbegierigen nur ans Herz legen!
Der leider schon verstorbene Klaus Kühnlein hat die Aufgabe eindrucksvoll mittels Formel umgesetzt, das prinzipielle Ziel erfüllend, ohne VBA auszukommen.

Das erste, was mich bei Formeln stört, ist das mehrfache Vorkommen ein und desselben Terms, besonders wenn wegen dessen Länge ein Zwischenergebnis quasi erzwungen wird. Dies deswegen, weil ansonsten mehrere identische Berechnungen erfolgen.
Für mich stehen Aufwand zu Nutzen im Vordergrund und nicht das hehre Ziel, VBA zu vermeiden, selbst wenn auch ich gerne ohne auskomme. Deswegen habe ich auf Basis der vorgefundenen Formel eine Benutzerdefinierte Funktion programmiert, die natürlich auch mit Matrixformeln zurecht kommt.
Die folgende Datei zeigt die Umsetzung via Formel und Matrixformel mit und ohne VBA:

TEILERGEBNIS für RGP

Zur Berechnung des Wertverlusts von PKWs unterschiedlicher Erstzulassung wollte ich die Steigung eines linearen Trends mittels der Funktion RGP(Y_Werte;[X_Werte];[Konstante];[Stats]) verwenden. Als ich allerdings einen Filter setzte, musste ich feststellen, dass manuell ausgeblendete Zellen eingeschlossen bleiben. Also bemühte ich die Funktion TEILERGEBNIS(Funktion;Bezug1;[Bezug2];…), um zu erkennen, dass unter den angebotenen 11 Funktionen kein RGP zu finden ist. Dass Excel dies generell kann, sieht man aber daran, dass ein Diagramm auf ausgeblendete Zellen reagiert und eine etwaige lineare Trendlinie somit “gezwungen” ist, ihre Parameter demgemäß anzupassen!

Was liegt also näher, als eine Benutzerdefinierte Funktion SUBTOTAL_RGP(Y_Werte;[X_Werte];[Konstante];[Stats]) zu programmieren, die nichts anderes tun muss, als die sichtbaren Zellen herauszufiltern, um sie der ursprünglichen Arbeitsblattfunktion RGP (VBA: Worksheetfunction.LinEst) als Arrays zu übergeben.
Die Funktion akzeptiert Bezüge und Matrizen in Zeilen und Spalten, mit der momentanen Einschränkung gegenüber RGP, dass der Bereich der X_Werte nur eine Variablengruppe umfassen darf.

Die folgende Datei zeigt die Funktionalität mittels zweier Gruppierungen und Zufallszahlen, wobei die Formel in den Diagrammen als Kontrolle dienen mag:

Moment um allgemeine Achse

Momente sind an und für sich nichts Besonderes, solange Sonderfälle zu Vereinfachungen führen. Das Moment um eine allgemeine Achse aber brachte mich zum Grübeln, da ich natürlich eine für mich zukunftsträchtige Lösung in Excel haben wollte: Kraft oder/und Moment wirken an einem Angriffspunkt und erzeugen ein Moment um eine Achse.
Da mich Google im Stich ließ, überlegte ich einen Lösungsweg:

  • Für eine Kraft braucht es deren wirksame Komponente und ihren Hebelarm. Ersteres ist die Projektion der Kraft in eine Normalebene der Achse. Letzteres ist der Normalabstand dieser Projektion zur Achse.
  • Für ein Moment genügt dessen wirksame Komponente.

Nach längerer Herleitung, zeigte sich ein unsympathisches Konvolut, was zugegebenermaßen zum Teil “meiner Mathematik” geschuldet sein hätte können. Die Unwägbarkeiten eines kommutativen Skalarprodukts ließen mich dann aber einen anderen Weg einschlagen, nämlich ganz althergebracht den allgemeinen Fall zum Sonderfall zu machen!

  1. Verschiebung des Achsenpunktes in den Nullpunkt
  2. Drehung um die x-Achse, damit die Achse in der z-x-Ebene zu liegen kommt
  3. Drehung um die y-Achse, damit die Achse schließlich kollinear zur z-Achse ist

Und schon haben wir den quasi ebenen Sonderfall! Die sich durch die Transformationen ergebenden Kraftkomponenten \( F_x^{\prime\prime} \) und \( F_y^{\prime\prime} \) samt zugehöriger Wirkabstände \( y^{\prime\prime\prime} \) und \( x^{\prime\prime\prime} \) und die Momentkomponente \( M_z^{\prime\prime} \) ergeben das gesuchte Moment \( M \) .
Die folgende Datei zeigt dies einerseits aufwändig aber nachvollziehbar Schritt für Schritt, vereinfacht mit Drehmatrizen in Zellen, kompakt mit Hilfe von Namen und für mich optimal als Benutzerdefinierte Funktion:

Bemerkung: Nicht als 97-2003-Version, weil in den Diagrammen der kombinierte Typ “Doppelt” der Linie des Moments und generell der Endpfeiltyp “Pfeil” – ohne Warnung beim Speichern im Kompatibilitätsmodus – verworfen wurden.