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
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.
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.
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.
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.
[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
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.
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.
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
[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"
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.
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
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.
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.
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
Achten Sie genau auf die Schreibweise, auf Leerzeichen, auf korrekte Umbrüche und auf korrekt deklarierte Variablen!
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.
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
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
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
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.
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.
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
Ü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.
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.
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
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:
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
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
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
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
Format(Ausdruck[,Format[,firstdayofweek[,firstweekofyear]]])
Ihre Argumente: