Die Informationen in diesem Produkt werden ohne Rücksicht auf einen eventuellen Patentschutz veröffentlicht.

Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt

Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen.

Trotzdem können Fehler nicht vollständig ausgeschlossen werden.

Verlag, Herausgeber und Autor können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen.

Für Verbesserungsvorschläge ist der Autor dankbar.

Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien

Für alle Hardware und Softwarebezeichnungen, die in diesem Buch erwähnt werden, sind gleichzeitig auch eingetragene Warenbezeichnungen oder sollten als solche betrachtet werden.

Bibliografische Information der Deutschen Nationalbibliothek:

Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

detaillierte bibliografische Daten sind im Internet über www.dnb.de abrufbar.

Zweite Auflage

© 2021 René Martin

Illustration: René Martin

Satz: René Martin

Herstellung und Verlag: BoD - Books on Demand GmbH, Norderstedt

ISBN: 978-3-7412-5428-4

1 Inhaltsverzeichnis

2 Vorwort

VBA existiert nun seit mehr als 25 Jahren. Dies mag in der Vormachtstellung von Microsoft bei Anwendungsprogrammen wie Word, Excel oder PowerPoint begründet liegen, dies kann aber auch in der relativ einfach erlernbaren Programmiersprache begründet sein. Access war das erste Produkt aus der Microsoft-Office-Palette, das schon in der Version 2.0 VBA mitlieferte. In dieser Datenbank war dies ein notwendiger Schritt, denn für die Erstellung einer Datenbank wird fast immer Programmierung benötigt. Excel zog in der Version 5.0 nach, in Word wurde WordBasic durch VBA in Office 97 ersetzt. In der gleichen Version hielt VBA auch Einzug in PowerPoint und Outlook.

Heute, im Frühjahr des Jahres 2021, ist die Zahl der Anwendungen, die VBA integriert haben, immens: Zur Microsoft-Palette gesellen sich Visio und Project, daneben sind noch weitere Programme wie Flowcharter, Corel Draw, AutoCAD und andere zu nennen. Die Verbreitung und die Beliebtheit von VBA wächst, und mit ihr die Notwendigkeit, VBA zu lernen. Während noch vor Jahren ein guter Freund von mir, ein hervorragender Java- und C++-Programmierer, VBA-Programmierer als „Warmduscher“ verspottete, so musste er später zugeben, dass man nicht mit solch mächtigen Programmiersprachen wie Java, C++ oder VB.NET auf „Spatzen“ schießen sollte, wenn es darum geht, innerhalb einer Applikation Lösungen zu entwickeln. Und genau das will VBA.

Auch wenn diese Programmiersprache Merkmale anderer objektorientierter Sprachen vermissen lässt (Multithreading, Vererbung und Polymorphismus), so liegt mit VBA 7.1 dennoch ein mächtiges, vielschichtiges und komplexes Werkzeug vor, mit dem man gute Lösungen für die Microsoft-Office-Produkte erstellen kann.

Auch wenn Microsoft weitere Programmiersprachen in seinen Anwendungen integriert hat: SQL, M in PowerQuery, DAX in Power Pivot, TypeScript, NodeJS und Office JS in Office online – VBA wird uns auch noch in den nächsten Jahren begleiten und zur Verfügung stehen. Letzteres hat Microsoft an mehreren Stellen versprochen.

2.1 Aufbau des Buches

V-B-A untergliedert sich in drei Bereiche. Zum einen ist der Sprachkern selbst zu nennen: B (Basic). Ihm sind die ersten elf Kapitel gewidmet, dort werden die typischen Anforderungen, die beim Erlernen einer Programmiersprache nötig sind, wiederholt und eingeübt. Dazu zählen die schon „klassischen“ Themen Variablendeklaration, Schleifen, Verzweigungen, Fehlerbehandlung. Schließlich sollen die VBA-spezifischen Themen eingebaute und selbstdefinierte Funktionen, Dateizugriff und Klassen besprochen werden.

Der zweite Teil – V – (Kapitel 12) widmet sich den Dialogen („Userforms“). Für den bequemen Umgang mit den Makros wird dem Benutzer eine Eingabemaske zur Verfügung gestellt, in die er Daten eintragen, aus vordefinierten Listen etwas auswählen oder über Optionsbuttons und Kontrollkästchen eine Auswahl treffen kann. Auch wenn Sie keine Dialoge benötigen, so halte ich dieses zwölfte Kapitel für wichtig, da man anhand von Dialogen exemplarisch den Umgang mit Objekten erläutern und studieren kann. Ich zeige den Umgang mit Objekten, Methoden, Eigenschaften und Konstanten, wie man auf Elemente einer Sammlung zugreifen kann, wann ein „=“, ein Leerzeichen, wann „:=“ und die Klammer nötig sind.

Der dritte Teil des Buchs (Kapitel 13 – 18) ist schließlich dem „A“ in VBA gewidmet: Es geht um die Applikationen. Lange habe ich überlegt, welche der Anwendungsprogramme ich dabei behandle. Schließlich habe ich mich gegen Access entschieden. Der Grund ist einfach. Zum Ersten stellt Access zwei Zugriffsmöglichkeiten auf Tabellen und Abfragen zur Verfügung: DAO und ADO. Man müsste sie beide beschreiben. Zum Zweiten werden die Formulare in Access programmiertechnisch anders gesteuert als in Word, Excel und Visio. Zum Dritten unterscheidet sich die Programmierumgebung von den anderen Applikationen, ebenso wie einige VBA-Befehle in Access anders lauten. Aus diesen Gründen habe ich mich gegen Access entschieden. Dafür habe ich den „Spitzenreitern“ von VBA – Word und Excel – den größten Platz eingeräumt. Und schließlich enthält dieses Buch jeweils ein kleines Kapitel über Visio, PowerPoint und eines über Outlook.

2.2 Aufbau des Buches

Dennoch: Vollständigkeit kann ich nicht erlangen: Bei XML (Kapitel 8.19) habe ich nur das Zugriffsmodell DOM beschrieben, nicht SAX. Über Excel ließe sich sicherlich noch sehr viel mehr schreiben, als in diesen zirka 100 Seiten. Das gilt auch für die anderen Anwendungsprogramme. Dafür habe ich mich entschieden ein Kapitel über das Menüband, und wie man es erzeugen kann, einzufügen. Da jedes der Anwendungsprogramme Tausende von Objekten, Methoden, Eigenschaften, Ereignisse und Konstanten zur Verfügung stellt, ist schon klar, dass dieses Buch keine Referenz darstellt. Dafür sei auf weitere Literatur zu den einzelnen Programmen verwiesen. Dennoch: Ich glaube, dass Sie mit diesem Wissen einen sehr guten Überblick über und Einblick in und Überblick über die Programmsprache VBA erhalten.

Nun bleibt mir nur noch, Ihnen viel Spaß beim Lesen des Buchs zu wünschen.

René Martin

im Januar 2021

Über Anregungen, Bemerkungen und Kritik freue ich mich:

rene.martin@compurem.de

Dort befinden sich auch die Buchbeispiele, die Sie über Autorentätigkeit / Downloads (Bücher) herunterladen können.

3 Grundlagen

Um überhaupt mit den einfachsten Übungen beginnen zu können, müssen Sie grundlegende Kenntnisse von VBA besitzen. Lassen Sie uns mit dem allgemeinen Aufbau von Prozeduren beginnen. In einem Modul wird eine Prozedur (ein Makro) erstellt.

3.1 Die Syntax einer Prozedur

[Private | Public] [Static] Sub Name [(ArgListe)]

[Anweisungen]

[Exit Sub]

[Anweisungen]

End Sub

Dabei bedeuten:

Teil Beschreibung
Public Auf die Sub-Prozedur kann von allen anderen Prozeduren in allen Modulen zugegriffen werden. Bei Verwendung in einem Modul kann auf die Prozedur nur innerhalb des Projekts zugegriffen werden.
Private Auf die Sub-Prozedur kann nur durch andere Prozeduren aus dem Modul zugegriffen werden, in dem sie deklariert wurde.
Static Die lokalen Variablen der Sub-Prozedur bleiben zwischen Aufrufen erhalten. Das Attribut „Static“ wirkt sich nicht auf Variablen aus, die außerhalb der Sub-Prozedur deklariert wurden, auch wenn sie in der Prozedur verwendet werden.
Name Erforderlich. Name der Sub-Prozedur gemäß den Standardkonventionen für Namen von Variablen: Maximal 255 Zeichen, kein Schlüsselwort und eindeutig. Der Name darf nicht mit einer Ziffer beginnen und keine Satz- oder Sonderzeichen enthalten.
ArgListe Variablenliste mit den Argumenten, die an die Sub-Prozedur beim Aufruf übergeben werden. Mehrere Variablen werden durch Kommas getrennt.
Anweisungen Die Anweisungen im Rumpf der Sub-Prozedur, die ausgeführt werden.

Tabelle 1: Die Elemente eines Prozedurnamens

3.2 Kommentare

Kommentare werden mit einem Apostroph „'“ eingeleitet, das am Anfang einer Zeile oder am Ende einer Codezeile stehen kann. Kommentare können ebenso durch ein rem (remark) eingeleitet werden, welches sich nur am Anfang der Zeile befinden darf. Für das Apostroph steht Ihnen in der Symbolleiste „Bearbeiten“ ein Symbol zum Ein- und Ausschalten zur Verfügung. Kommentare erscheinen in grüner Schrift, was Sie im Menü Extras / Optionen im Blatt Editorformen unter der „Codefarbe“ Kommentartext ändern könnten.

3.3 Programmzeilen

Ein automatischer Umbruch, wie von der Textverarbeitung bekannt, findet erst nach 1.024 Zeichen statt: Um einen manuellen Umbruch zu organisieren, kann der Text in mehrere Zeilen geteilt werden. Dies erfolgt durch eine obligatorische Leerstelle, der ein Unterstrich am Ende der Zeile folgt.

Sie dürfen maximal zehn Zeilen Code durch „_“ voneinander trennen. Und der Unterstrich darf nicht innerhalb von Textteilen stehen.

Sollen mehrere Befehle in einer Zeile geschrieben werden, dann können diese durch einen Doppelpunkt voneinander getrennt werden.

3.4 Variablen und Datentypen

Variablen werden deklariert mit:

Dim Variablenname As Variablentyp

Sie sollten (müssen es nicht) Variablen am Anfang einer Prozedur deklarieren – dies erhöht die Lesbarkeit. Die folgende Tabelle liefert eine Zusammenfassung der verschiedenen Variablentypen:

Datentyp Variablentyp Typenkennzeichen Bereich Typkürzel Beispiel Speicherplatz (in Bytes)
Boolean 0 (False) und -1 (True) f, bol oder bln True, False 2
Ganzzahlen Byte 0 bis 255 byt 7, 104 1
Integer % -32.768 bis 32.767 int 7, 104, 1234 2
Long & -2.147.483.648 bis 2.147.483.647 lng 123456789 4
Dezimalzahlen Single ! -3,402823 x 1038 bis 3,402823 x 1038 sng 0,15 4
Double # -1,797693 x 10324 bis 1,797693 x 10324 dbl 12345678 * 10100 8
Currency @ –9,22 x 1014 bis 9,22 x 1014 cur 59,90 Euro 8
Datumzahlen Date 1.1.100 bis 31.12.9999 dat 11.11.2017 8
Text String $ Circa 2 Milliarden str „Der Weiße Riese“, „Konrad und Paul“ 10 + Länge der Zeichenkette
Variant jeder numerische Wert im Bereich Double, jeder String 22 + Länge der Zeichenkette
Objekte Object alle Objektreferenzen 4

Benutzerdefinierter Datentyp (siehe Seite →)

Tabelle 2: Die verschiedenen Variablentypen

Variablen sollten ein Präfix besitzen, an dem ihr Typ erkennbar ist. Diese Konvention, die von der Firma „Gregory Reddick & Associates“, einer Unternehmensberatungsfirma von Microsoft, herausgegeben wurde, ist nicht verbindlich. Allerdings arbeiten sehr viele Programmierer damit. Diese Konvention stellt eine Möglichkeit der Standardisierung für VBA-Programmierung dar.

Beispiel

Dim intAnzahlDerOrte Integer

Dim strNachname as String

Aus den vorgegebenen Datentypen können Sie auch eigene Datentypen zusammensetzen.

[Private | Public] Type VarName

Elementname [([Indizes])] As Typ

[Elementname [([Indizes])] As Typ]

...

End Type

Beispielsweise:

