(C) 2009 - 2018 by Mourad Louha · Alle Rechte vorbehalten

In Excel mit sehr großen Zahlen rechnen – Teil 6 – Code zum Add-In

Im letzten Artikel hatte ich die Features zu meinem kostenlosen Add-In zur Berechnung großer Zahlen in Excel (Downloadlink auch hier enthalten) vorgestellt. Dieser Artikel befasst sich nun mit dem Code zum Add-In und wird die wesentlichsten Funktionen beschreiben. Auf einige Funktionen werde ich logischerweise nicht mehr eingehen, denn diese wurden ja bereits in den vorangegangenen Artikeln dieser Serie erläutert.

VBA Large Numbers

Im VBA-Projekt zum Add-In sind die vier Module MLP_Api, MLP_Functions, MLP_Numbers und MLP_Run sowie die UserForm MLF_Info enthalten. Das Kennwort ist übrigens „excel-ticker“.

Das Modul MLP_Run enthält einige Funktionen, die beim Starten und Beenden des Add-Ins ausgeführt werden. Hier wird beispielsweise beim Laden des Add-Ins eine Symbolleiste erstellt, die einen Eintrag zum Aufrufen des Infodialoges zum Add-In enthält. Im Modul MLP_Api finden Sie ein paar Funktionen, die dazu dienen, die Titelleiste in der UserForm MLF_Info zu entfernen.

Funktionen im Modul MLP_Numbers zur Berechnung großer Zahlen

Die Funktionen zur Addition, Subtraktion, Multiplikationen und Potenzierung von großen Zahlen, die ich in den Teilen 1 bis 4 dieser Artikelserie vorgestellt hatte, sind in dem Modul MLP_Numbers zu finden. An einigen Stellen habe ich jedoch seitdem ein paar minimale Veränderungen vorgenommen, die aber nicht den Aufbau und Ablauf des Codes, sondern nur die Benennung einiger Variablen und Konstanten betreffen. Die Funktion zum Umwandeln einer Zahl in die Binärform heißt zudem jetzt „mlfhBinary(…)“.

Die Funktionen für die Berechnung sind alle als „Private“ deklariert; heißt, diese sind nur in dem Modul selbst aufrufbar. Um aus einem anderen Modul heraus eine Berechnung durchführen zu können, habe ich die Funktion „mlfpNumbersCalculate(…)“ angelegt, die dann wiederum als Public deklariert ist. Neben den Eingangswerten für die Zahlen kann über das Argument „Action“ angegeben werden, welche Operation ausgeführt werden soll. Der Parameter „Failure“ dient dazu, einen Excel Fehlercode zu übergeben, der im Fehlerfall wieder zurückgegeben werden soll.

In einem ersten Schritt prüft diese Funktion, ob ein Minuszeichen den Zahlen voransteht und merkt sich dieses in den Variablen „lngSign_X“ und „lngSign_Y“. Anschließend werden in einem Select-Block die angegebene Berechnungsoperation angesprungen und gegebenenfalls unterschiedliche Anweisungen ausgeführt. Beispielsweise entscheidet sich bei einer Addition je nach positiven oder negativen Zahlen, ob eine Addition oder eine Subtraktion durchgeführt wird.

Die im zweiten Teil der Artikelserie vorgestellte Funktion „mlfhSubtract(x As String, y As String)“ ging davon aus, dass der Wert von „x“ größer sein muss als der von „y“. Dieser Vergleich wird in „mlfpNumbersCalculate(…)“ durch den Aufruf der Hilfsfunktion „mlfhCompare(…)“ erledigt.

Der Code zu dieser Funktion ist eigentlich relativ einfach. Zunächst wird die Länge von X und Y berechnet; sind diese unterschiedlich, ist der Vergleich simpel. Sind die Längen gleich, werden einfach beide Parameter X und Y von links nach rechts solange durchlaufen bis sich die Ziffern von X und Y unterscheiden. Das Teilen des Ergebnisses durch sich selbst dient nur dafür entweder +1 oder -1 zu erhalten.

Bislang war noch keine Validierung der zu berechnenden Zahlen implementiert; heißt es konnte noch nicht geprüft werden, ob es sich bei den Eingangsparametern X und Y tatsächlich um Zahlen handelt. Die Funktion „mlfpNumbersValidate(…)“ übernimmt nun diese Aufgabe.

Nach einer Prüfung, ob ein Minuszeichen vorhanden ist oder nicht, wird der relevante Teil über den Like Operator dahingehend geprüft, ob alle Zeichen in der Zeichenkette Zahlen sind. Der Like Operator spart uns hier übrigens eine Schleife, wo alle Zeichen einzeln geprüft würden. Wichtig an dieser Stelle ist auch zu wissen, dass „mlfpNumbersValidate(…)“ einerseits Wahr oder Falsch als Ergebnis liefert und andererseits den übergebenen Wert von „Result“ überschreibt. In späteren Versionen des Add-Ins wird diese Funktion erweitert werden.

Das war’s dann auch schon mit den Funktionen im Modul MLP_Numbers. Das Berechnen von großen Zahlen reduziert sich also auf die Prüfung der Parameter über „mlfpNumbersValidate(…)“ und dem Aufruf von „mlfpNumbersCalculate(…)“ für die Berechnung. Übrigens, es gibt einen Grund, warum die Prüfung der Parameter nicht in „mlfpNumbersCalculate(…)“ erfolgt, sondern in einer eigenen Funktion. Dazu aber gleich mehr.

Implementierung der Formeln des Add-In im Modul MLP_Functions

