Home > Artikel > Ausgabe 6/2015 > Mathematische VBA-Funktionen

Mathematische VBA-Funktionen

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Abseits der Grundrechenarten kommen mathematische Berechnungen sowohl immer wieder in VBA-Routinen zum Einsatz, wie auch in Abfragen auf Tabellenfelder. Einen Überblick über das, was VBA uns zu diesem Thema anzubieten hat, zeigen wir im Folgenden – und ebenso, wie sich der Funktionsumfang durch die Excel-Bibliothek erweitern lässt.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1506_Mathe.accdb

Die Bibliothek Math von VBA

Öffnen Sie den Objektkatalog des VBA-Editors und wählen links oben aus der Combobox den Eintrag VBA aus. Markieren Sie dann die Zeile Math in der Klassenauflistung links. Rechts werden Ihnen nun die Funktionen der Klasse angezeigt – siehe Bild 1.

Die VBA-Klasse Math im Objektkatalog

Bild 1: Die VBA-Klasse Math im Objektkatalog

Ziemlich überschaubar, was uns da geboten wird. Gerade mit zwölf Methoden werden wir beglückt. Wenn es um naturwissenschaftliche oder finanzielle Berechnungen geht, dann bleibt Ihnen nicht erspart, die komplexeren Funktionen selbst in Modulen nachzurüsten und zu programmieren.

Aber durchlaufen wir einmal das Vorhandene. Zunächst für die einfacheren Methoden...

Abs gibt den Absolutwert einer Zahl zurück. Das bedeutet nichts anderes, als dass eine negative Zahl in eine positive verwandelt wird. +13 und -13 haben beide den gleichen Absolutwert 13.

Sgn ist ähnlich, gibt aber lediglich das Vorzeichen der Zahl zurück. Allerdings nicht als String, sondern als Zahl. Jede Zahl größer als 0 ergibt eine 1, jede kleiner als 0 eine -1. Nur bei 0 ist auch der Rückgabewert eine 0. Round rundet eine Fließkommazahl auf eine wählbare Anzahl von Nachkommastellen:

  Round (2.4674)

> 2,47

Lassen Sie Vorsicht walten, wenn es um das Runden von Zahlen geht, besonders wenn es um Währungsberechungen handelt! Denn dort ist Runden nicht gleich Runden. Mathematisches Runden und kaufmännisches Runden etwa unterscheiden sich. Unterziehen Sie einmal die Zahl 2,465 einem VBA-Round. Als Ergebnis erhalten Sie 2,46! Die 5 am Ende wird also nicht aufgerundet. Für korrektes Runden benötigen Sie daher eine eigene Funktion, die etwa so aussähe:

Function Round2( _

    No As Variant, _

    Dgts As Long) _

    As Variant

    Dim N As Double

    Dim F As Double

    F = 10 ^ Dgts

    N = 0.5 + No * F

    Round2 = CLng(N) / F

End Function

Hier wird F die Zehnerpotenz der Nachkommastellen zugewiesen. Für 2 stünde in der Variablen dann die 100. Das wird mit der übergebenen Zahl No multipliziert und 0.5 addiert.

Schließlich wird per CLng der Nachkommateil abgeschnitten und das Ergebnis wieder durch den Faktor F dividiert. Sie können das im Modul mdlMathe der Beispieldatenbank nachvollziehen, indem Sie die Routine TestRound aufrufen.

Rnd im Verein mit Randomize sind keine mathematischen Funktionen im eigentlichen Sinne. Rnd erzeugt eine Zufallszahl (Single) im Bereich von 0 bis 1. Um andere Wertebereiche für die Zufallszahlen zu generieren, multiplizieren Sie einfach den Rückgabewert mit einem Faktor und/oder addieren Werte dazu. Beispiel für eine Funktion, die Zufallszahlen im Bereich 10 bis 100 generiert:

Function Rnd100() As Single

     Randomize

     Rnd100 = 10 + 90 * Rnd()

End Function

Das Randomize können Sie auch weglassen. Es initialisiert lediglich den internen Generator von VBA neu, der unter anderem auf der Systemzeit beruht und darauf eine Sequenz ablaufen lässt. Die Gefahr von Wiederholungen ist aber nahezu ausgeschlossen. Mit Sqr ermitteln Sie die Quadratwurzel einer Zahl. Die Funktion ist weitgehend überflüssig, da das Ergebnis auch über Potenzierung zu erhalten ist:

  Sqr(10)

10 ^ 0.5

Log berechnet den natürlichen Logarithmus der übergebenen Zahl. Natürlich bedeutet, dass die Basis e herangezogen wird. Wenn Sie aber den Zehnerlogarithmus benötigen, so ermitteln Sie diesen über einen Einzeiler:

Function Log10 (Value As Double) _

                As Double

     Log10 = Log(Value ) / Log(10)

End Function

Die Umkehrfunktion ist Exp. Sie potenziert die Basis e mit der übergebenen Zahl. Das lässt sich allerdings auch einfach anders berechnen. Folgende Zeilen kommen zum gleichen Resultat:

  Exp(3)

  Exp(1) ^ 3

2,71828182845905 ^ 3

Das war es dann auch schon mit den naturwissenschaftlichen Funktionen. Trigonometrische gibt es auch nur vier:

Sin berechnet den Sinus, Cos den Cosinus des übergebenen Double-Arguments, welches nicht etwa als Winkel, sondern in der Einheit Bogenmaß vorliegen muss.

Eine Funktion, die den Winkel-Sinus berechnet sähe etwa so aus:

Function SinWinkel(Value As Double) _

                    As Double

     Dim pi As Double

     pi = 4 * Atn(1)

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!