Public Type Fahrrad

Farbe As String

Anschaffungspreis As Currency

Marke As String

Gewicht As Double

End Type

Sub Verwendung()

Dim MeinFahrrad As Fahrrad

MeinFahrrad.Anschaffungspreis = 1200

MeinFahrrad.Marke = "xy"

MeinFahrrad.Gewicht = 7.5

MeinFahrrad.Farbe = "rot"

MsgBox MeinFahrrad.Anschaffungspreis

End Sub

3.5 Konstanten

[Public | Private] Const KonstName [As Typ] = Ausdruck

Die Syntax der Const-Anweisung besteht aus folgenden Teilen:

Teil Beschreibung
Public Schlüsselwort, das auf Modulebene Konstanten deklariert, die allen Prozeduren in allen Modulen zur Verfügung stehen.
Private Schlüsselwort, das auf Modulebene Konstanten deklariert, die nur innerhalb des Moduls verfügbar sind, in dem sie deklariert wurden.
KonstName Erforderlich. Name der Konstanten.
Typ Zulässige Typen sind Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String oder Variant.
Ausdruck Erforderlich. Ein Literalwert, eine andere Konstante oder eine beliebige Kombination, die beliebige arithmetische oder logische Operatoren (mit Ausnahme von Is) enthält.

Tabelle 3: Die Syntax der Const-Anweisung

Beispielsweise:

Const FEHLERTOLERANZ As Double = 0.01

Const FIRMENNAME As String = "contoso GmbH & co KG"

3.6 Datenfelder, Arrays

Datenfelder werden genauso wie andere Variablen mit Hilfe der Dim-, Static-, Private- oder Public-Anweisungen deklariert. Der Unterschied zwischen „skalaren Variablen“ (Variablen, die keine Datenfelder sind) und „Datenfeldvariablen“ besteht darin, dass Sie generell die Größe des Datenfelds angeben müssen. Ein Datenfeld, dessen Größe angegeben ist, ist ein Datenfeld fester Größe. Ein Datenfeld, dessen Größe bei Ausführung eines Programms geändert werden kann, ist ein dynamisches Datenfeld.

Ob ein Datenfeld mit 0 oder 1 beginnend indiziert ist, hängt von der Grundeinstellung der Option Base-Anweisung ab. Wenn Option Base 1 nicht angegeben ist, beginnen alle Datenfelder mit dem Index 0.

3.7 Deklarieren eines festen Datenfelds

In der folgenden Code-Zeile wird ein Datenfeld fester Größe als Integer-Datenfeld mit 11 Zeilen und 11 Spalten deklariert:

Dim intMeinDatenfeld(10, 10) As Integer

Das erste Argument stellt die Zeilen, das zweite Argument die Spalten dar.

Wie bei jeder anderen Variablendeklaration entspricht der Datentyp der Elemente in einem deklarierten Datenfeld dem Typ Variant, solange Sie keinen Datentyp für das Datenfeld angegeben haben. Jedes Variant-Element des Datenfelds verwendet 16 Bytes. Deklarieren Sie Ihre Datenfelder explizit mit einem Datentyp, der nicht Variant ist, um den Code so kompakt wie möglich zu machen!

Die folgenden Code-Zeilen vergleichen die Größe verschiedener Datenfelder:

' Nachstehendes Datenfeld aus Elementen des Datentyps

' Integer beansprucht 22 Bytes (11 Elemente * 2 Bytes).

ReDim intMeinIntegerDatenfeld(10) As Integer

' Nachstehendes Datenfeld aus Elementen des Datentyps

' Double beansprucht 88 Bytes (11 Elemente * 8 Bytes).

ReDim dblMeinDoubleDatenfeld(10) As Double

' Nachstehendes Datenfeld aus Elementen des Datentyps Variant

' beansprucht mindestens 176 Bytes (11 Elemente * 16 Bytes).

ReDim MeinVariantDatenfeld(10)

' Nachstehendes Datenfeld aus Elementen des Datentyps

' Integer beansprucht 100 * 100 * 2 Bytes (20.000 Bytes).

ReDim intMeinIntegerDatenfeld (99, 99) As Integer

' Nachstehendes Datenfeld aus Elementen des Datentyps

' Double beansprucht 100 * 100 * 8 Bytes (80.000 Bytes).

ReDim dblMeinDoubleDatenfeld (99, 99) As Double

' Nachstehendes Datenfeld aus Elementen des Datentyps Variant

' beansprucht mindestens 160.000 Bytes

' (100 * 100 * 16 Bytes).

ReDim MeinVariantDatenfeld(99, 99)

Die maximale Größe eines Datenfelds hängt von Ihrem Betriebssystem sowie von dem verfügbaren Speicher ab. Durch die Verwendung eines Datenfeldes, das den für Ihr System verfügbaren RAM-Speicher überschreitet, wird Ihre Anwendung langsamer, da die Daten von der Festplatte gelesen und auf diese geschrieben werden müssen.

Meistens werden Sie jedoch Datenfelder der folgenden Form deklarieren

Dim dblMesswert(104) As Double

Dim strAntwortAufAlleFragen(1 To 42) As String

3.8 Deklarieren eines dynamischen Datenfeldes

Bei der Deklaration eines dynamischen Datenfelds können Sie die Größe des Datenfelds verändern, während der Code ausgeführt wird. Verwenden Sie zur Deklaration eines Datenfelds eine der Static-, Dim-, Private- oder Public-Anweisungen, und lassen Sie die Klammern leer. Beispiel:

Dim sngDatenfeld() As Single

Anmerkung: Sie können die ReDim-Anweisung dazu verwenden, ein Datenfeld implizit innerhalb einer Prozedur zu deklarieren. Achten Sie darauf, bei Verwendung der ReDim-Anweisung den Namen des Datenfelds richtig zu schreiben. Auch wenn sich die Option Explicit-Anweisung im Modul befindet, wird ein zweites Datenfeld erstellt.