Wenn man die Funktionen im Modul MLP_Numbers betrachtet, fällt auf, dass in diesen an keiner einzigen Stelle ein Objekt aus dem Objektmodell von Excel verwendet wurde. Somit ist das Modul unabhängig von Excel; aus meiner Sicht gar nicht mal so unwichtig. Denn das Modul kann dann eins zu eins in eine andere MS Office Anwendung übernommen werden, zum Beispiel MS Access.

Eine Abhängigkeit zu Excel wird erst in dem Modul MLP_Functions hergestellt, in welchem Sie die Funktionen für GZSUMME(), GZPRODUKT() und GZPOTENZ() sowie deren Entsprechungen in Englisch und Französisch finden.

Da die Formeln zur Berechnung einer Summe oder einer Multiplikation sind jeweils mit maximal acht Parametern möglich, wobei ein Parameter mindestens angegeben werden muss und die weiteren optional sind. Als Argumente können Zahlen in Form eines Wertes, einer Zeichenkette oder als Zell- bzw. Bereichsadresse übergeben werden. GZSUMME() und GZPRODUKT() rufen jeweils die Funktion „mlfhBase()“ auf. In dieser wird geprüft, ob denn ein Argument angegeben wurde und für jedes dieser Argumente die Funktion „mlfhBaseItem(…)“ aufgerufen und deren Ergebnisse im Array „vntResult(0 to 8)“ abgelegt.

Die Funktion „mlfhBaseItem(…)“ prüft zunächst den Typ des übergebenen Argumentes. Handelt es sich um einen Bereich (z.B. $C$1:$D$4), wird der Wert jeder Zelle in diesem Bereich einzeln anhand der Funktion „mlfpNumbersValidate(…)“ geprüft und im Erfolgsfall die Berechnung durchgeführt. Handelt es sich nicht um einen Bereich, wird nur die Validierung durchgeführt.

Nach der Berechnung der Zwischenergebnisse und für den Fall, dass keine Fehler aufgetreten sind, werden in einer Schleife alle Zwischenergebnisse miteinander addiert bzw. multipliziert. Da ja eine Validierung der Elemente im Array „vntResult(0 to 8)“ ja bereits erfolgt ist, brauche wir diese in der Schleife nicht zu wiederholen. Dies ist letzten Endes der Grund, die Validierung nicht beim Berechnen durchzuführen, sondern separat von dieser.

Die Funktion zur Exponentiation GZPOTENZ() ruft die eigene Funktion „mlfhExponentiation(…)“ auf, da einerseits die Parameterprüfung anders erfolgt als bei der Addition oder Multiplikation und andererseits auch sichergestellt werden muss, dass der Exponent in einen Wert vom Datentyp Long umgewandelt werden kann.

Verwendung von Kompilerkonstanten für die Sichtbarkeit von Funktionen

Das Add-In enthält die Funktionen in den drei Sprachen Deutsch, Englisch und Französisch. Im Auslieferungszustand sind diese Funktionen in allen drei Sprachen im Formelassistenten von Excel sichtbar und auch von dort aus aufrufbar.

Excel VBA ermöglicht jedoch die Verwendung von Kompilerkonstanten, die das Ausschließen von Elementen bzw. Code zur Laufzeit ermöglichen. In einem solchen Falle würde der ausgeschlossene Code nicht ausgeführt. Wird eine komplette Funktion ausgeschlossen, ist dies weder sichtbar noch existent; heißt Excel tut so, als ob es diese Funktion gar nicht gäbe.

In meiner Praxis verwende ich solche Kompilerkonstanten häufig für das Debuggen. Ist meine Anwendung getestet, brauche ich nur noch den Wert der Konstante ändern, um den Debug-Code zu eliminieren. Kompilerkonstanten können in den Projekteigenschaften oder im Code definiert werden. Excel kennt auch ein paar vordefinierte Kompilerkonstanten, darüber schreibe ich aber mal einen separaten Artikel.

Im Add-In habe ich die Kompilerkonstante LANGUAGE per Code definiert, die die Werte „ALL“, „DE“, „EN“ oder „FR“ annehmen kann. Pro Funktionsblock wird dann eine Abfrage für diese Konstante durchgeführt, die die entsprechenden Add-In Formeln für eine Sprache ein- oder ausblendet. Zu beachten ist aber, dass wenn Sie beispielsweise die deutsche Version der Formel „GZSUMME()“ nutzen und die Mappe jemanden zusenden, der zwar das Add-In installiert hat, aber nur die englischen Formeln aktiviert hat, diese Person einen Fehler in den Formeln erhält. Insofern, sollten Sie planen, dass Add-In nicht nur persönlich einzusetzen, empfehle ich, alle Formeln aktiviert zu lassen.

Die nächsten Artikel werden sich auf die Erweiterung des Add-Ins konzentrieren, wie beispielsweise das Dividieren und einige weitere Formeln.

Mourad Louha

Über den Autor · Mourad Louha

Mourad arbeitet seit 2005 als selbständiger Softwareentwickler und Trainer und lebt in Aachen, gelegen am Dreiländereck Belgien, Deutschland und Niederlande. In seiner Freizeit engagiert er sich in Online Communities rund um Office, schreibt beim Excel Ticker Artikel zu Office & Co. und betreibt weitere Community Projekte in Zusammenarbeit mit Freunden und Partnern, wie das Forum zu Microsoft Office 365 und Office 2013, den Excel Soccer oder den Excel Formel Übersetzer. Für sein außergewöhnliches Engagement wurde er seit Januar 2011 jährlich von Microsoft als Microsoft Most Valuable Professional (MVP) ausgezeichnet.

 
Comments

Hallo,
tolles Tool!! DANKE! Kann man noch mit Dividieren rechnen?

Hallo Jonathan,

Vielen Dank! Schau‘ mal in den Beitrag von Office-Lösung Forum rein; ich meine Heinz hätte noch das Dividieren hinzugefügt.

Gruß :-)

Leave a Reply