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

All posts tagged VBA

Mitte Januar 2014 erscheint mein erstes Buch zu Excel VBA & Co. erschienen. Das Buch ist auf der Grundlage des Handbuchs zur Excel 2010-Programmierung von Monika Weber entstanden und folgt einer neuen Struktur, wobei ich übernommenes Material überprüft, aktualisiert und auch über weite Strecken neu formuliert habe. Zudem sind neue Inhalte hinzugekommen und einige Inhalte des ehemaligen Buchs entfallen, da mir diese nicht mehr so wichtig erschienen. Das Buch deckt, bis auf wenige Ausnahmen, die drei Office Versionen 2007, 2010 und 2013 ab.

Nachtrag vom 31. Januar 2014: das Buch ist mittlerweile im Handel erhältlich. :-)

Das Handbuch zur Excel-Programmierung

Das Handbuch ist beispielsweise bei Microsoft Press oder Amazon bestellbar. Die Beispieldateien stehen bei Microsoft Press als Download zur Verfügung, der zudem eine E-Book-Version des Handbuchs in den drei Formaten PDF, EPUB und MOBI beinhaltet – natürlich DRM-frei.

Bevor ich hier die Inhalte des Buchs in den folgenden Abschnitten detaillierter vorstelle, möchte ich die Gelegenheit nutzen, dem Team von Microsoft Press und insbesondere René Majer für die sehr angenehme Zusammenarbeit zu danken.

Read more

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

Read more

Dieser Artikel stellt die erste Version meines kostenlosen Add-Ins (Version 0.75 Build 151110) zum Rechnen mit großen Zahlen in Excel vor. Momentan sind benutzerdefinierte Funktionen zur Addition, Subtraktion, Multiplikation und Exponentiation implementiert. Beachten Sie bitte die Copyright- und Nutzungshinweise am Ende dieses Artikels. Der Code ist durch das Kennwort „excel-ticker“ geschützt. Das Add-In kann am Ende des Artikels heruntergeladen werden.

Der Code zum Add-In ist ebenfalls durch das für mich ausgestellte Zertifikat der Firma TC TrustCenter GmbH digital signiert. Dies bedeutet, dass nur das signierte Add-In der von mir entwickelten Originalversion (und auch spätere Updates) entspricht.

Zurzeit kann das Add-In nur mit Ganzzahlen rechnen, eine Erweiterung des Add-Ins für Kommazahlen ist jedoch bereits in Arbeit. Ausserdem ist geplant, in einer der nächsten Versionen des Add-Ins auch eine Funktion zur Division zur Verfügung zu stellen. Diese wird sich insbesondere auf die von Donald Knuth entwickelten Algorithmen und deren Ableitungen stützen. Ein weitere Funktion zur Berechnung von Ausdrücken der Form „X ^ Y Modulo N“ ist ebenfalls vorgesehen. Die Implementierung dieser Funktionen ist jedoch etwas komplexer; somit hatte ich mir überlegt, zunächst nur die bestehenden Funktionen in das Add-In zu verpacken.

Folgender wichtiger Hinweis ist zudem bei der Verwendung des Add-Ins zu beachten: Eine Zelle in Excel kann pro Zelle maximal 32.767 Zeichen enthalten. Sollte ein Formelergebnis aus dem Add-In diese Länge überschreiten, wird in der Zelle der Fehlerwert #WERT angezeigt. Solche Fälle können relativ schnell bei hohen Potenzen auftreten, zum Beispiel enthält 4 ^ 123456, das 74.328 Zeichen. Leider kann das Add-In diese Beschränkung nicht umgehen.

Namenkonventionen der Funktionen im Add-In

Das Add-In enthält nachfolgend beschriebene Funktionen, die beispielweise über den hier abgebildeten Funktionsassistenten in der Kategorie „Benutzerdefiniert“ aufgerufen werden können. Die Funktionen des Add-Ins stehen in den drei Sprachen Deutsch, Englisch und Französisch zur Verfügung.

VBA Large Numbers

Read more