Verwenden Sie in einer Prozedur innerhalb des Gültigkeitsbereichs des Datenfeldes die ReDim-Anweisung zur Änderung der Anzahl von Dimensionen, zur Definition der Anzahl der Elemente und zur Definition der oberen und unteren Grenzen jeder Dimension. Sie können die ReDim-Anweisung beliebig oft verwenden, um das dynamische Datenfeld zu ändern. Dies hat jedoch zur Folge, dass die bestehenden Werte des Datenfeldes verloren gehen. Verwenden Sie ReDim Preserve, um ein Datenfeld zu erweitern, ohne dass die vorhandenen Werte im Datenfeld gelöscht werden. Die folgende Anweisung vergrößert zum Beispiel das Datenfeld varDatenfeld um 10 Elemente, ohne die aktuellen Werte der ursprünglichen Elemente zu löschen.

ReDim Preserve varDatenfeld (UBound(varDatenfeld) + 10)

Wenn Sie das Schlüsselwort Preserve mit einem dynamischen Datenfeld verwenden, können Sie nur die obere Grenze der letzten Dimension, aber nicht die Anzahl der Dimensionen ändern.

3.9 Ein- und Ausgabe

Zwei einfache Möglichkeiten zur Ein- und Ausgabe stehen Ihnen über das Meldungsfenster und das Eingabefenster zur Verfügung:

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

InputBox(prompt[, title] [, default] [, xpos] [, ypos] _

[, helpfile, context])

Wird bei der MsgBox eine Klammer verwendet, dann wird ein Wert vom Typ Integer zurückgegeben. Die InputBox gibt immer einen String-Wert zurück.

3.10 Übungen zu den Grundlagen

In den folgenden Programmen befinden sich Fehler. Finden Sie diese heraus und überlegen Sie sich, wie man sie korrigieren könnte:

Übung 1

Sub Mein erstes Makro()

MsgBox "Hallo"

End Sub

Übung 2

Sub Gruß()

MsgBox(Prompt:="Guten Morgen")

End Sub

Übung 3

Sub Ende1()

MsgBox "Diese Anweisung wird aufgrund eines ungültigen _

Vorgangs geschlossen.", vbCritical

End Sub

Übung 4

Sub Ende2()

MsgBox _

"Wenden Sie sich an den Hersteller, " & _

"falls das Problem weiterhin besteht.", _

vbCritical rem Keine schöne Meldung

End Sub

Übung 5

Sub Wertezuweisen()

Dim strJahreszeit(4) As String

Dim i As Integer

strJahreszeit(1) = "Frühling": strJahreszeit(2) = "Sommer"

strJahreszeit(3) = "Herbst": strJahreszeit(4) = "Winter"

End Sub

Übung 6

Sub Wertezuweisen2()

Dim strHimmelsrichtung() As String

ReDim strHimmelsrichtung(0)

strHimmelsrichtung(0) = "Nord"

ReDim strHimmelsrichtung(1)

strHimmelsrichtung(1) = "Ost"

ReDim strHimmelsrichtung(2)

strHimmelsrichtung(2) = "Süd"

ReDim strHimmelsrichtung(3)

strHimmelsrichtung(3) = "West"

End Sub

3.11 Tipps zu den Übungen zu den Grundlagen

Achten Sie genau auf die Schreibweise, auf Leerzeichen, auf korrekte Umbrüche und auf korrekt deklarierte Variablen!

3.12 Lösungen zu den Übungen zu den Grundlagen

Lösung 1

Der Name der Prozedur Mein erstes Makro darf kein Leerzeichen enthalten. Ein korrekter Name für ein Makro wäre beispielsweise:

Mein_erstes_Makro

oder:

MeinErstesMakro

Lösung 2

Wird das Meldungsfenster mit einer Klammer verwendet, dann muss ein Wert übergeben werden. Also beispielsweise so:

x = MsgBox(Prompt:="Guten Morgen")

Da das Meldungsfenster aber keine Auswahlabfrage wie YesNo oder AbortRetryIgnore enthält, genügt zur alleinigen Anzeige folgender Befehl:

MsgBox Prompt:="Guten Morgen"

Oder auch mit Leerzeichen:

MsgBox "Guten Morgen"

Übrigens: Erstaunlichweise funktioniert:

MsgBox("Guten Morgen")

Jedoch nicht:

MsgBox("Guten Morgen", vbInformation)

Das ist leider nicht konsequent!

Lösung 3

Der Umbruch zwischen Befehlen darf nur zwischen Parametern oder Befehlsteilen stehen, nicht aber innerhalb von Text. Wenn Sie Text umbrechen möchten, dann bitte so:

MsgBox "Diese Anweisung wird aufgrund eines ungültigen " & _

"Vorgangs geschlossen.", vbCritical

Lösung 4

Kommentare, die mit rem eingeleitet werden, dürfen nicht hinter Befehlen stehen. Entweder verwenden Sie das Anführungszeichen oder schreiben Sie die Remark-Zeile als eigenständige Zeile.

Lösung 5

Arrays beginnen, wenn nichts anderes festgelegt wird, bei 0. Das heißt, LBound(strJahreszeiten) oder LBound(0) liefert einen leeren String. Dies kann umgangen werden, indem ebenfalls bei strJahreszeiten(1) begonnen wird oder indem die Zählung explizit mit 1 beginnt. Entweder durch den allgemeinen Befehl:

Option Base 1

oder indem die Variable folgendermaßen deklariert wird:

Dim strJahreszeiten(1 To 4) As String

Lösung 6

Wenn Sie das Datenfeld vergrößern:

ReDim strHimmelsrichtung(3)

und anschließend füllen:

strHimmelsrichtung(3) = "West"

werden die übrigen Einträge gelöscht, das heißt: strHimmelsrichtung(0), strHimmelsrichtung(1) und strHimmelsrichtung(2) sind leer. Sie sollten jeweils mit

ReDim Preserve strHimmelsrichtung(3)

das Datenfeld vergrößern.

4 Operatoren, Verknüpfungen und Verzweigungen

4.1 Operatoren

Folgende Operatoren stehen Ihnen in VBA zur Verfügung:

Typ Beschreibung Zeichen / Operator
Arithmetische Operatoren Addition +
Subtraktion -
Multiplikation *
Division /
Ganzzahlige Division \
Potenz ^
Modulo Mod
Textverkettung Concatenation &, +
Logische Operatoren und AND
oder OR
nicht NOT
exklusives oder (entweder das eine oder das andere) XOR
logische Äquivalenz EQV
Implikation IMP
Vergleichsoperatoren gleich =
kleiner als <
kleiner oder gleich <=
größer als >
größer oder gleich >=
ungleich <>
Vergleichsoperatoren für Text entspricht LIKE
Vergleichsoperatoren für Objekte entspricht IS

Tabelle 4: Die Operatoren in VBA

Die Verknüpfungsmöglichkeiten können in einer Tabelle aufgelistet werden:

Wert 1 Wert 2 And Or Xor Imp Eqv
Wahr Wahr Wahr Wahr Falsch Wahr Wahr
Wahr Falsch Falsch Wahr Wahr Falsch Falsch
Falsch Wahr Falsch Wahr Wahr Wahr Falsch
Falsch Falsch Falsch Falsch Falsch Wahr Wahr
Wahr Leer Falsch Wahr Wahr Falsch Falsch
Falsch Leer Falsch Falsch Falsch Wahr Wahr
Leer Wahr Falsch Wahr Wahr Wahr Falsch
Leer Falsch Falsch Falsch Falsch Wahr Wahr

Tabelle 5: Die Konjunktoren in VBA

Ergebnisse werden dabei immer von der rechten Seite des Gleichheitszeichens auf die linke übergeben, also: Variable = 17 * 4 +23

Das Gleichheitszeichen hat in VBA zwei Bedeutungen: Es übergibt einen Wert an eine Variable:

dblMWST = 0.19

oder es vergleicht den Inhalt einer Variablen mit einem Wert:

If strOrt = "Entenhausen" Then

Während mit dem Vergleichsoperator „=“ nur exakte Gleichheit überprüft werden kann, kann mit Like mit Platzhaltern gearbeitet werden. Beispiele:

"Struwwelpeter" = "Struwwelpeter"

ergibt „True“.

"Struwwelpeter" = "Struwelpeter"

ergibt dagegen „False“. „True“ liefern folgende drei Vergleiche:

"Struwwelpeter" Like "Struwwel*"

"Struwwelpeter" Like "*peter"

"Struwwelpeter" Like "S?ruwwelpe?er"

"Struwwelpeter" Like "*Struwwelpeter*"

„False“ ist das Ergebnis von folgenden Vergleichen:

"STRUWWELPETER" Like "Struwwelpeter"

"STRUWWELPETER" = "struwwelpeter"

Wird dagegen vor den Prozeduren im allgemeinen Deklarationsteil der folgende Befehl eingefügt:

Option Compare Text

dann wird nicht zwischen Groß- und Kleinschreibung unterschieden. Das bedeutet, dass im obigen Beispiel „True“ das Ergebnis ist. Explizit unterschieden wird zwischen Groß- und Kleinbuchstaben, wenn sich vor der ersten Prozedur folgender Befehl befindet:

Option Compare Binary

4.2 Verzweigungen I

Die sicherlich bekannteste (und vielleicht am häufigsten gebrauchte) Wenn-Verzeigung kann einzeilig:

If Bedingung Then [Anweisungen] [Else elseAnweisungen]

oder im Block auf mehrere Zeilen geschrieben werden:

If Bedingung Then

[Anweisungen]

[ElseIf Bedingung-n Then

[elseifAnweisungen] ...

[Else]

[elseAnweisungen]

End If

4.3 Verzweigungen II

Für sehr viele Fälle eignet sich die übersichtliche Select Case-Schleife:

Select Case Testausdruck

[Case Ausdrucksliste-n

[Anweisungen-n]] ...

[Case Else]

[elseAnw]]

End Select

Dabei ist zu beachten, dass Vergleichsoperatoren nur mit einem IS-Statement verwendet werden können, beispielsweise:

Select Case Variable

Case Is > 1

Verschiedene Argumente können durch Kommata getrennt hintereinander geschrieben werden:

Case 2, 3, 4

Bereiche können mit To zusammengefasst werden:

Case 2 To 4

4.4 Verzweigungen III

Eine andere Verzweigung hat die folgende Syntax:

IIf(expr, truepart, falsepart)

Während die If-Verzweigung, wie in Kapitel 4.2 beschrieben, mehrere Anweisungen verarbeiten kann, liefert IIf als Funktion einen Wert. Beispielsweise so:

strMonat = IIf(intMonat = 1 And strLand = "Österreich", _

"Jänner", "Januar")

Beachten Sie, dass IIf eine Funktion ist, das heißt: es wird ein Wert zurückgegeben. Man kann sie nicht für Anweisungen, also beispielsweise für Meldungsfenster verwenden.

4.5 Verzweigungen IV

Während IIf sich nur zwischen einer von zwei Auswahlmöglichkeiten entscheiden kann, so kann die Funktion Choose aus einer Reihe von Argumenten auswählen. Die Syntax lautet:

Choose(Index, Auswahl-1[, Auswahl-2, ... [, Auswahl-n]])

Im folgenden Beispiel wählt die Funktion Auswahl zwischen vier Werten aus, die ihr übergeben wurden:

Function Auswahl(i As Integer) As String

Auswahl = Choose(i, "München", "Hamburg", "Berlin", "Köln")

End Function

Beachten Sie, dass Choose, ebenso wie IIf, eine Funktion ist, das heißt: es wird ein Wert zurückgegeben. Man kann sie nicht für Anweisungen, also beispielsweise für Meldungsfenster verwenden.

4.6 Informationsabfragen

In der folgenden Liste finden Sie sämtliche Informationen über Variablen, die abgefragt werden können:

Funktion Bedeutung Beispiel
IsDate überprüft, ob es sich um ein Datum handelt. IsDate(28.2.2021) liefert „True“.
IsDate(29.2.2021) liefert „False“.
IsNumeric überprüft, ob es sich um eine Zahl handelt. IsNumeric(3) liefert „True“.
IsNumeric("drei") liefert „False“.
IsNull überprüft, ob eine Variable leer ist. IsNull() liefert „True“.
IsNull("drei") liefert „False“.
IsEmpty überprüft, ob eine Variable initialisiert wurde.
IsArray überprüft, ob es sich bei einer Variablen um ein Datenfeld handelt.
IsMissing überprüft, ob Argumente übergeben wurden.
IsObject überprüft, ob es sich um ein Objekt handelt.
IsError überprüft, ob es sich um ein Fehlerobjekt handelt.

Tabelle 6: Die Liste der Informationsabfragen

4.7 Übungen zu Operatoren, Verknüpfungen und Verzweigungen

Übung 1

Im rechtwinkligen Dreieck gilt für die drei Seiten:

a2 + b2 = c2