Heute nun der vierte Teil meiner Serie zum Thema „In Excel mit großen Zahlen rechnen“, der eine Funktion zur effektiven Berechnung von Potenzen in Excel VBA vorstellen wird. Wenn wir von dem Ursprungsproblem (die Berechnung von 80 hoch 200 in Excel, siehe den ersten Teil der Artikelserie) ausgehen, benötigen wir spätestens und unabhängig von der Darstellung des Ergebnisses ab 80 hoch 160 eine Funktion, die mit großen Zahlen umgehen kann.

Die Berechnung von 80 hoch 200 entspricht insgesamt von 200 – 1 = 199 Multiplikation der Zahl 80 mal sich selbst. Eine Funktion zur Multiplikation großer Zahlen steht uns ja bereits zur Verfügung; diese hatte ich im dritten Teil der Artikelserie vorgestellt. Problematisch ist jedoch die hohe Anzahl an benötigten Multiplikationen, die zu einer hohen Rechenzeit führen. Insofern gilt es zu schauen, ob die Anzahl der Multiplikation reduziert werden kann und, wenn ja, wie dies in VBA implementiert werden kann.

Binäre Exponentiation

Wenn man im Internet nach Lösungen zu diesem Problem sucht, findet man sehr schnell das Verfahren der „Binären Exponentiation“, das bereits 200 v. Chr. In Indien entdeckt wurde und quasi als das Standardverfahren zur Reduktion der Anzahl der Multiplikationen gilt.

VBA Large Numbers

Read more

Nachdem wir nun eigene Berechnungsroutinen für die beiden Grundrechenarten „Addieren“ und „Subtrahieren“ für sehr große Zahlen implementiert haben (siehe hierzu meine beiden vorherigen Beiträge „In Excel mit sehr großen Zahlen rechnen – Teil 1 – Addition“ und „In Excel mit sehr großen Zahlen rechnen – Teil 2 – Subtraktion“), können wir nun eine VBA Funktion zur Multiplikation großer Zahlen erstellen.

Der hierfür verwendete Algorithmus stützt sich auf den „Karatsuba Algorithmus“. Ich hatte zwar schon dazu einen Artikel in meinem Blog auf meiner Softwareseite geschrieben, diesen Artikel hier im Excel Ticker Blog aber noch nicht übertragen. Deshalb an dieser Stelle nochmals ein paar Worte zur Funktionsweise vom Karatsuba Algorithmus.

Funktionsweise vom Karatsuba Algorithmus

Die Grundidee vom Algorithmus ist es, einerseits Multiplikationen durch Additionen und Verschiebeoperationen zu ersetzen und andererseits durch Aufteilung der zu multiplizierenden Zahlen Rechenschritte einzusparen. Das Prinzip nennt sich ‚Teil und Herrsche Prinzip‘, in Englisch ‚Divide and Conquer‘. Das Verfahren kann prima rekursiv angewandt werden, denn auch die Teilzahlen lassen sich wiederum aufteilen.

Der Karatsuba Algorithmus ist zwar nicht das schnellste Verfahren zur Multiplikation sehr großer ganzzahliger Zahlen, aber dafür recht einfach zu implementieren. Ein schnellerer Algorithmus ist übrigens der Schönhage-Strassen-Algorithmus, der auf einer schnellen Variante der diskreten Fourier-Transformation basiert. Wenn ich Zeit habe, werde ich mal eine VBA Implementierung von diesem Algorithmus ausprobieren.

VBA Large Numbers

Read more

Im ersten Artikel dieser Reihe hatte ich eine VBA Funktion vorgestellt, um große Zahlen in Excel addieren zu können. Prinzip hierbei ist, die in Strings abgelegten Zahlen blockweise zu addieren und anschließend die Blöcke wieder zusammenzufügen.

Dieser Artikel stellt nun eine VBA Funktion vor, um eine Subtraktion großer Zahlen durchzuführen; auch hier werden wir die Zahlen in Blöcke aufteilen, jedoch aber zusätzlich einen kleinen Trick anwenden.

Subtraktion von großen Zahlen in Excel