Der Benutzer gibt die Werte von a und b ein und erhält die Länge der Hypotenusen c.

Übung 2

Lassen Sie sich in einem Meldungsfenster folgenden Text anzeigen:

Das "Gute" – dieser Satz steht fest –

Ist stets das Böse, das man lässt.

W. Busch, Die Fromme Helene

Übung 3

Schreiben Sie eine Prozedur, in der die Benutzerin oder der Benutzer nach ihrem / seinem Geschlecht („w“, „m“ oder „d“) gefragt wird. Wird der korrekte Buchstabe eingetippt, dann wird sie / er nach ihrem / seinem Namen gefragt und dieses wird ausgegeben. Beim Vertippen wird sie / er darauf hingewiesen.

Übung 4

Gesucht ist die Lösung der Gleichung

0 = x2 + a*x + b

Der Benutzer gibt die Werte für a und b ein. Die Lösung der Gleichung lautet:

Sie funktioniert nur, wenn

Überprüfen Sie dies und melden Sie dann dem Benutzer, dass es keine oder eine (welche?) Lösung gibt oder dass zwei Lösungen existieren (welche?).

Übung 5

Der Benutzer gibt eine Jahreszahl ein. Es wird überprüft, ob es sich um ein Schaltjahr handelt. Diese Information wird ausgegeben.

4.8 Tipps zu den Übungen zu Operatoren, Verknüpfungen und Verzweigungen

Tipp zu Übung 2

Achten Sie auf die korrekten Anführungszeichen!

Tipp zu Übung 3

Zu dieser Lösung existieren zwei Varianten, wie der Benutzer ein großes oder ein kleines „m“ (oder „w“ oder „d“) eingeben kann. Die eine Variante verwendet den Konjunktor And, die zweite Variante benutzet die Funktion LCase, mit der die Schreibung in Kleinbuchstaben geändert wird. In einer dritten Variante könnte die Schreibweise mit Option Compare Text ignoriert werden.

Tipp zu Übung 5

Die Regel für die Schaltjahrbestimmung lautet: Ein Jahr ist dann Schaltjahr, wenn es durch 4 teilbar ist. Ist es durch 100 teilbar, dann ist es kein Schaltjahr. Bei 400 ist es allerdings wieder Schaltjahr. Man kann dies über Verzweigungen programmieren. Dabei stehen mehrere Varianten zur Verfügung.

4.9 Lösungen zu den Übungen zu Operatoren, Verknüpfungen und Verzweigungen

Lösung 1

Sub RechtwinklDreieck()

Dim dblSeiteA As Double

Dim dblSeiteB As Double

dblSeiteA = InputBox("Bitte die Länge der ersten Kathete!")

dblSeiteB = InputBox("Bitte die Länge der zweiten Kathete!")

MsgBox "Die Länge der Hypotenuse beträgt " & _

(dblSeiteA ^ 2 + dblSeiteB ^ 2) ^ 0.5

End Sub

Lösung 2

Sub Meldung()

MsgBox "Das ""Gute"" - dieser Satz steht fest -" & vbCr & _

"Ist stets das Böse, das man lässt." & vbCr & vbCr & _

vbTab & "W. Busch, Die Fromme Helene"

End Sub

oder analog die zweite Variante:

Sub Meldung()

MsgBox "Das " & Chr(34) & "Gute" & Chr(34) & _

" - dieser Satz steht fest -" & Chr(13) & _

"Ist stets das Böse, das man lässt." & _

Chr(13) & Chr(13) & Chr(9) & "W. Busch, Die Fromme Helene"

End Sub

Sollen sich innerhalb einer Zeichenketten Anführungszeichen geschrieben werden, so kann man sie in doppelte Anführungszeichen setzen. Oder man kann das Zeichen für Gänsefüßchen (Chr(34)) verketten. Analog steht für Zeilenwechsel vbLf oder Chr(10), für [Enter] vbCr oder Chr(13). Der Tabulator wird durch vbTab oder Chr(9) ausgedrückt.

Lösung 3

Sub Begrüßung()

Dim strName As String

Dim strGeschlecht As String

strGeschlecht = InputBox("Wie lautet dein Geschlecht?" & _

vbCr & "Bitte ""m"" oder ""w"" oder ""d"" eingeben!", "Name")

If strGeschlecht = "w" Or strGeschlecht = "W" Then

strName = InputBox("Wie lautet dein Name?", "Name")

MsgBox "Hallo, liebe " & strName

ElseIf LCase(strGeschlecht) = "m" Then

strName = InputBox("Wie lautet dein Name?", "Name")

MsgBox "Hallo, lieber " & strName

ElseIf LCase(strGeschlecht) = "d" Then

strName = InputBox("Wie lautet dein Name?", "Name")

MsgBox "Hallo, liebe(r) " & strName

Else

MsgBox "Walnusshirn: Bitte ""m"", ""w"" oder ""d"" eingeben!"

End If

End Sub

Lösung 4

Sub Quadratische_Gleichung()

Dim strZeile1 As String

Dim strZeile2 As String

Dim strGleichungszeile As String

Dim dbla As Double

Dim dblb As Double

Dim dblD As Double

Dim dblx1 As Double, Dim dblx2 As Double

strZeile1 = "0 = x2 + a*x + b"

strZeile2 = "Quadratische Gleichung"

MsgBox "Wir berechnen die Lösung der Gleichung " & _

strZeile1 & ". Bitte geben Sie die Werte für a " & _

"und für b ein!", , strZeile2

dbla = InputBox("Wie lautet die Zahl a?", strZeile1)

dblb = InputBox("Wie lautet die Zahl b?", strZeile1)

dblD = (dbla / 2) ^ 2 - dblb

strGleichungszeile = "Die Gleichung 0 = x2 + " & dbla & _

"*x + " & dblb

If dblD < 0 Then

MsgBox strGleichungszeile & " hat keine Lösung. Schade!" _

, , strZeile2

ElseIf dblD = 0 Then

MsgBox strGleichungszeile & " hat eine Lösung: " & _

-dbla / 2, , strZeile2

ElseIf dblD > 0 Then

dblx1 = -(dbla / 2) + dblD ^ 0.5

dblx2 = -(dbla / 2) - dblD ^ 0.5

MsgBox strGleichungszeile & " hat zwei Lösungen: " & _

dblx1 & " und " & dblx2, , strZeile2

End If

End Sub

Lösung 5

Sub Schaltjahr()

Dim intJahreszahl As Integer

Dim strAusgabe As String

intJahreszahl = InputBox("Bitte ein gültiges Jahr eingeben!")

strAusgabe = " ist kein Schaltjahr."

If intJahreszahl Mod 4 = 0 Then

strAusgabe = " ist Schaltjahr."

If intJahreszahl Mod 100 = 0 Then

strAusgabe = " ist kein Schaltjahr."

If intJahreszahl Mod 400 = 0 Then

strAusgabe = " ist Schaltjahr."

End If

End If

End If

MsgBox intJahreszahl & strAusgabe

End Sub

Man kann in diesem Beispiel auch den umgekehrten Weg gehen:

Sub Schaltjahr2()

Dim intJahreszahl As Integer

Dim strAusgabe As String

intJahreszahl = InputBox("Bitte ein gültiges Jahr eingeben!")

If intJahreszahl Mod 4 <> 0 Then

strAusgabe = " ist kein Schaltjahr."

Else

If intJahreszahl Mod 100 <> 0 Then

strAusgabe = " ist Schaltjahr."

Else

If intJahreszahl Mod 400 <> 0 Then

strAusgabe = " ist kein Schaltjahr."

Else

strAusgabe = " ist Schaltjahr."

End If

End If

End If

MsgBox intJahreszahl & strAusgabe

End Sub

5 Eingebaute Funktionen

Wenn Sie eine Funktion suchen, die VBA zur Verfügung stellt, dann können Sie den Objektkatalog (Ansicht / Objektkatalog oder [F2]) verwenden. Dort werden in der Bibliothek „VBA“ alle Klassen mit zugehörigen Funktionen aufgelistet.

Abbildung 1: Der Objektkatalog

Hier nun ein Überblick über die wichtigsten Funktionen:

5.1 Die mathematischen Funktionen:

Name Bedeutung
Sqr Quadratwurzel
Sin Sinus
Cos Cosinus
Tan Tangens
Atn der Arkustangens, die Umkehrfunktion des Tangens
Exp Exponentialfunktion auf Basis e
Log der natürliche Logarithmus zur Basis e
Abs gibt den Absolutwert einer Zahl zurück:
3 = Abs(3)
3 = Abs(-3)
Int gibt einen Wert zurück, der den gleichen Typ wie der übergebene Wert hat und den ganzzahligen Anteil einer Zahl enthält.
8 = Int(8.4)
-9 = Int(-8.4)
Fix gibt einen Wert zurück, der den gleichen Typ wie der übergebene Wert hat und den ganzzahligen Anteil einer Zahl enthält.
8 = Fix(8,4)
-8 = Fix(-8,4)
Sgn das Vorzeichen einer Zahl:
Wert von Zahl Rückgabewert von Sgn
Größer als Null 1
Gleich Null 0
Kleiner als Null -1
Beispiel: 1 = Sgn(7), -1 = Sgn(-7), 0 = Sgn(0)
Round Rundet eine Zahl auf oder ab.
Beispiel: Round(2.4824, 2) ergibt 2,48; Round(2.4824, 1) ergibt 2,5
Rnd Eine Zufallszahl
Randomize Wert von Zahl generierte Zufallszahl
kleiner als Null immer dieselbe Zahl, die als Startwert Zahl verwendet wird.
größer als Null die nächste Zufallszahl in der Folge
gleich Null die zuletzt generierte Zahl
nicht angegeben die nächste Zufallszahl in der Folge
Wichtig: Die Rnd-Funktion gibt einen Wert zurück, der kleiner als 1, aber größer oder gleich Null ist.

Tabelle 7:Die mathematischen Funktionen

5.2 Die finanzmathematischen Funktionen:

Name Funktionsname in Excel Bedeutung
DDB GDA Die Abschreibung eines Anlageobjekts nach der geometrisch degressiven Methode für einen spezifischen Zeitraum
SYD DIA Die Abschreibung eines Anlageobjekts nach der arithmetisch degressiven Methode für einen spezifischen Zeitraum
SLN LIA Die Abschreibung eines Anlageobjekts nach der linearen Methode für einen spezifischen Zeitraum
FV ZW Der Endwert einer Annuität ausgehend von regelmäßigen Zahlungen und einem konstanten Zinssatz
RATE ZINS Der Zinssatz einer Annuität
IRR IKV Der interne Zinsfluss für regelmäßige Cash-Flows
MIRR QIKV Der modifizierte interne Zinsfluss für regelmäßige Cash-Flows
IPMT ZINSZ Der Zinsanteil einer Annuität für einen spezifischen Zeitraum
PMT RMZ Die Zahlung einer Annuität
PPMT KAPZ Der Kapitalanteil einer Annuität
NPV NBW Der Netto-Barwert für regelmäßige Cash-Flows
PV BW Der Barwert einer Annuität

Tabelle 8:Die finanzmathematischen Funktionen

5.3 Die String-Funktionen