Im folgenden Bild sind die zwei Ausgangszahlen X und Y zu sehen. Die hier vorgestellte Funktion wird allerdings nur dann korrekt ablaufen, wenn beide Zahlen positiv sind und zudem X größer Y ist. Für spätere Berechnungen ist dies ausreichend, denn eine Subtraktion der Form „X – Y mit X < Y“ lässt sich durch eine Vorzeichenumkehr in das gewünschte Format umwandeln: „-(Y - X) mit Y > X“.

VBA Large Numbers

Read more

Vor einiger Zeit gab es im Forum „Office-Lösung“ eine sehr interessante Diskussion, wie in Excel der Wert von 80 ^ 200 ausgerechnet werden könnte. Mit Excel Bordmitteln ist dies leider so ohne weiteres nicht möglich, denn Excel schneidet Berechnungsergebnisse ab der 15. Stelle ab bzw. rundet diese auf oder ab. Auch eine Implementierung per VBA unter Verwendung der Standarddatentypen „Long“, „Single“ oder „Double“ ist nur bedingt möglich, denn der Wertebereich von Variablen dieser Typen ist begrenzt.

Heinz Schweigert, User des Forums, hatte damals im Thread vorgeschlagen, ob denn nicht meine experimentelle VBA-Anwendung „Karatsuba Algorithmus in VBA“ zur Berechnung von 80 ^ 200 verwendet werden könnte. Diese Anwendung bildet große Zahlen als „String“ ab und umgeht somit die Beschränkungen der anderen Datentypen. Nachteil ist jedoch, dass dann die Grundrechenarten zum Addieren und Subtrahieren selbst implementiert werden müssen.

Mein Code in dieser Anwendung war jedoch speziell zur Multiplikation von Zahlen mit sich selbst entwickelt worden, weshalb der Code noch entsprechend angepasst werden musste. Heinz hatte dies freundlicherweise zum Teil übernommen und eine angepasste Version dem Forum zur Verfügung gestellt, welche sehr schnell 80 ^ 200 ausrechnen konnte.

Dieser Artikel läutet eine Artikelserie ein, in welchen ich pro Artikel eine VBA Funktion für die Grundrechenarten mit großen Zahlen vorstellen werde. Anschließend wird ein Add-In erstellt werden, das die Funktionen komfortabel als Formel zur Verfügung stellt und dann auch zum Download bereit stehen wird. Schließlich plane ich das Add-In um weitere komplexere Rechenarten zu erweitern; wobei dies nur im Rahmen der mir zu Verfügung stehenden Zeit geschehen kann.

So nebenbei, Ziel des Add-Ins ist es nicht, gigantische Zahlen auszurechnen oder irgendwelche Rekorde zu brechen; dafür gibt es spezialisierte Programme. Das Ziel des Add-Ins ist es eher, über hinreichend schnelle Routinen im Alltag den Umgang mit großen Zahlen erleichtern.

Addition von großen Zahlen in Excel

Den Anfang macht heute eine Funktion zum Addieren von großen Zahlen. An dieser Stelle nochmal ein Danke schön an Heinz Schweigert für seine Ideen zur Verbesserung des Originalcodes.

VBA Large Numbers

Read more

In meinem Artikel „Excel VBA Application Objekte per Windows API erzeugen (Teil 1)“ hatte ich eine Möglichkeit vorgestellt, wie über Windows API Funktionen alle geöffneten Excel Instanzen ermittelt werden können und gegebenenfalls daraus VBA Application Objekte erzeugt werden können. Das funktionierte jedoch nur mit den Excel Instanzen, in denen eine Arbeitsmappe geöffnet war. Dieser Artikel stellt nun eine Lösung vor, wie in Excel Instanzen ohne geöffnete Mappe per Windows API eine neue Mappe angelegt wird und anschließend das VBA Application Objekt erzeugt wird.

VBA Window Handles

Die Idee war insofern, ein neues Dokument in der Excel Instanz anzulegen und anschließend den Scan-Vorgang für alle Fensterhandles in dieser Instanz zu wiederholen. Um ein neues Dokument in Excel anzulegen, kann die Tastenkombination „Strg + N“ verwendet werden. Am einfachsten wäre es sicherlich einfach den Tastendruck und gedrückt halten für „Strg“ und anschließend die Taste „N“ zu simulieren.

Read more