Name Bedeutung Beispiel
Left schneidet eine bestimmte Anzahl von Zeichen von links ab. Left("Heinrich Hoffmann", 4) ergibt "Hein"
Right schneidet eine bestimmte Anzahl von Zeichen von rechts ab. Right("Heinrich Hoffmann ", 4) ergibt "mann"
Mid schneidet eine bestimmte Anzahl von Zeichen aus der „Mitte“ heraus, das heißt, ab einer bestimmten Position. Mid("Heinrich Faust", 5, 4) ergibt "rich Hoffmann"
InStr überprüft, ob eine Zeichenfolge innerhalb einer Zeichenkette vorhanden ist und gibt die Position an. InStr("Heinrich Hoffmann", "ff") ergibt 12
InStr("Heinrich Hoffmann", "h") ergibt 8
InStr("Heinrich Hoffmann", "öy") ergibt 0
Ltrim löscht Leerzeichen am Anfang eines Strings. LTrim(" Heinrich Hoffmann ") ergibt ("Heinrich Hoffmann ")
Rtrim löscht Leerzeichen am Ende eines Strings. RTrim(" Heinrich Hoffmann ") ergibt (" Heinrich Hoffmann")
Trim löscht Leerzeichen am Anfang und Ende eines Strings. Trim(" Heinrich Hoffmann ") ergibt ("Heinrich Hoffmann ")
Len ermittelt die Länge einer Zeichenkette. Len("Heinrich Hoffmann") ergibt 17
Chr wandelt einen ASCII-Code in einen String um. Chr(13) ergibt ¶
Asc wandelt einen String in die entsprechende Zahl des ASCII-Codes um. Asc("A") ergibt 65
Str wandelt eine Zahl in einen String um. Str(65) = "65"
Val wandelt einen String in eine Zahl um. Val("65") = 65
Lcase wandelt eine Zeichenkette in Kleinbuchstaben um. Lcase("Heinrich Hoffmann") ergibt "heinrich hoffmann"
Ucase wandelt eine Zeichenkette in Großbuchstaben um. Ucase("Heinrich Hoffmann") ergibt "HEINRICH HOFFMANN"
StrConv wandelt eine Zeichenkette um. StrConv("heinrich hoffmann", vbProper-Case) ergibt "Heinrich Hoffmann". Ebenso stehen die beiden Parameter vbLowerCase und vbUpperCase zur Verfügung
StrComp „vergleicht“ zwei Zeichenketten, das heißt, es wird überprüft, welche zuerst im Alphabet steht. Ist die die erste zweite, Zeichenkette wird –1 zurückgegeben, „größer“ als im umgekehrten Fall 1. Sind beide gleich: 0. StrComp("Heinrich", "Heinrich") ergibt 0
StrComp("Heinrich", "Hoffmann") ergibt – 1
StrComp("Robert", "Heinrich") ergibt 1
Ist einer der beiden Strings leer, so wird Null übergeben.
Space gibt eine Folge von Leerzeichen aus. "Heinrich" & Space(2) & "Hoffmann" ergibt "Heinrich Hoffmann"
String wiederholt eine Zeichenfolge. "Heinrich" & String("/", 2) & "Hoffmann" ergibt "Heinrich//Hoffmann"
Split trennt eine Zeichenfolge und liefert einen Array. Split("Heinrich Hoffmann") ergibt "Heinrich"
"Hoffmann"
Join setzt eine Zeichenfolge zusammen.
Filter durchsucht eine Zeichenfolge.
InStrRev("abcd", "ä") überprüft, ob eine Zeichenfolge in einer anderen vorhanden ist. InStrRev("Heinrich Hoffmann", "ä") ergibt 0 („falsch“), InStrRev("Heinrich Hoffmann", "a") ergibt 1 („wahr“)

Tabelle 9:Die String-Funktionen

5.4 Die Uhrzeit- und Datumsfunktionen

Name Bedeutung
Date setzt das aktuelle Systemdatum ein
oder stellt das Systemdatum um.
Now gibt das Systemdatum und die aktuelle Systemzeit zurück.
Timer gibt einen Wert vom Typ Single zurück, der die Anzahl der seit Mitternacht vergangenen Sekunden angibt. Diese Funktion wird verwendet, wenn Zeitdifferenzen berechnet werden sollen.
Time setzt die aktuelle Systemzeit ein
oder stellt die Systemzeit um.
DateSerial gibt die fortlaufende Datumszahl eines Datums zurück:
DateSerial (Year, Month, Day).
DateValue gibt das Datum eines String-Arguments zurück.
TimeSerial gibt einen fortlaufenden Zeitwert für eine aus Stunden, Minuten und Sekunden bestehenden Uhrzeit zurück.
TimeValue wandelt einen String in eine Uhrzeit um.
DateAdd addiert oder subtrahiert ein angegebenes Intervall zu einem oder von einem Datum.
Syntax: DateAdd(Intervall, Anzahl, Datum)
Dabei wird das Intervall als String ausgegeben (vergleiche DateDiff).
DateDiff gibt die Anzahl der Zeitintervalle zurück, die zwischen zwei Datumsangaben liegen Syntax: DateDiff(Intervall, Date1, Date2[, FirstDayofWeek] [, FirstDayofYear]
Intervall wird als String angegeben. Es bedeuten:
D Tag
Y Kalendertag
W Wochentag
WW Woche
M Monat
Q Quartal
YYYY Jahr
S Sekunde
N Minute
H Stunde
Date1, Date2 die beiden Datumsangaben, deren Differenz berechnet werden soll
FirstDayOfWeek gibt den ersten Wochentag an. Ohne Angaben wird Sonntag als erster gesetzt, sonst:
VbUseSytem 0 Einstellung der Applikation
VbSunday 1 Sonntag
VbMonday 2 Montag
VbTuesday 3 Dienstag
VbWednesday 4 Mittwoch
VbThursday 5 Donnerstag
VbFriday 6 Freitag
VbSaturday 7 Samstag
FirstWeekofYear gibt die erste Woche des Jahres an. Ohne Angabe wird die Woche verwendet, die den 1. Jan. enthält. (Wichtig zur Berechnung von Kalenderwochen!)
VbUseSystem 0 Einstellung der Applikation
VbFirstJan1 1 Woche mit 1. Januar
Name Bedeutung
VbFirstFourDays 2 Woche mit mindestens vier Tagen des neuen Jahres (zur Berechnung von Kalenderwochen (laut ISO 8601))
VbFirstFullWeek 3 erste komplette Woche im neuen Jahr
DatePart berechnet, zu welchem Teil eines angegebenen Intervalls ein Datum gehört:
DatePart(Intervall, Date [, FirstDayofWeek] [, FirstDayofYear]
Die Zahlen und Variablen entsprechen denen von DateDiff.
Day filtert den Tag aus einem Datum.
Month filtert den Monat aus einem Datum.
Year filtert das Jahr aus einem Datum.
Weekday gibt eine Zahl zwischen 1 und 7 zurück, die dem Wochentag entspricht:
Weekday(Date, [FirstDayofWeek])
Dabei entsprechen Date einem Datum und FirstDayofWeek der gleichen Variable wie bei DateDiff. Der zurückgegebene Wert ist ebenso eine Zahl von 1 bis 7 oder von vbSunday bis vbSaturday
Hour filtert die Stunde aus einer Uhrzeit.
Minute filtert die Minutenanzahl aus einer Uhrzeit.
Second filtert die Sekundenanzahl aus einer Uhrzeit.

Tabelle 10: Die Uhrzeit- und Datumsfunktionen

5.5 Die Funktion Format

Format(Ausdruck[,Format[,firstdayofweek[,firstweekofyear]]])

Ihre Argumente: