Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Sie lernen VBA, haben VBA gelernt oder möchten Ihr Wissen über diese Programmiersprache vertiefen? Sie haben konkrete Fragen, die über das Basiswissen hinausgehen? Sie unterrichten VBA? Sie programmieren regelmäßig mit VBA? Dieses Buch gibt theoretisches und praktisches Wissen für das Erlernen von VBA wieder: zum Beispiel das Vergeben fortlaufender Rechnungsnummern, das Erstellen von Rechnungsformularen, der automatisierte Vergleich zweier Excellisten, das Schreiben von Daten eines Tabellenblatts auf ein anderes oder das Auslesen von Informationen aus Visio oder PowerPoint. Praktische Übungen zu den verschiedenen Aspekten von VBA mit Word, Excel, aber auch Hinweise für die Arbeit mit PowerPoint, Outlook und Visio sowie eine Fülle von Tipps und Tricks für die tägliche Programmierpraxis mit VBA runden das Ganze ab. Aus dem Inhalt: Operatoren, Verknüpfungen und Verzweigungen, Schleifen, Fehler, Dialoge, Klassen, Aufrufe und Parameterübergaben, selbsterzeugte Funktionen, Dateizugriff und XML, das Menüband (Ribbon), das Objektmodell von Word, Excel, PowerPoint, Outlook und Visio und der Austausch zwischen den Programmen.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 446
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
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.
2 Vorwort
2.1 Aufbau des Buches
2.2 Aufbau des Buches
3 Grundlagen
3.1 Die Syntax einer Prozedur
3.2 Kommentare
3.3 Programmzeilen
3.4 Variablen und Datentypen
3.5 Konstanten
3.6 Datenfelder, Arrays
3.7 Deklarieren eines festen Datenfelds
3.8 Deklarieren eines dynamischen Datenfeldes
3.9 Ein- und Ausgabe
3.10 Übungen zu den Grundlagen
3.11 Tipps zu den Übungen zu den Grundlagen
3.12 Lösungen zu den Übungen zu den Grundlagen
4 Operatoren, Verknüpfungen und Verzweigungen
4.1 Operatoren
4.2 Verzweigungen I
4.3 Verzweigungen II
4.4 Verzweigungen III
4.5 Verzweigungen IV
4.6 Informationsabfragen
4.7 Übungen zu Operatoren, Verknüpfungen und Verzweigungen
4.8 Tipps zu den Übungen zu Operatoren, Verknüpfungen und Verzweigungen
4.9 Lösungen zu den Übungen zu Operatoren, Verknüpfungen und Verzweigungen
5 Eingebaute Funktionen
5.1 Die mathematischen Funktionen:
5.2 Die finanzmathematischen Funktionen:
5.3 Die String-Funktionen
5.4 Die Uhrzeit- und Datumsfunktionen
5.5 Die Funktion Format
5.6 Umwandlungsfunktionen
5.7 Übungen zu den mathematischen Funktionen
5.8 Übungen zu den Textfunktionen
5.9 Übungen zu den Datumsfunktionen
5.10 Übungen zu den Formatfunktionen
5.11 Tipps zu den Übungen zu den Funktionen
5.12 Lösungen zu den Übungen zu den Funktionen
6 Selbsterzeugte Funktionen, Aufrufe, Parameterübergabe
6.1 Aufruf
6.2 Globale Variablen
6.3 Übergabe
6.4 Übungen zu selbsterzeugten Funktionen, Aufrufen und Parameterübergaben
6.5 Lösung zu den Übungen zu selbsterzeugten Funktionen
7 Schleifen, rekursives Programmieren
7.1 Zählerschleifen
7.2 Bedingungsschleifen
7.3 Rekursionen
7.4 Übungen zu den Schleifen
7.5 Tipps zu den Übungen zu den Schleifen
7.6 Lösungen zu den Übungen zu den Schleifen
8 Dateizugriff
8.1 Der Zugriff auf Dateien
8.2 Übungen zum Zugriff auf die Dateien
8.3 Tipps zu den Übungen zum Zugriff auf die Dateien
8.4 Lösungen zu den Übungen zum Zugriff auf die Dateien
8.5 Dateisystemobjekte (File System Objects, FSO)
8.6 Übungen zum FileSystemObject
8.7 ini-Dateien
8.8 Übungen zu den ini-Dateien
8.9 Lösungen zu den Übungen zu den ini-Dateien
8.10 Zugriff auf die Registry
8.11 Übung zum Zugriff auf die Registry
8.12 Lösung zur Übung zum Zugriff auf die Registry
8.13 Sequentielle Dateien
8.14 Übungen zu den sequentiellen Dateien
8.15 Tipp zu den Übungen zu den sequentiellen Dateien
8.16 Lösungen zu den Übungen zu den sequentiellen Dateien
8.17 XML-Dateien
8.18 Übungen zu XML-Dateien
9 Klassen
9.1 Was sind Klassen?
9.2 Eigenschaften von Objekten
9.3 Methode
3.2. Sammlungen
3.3. Ereignisse in Klassen
9.4 Übungen zu den Klassen
9.5 Lösungen zu den Übungen zu den Klassen
10 Fehler
10.1 Programmierfehler
10.2 Fehler zur Laufzeit
10.3 Übungen zu den Fehlerbehandlungen
10.4 Lösungen zu den Übungen zu den Fehlerbehandlungen
11 Externe DLLs aufrufen
11.1 Aufruf einer API-Funktion
11.2 Die Declare-Anweisung
11.3 Beispiele für den Einsatz von APIs
12 Userforms (Dialoge, Formulare, Masken)
12.1 Dialog und Befehlsschaltfläche
12.2 Übungen zur Dialogbox und zu den Befehlsschaltflächen
12.3 Tipps zu den Aufgaben der Dialogbox und zu den Befehlsschaltflächen
12.4 Lösungen zu den Aufgaben der Dialogbox und zu den Befehlsschaltflächen
12.5 Textfelder, Beschriftungsfelder und Anzeige
12.6 Übungen zu den Textfeldern und den Bezeichnungsfeldern
12.7 Tipps zu den Übungen zu Textfeldern und den Bezeichnungsfeldern
12.8 Lösungen zu den Übungen zu Textfeldern und den Bezeichnungsfeldern
12.9 Rahmen, Optionsfeld, Kontrollkästchen und Umschaltfeld
12.10 Übungen zu Rahmen, Optionsfeld, Kontrollkästchen und Umschaltfeld
12.11 Tipps zu den Übungen zu Rahmen, Optionsfeld und Kontrollkästchen
12.12 Lösungen zu den Übungen zu Rahmen, Optionsfeld und Kontrollkästchen
12.13 Kombinationsfeld und Listenfeld
12.14 Übungen zu Kombinationsfeld und Listenfeld
12.15 Tipps zu den Übungen zu Kombinationsfeld und Listenfeld
12.16 Lösungen zu den Übungen zu Kombinationsfeld und Listenfeld
12.17 Bildlaufleiste und Drehfeld
12.18 Übungen zu Bildlaufleiste und Drehfeld
12.19 Tipps zu den Übungen zu Bildlaufleiste und Drehfeld
12.20 Lösungen zu den Übungen zu Bildlaufleiste und Drehfeld
12.21 Register und Multiseiten
12.22 Übungen zu Registern und Multiseiten
12.23 Tipps zu den Übungen zu Register und Multiseiten
12.24 Lösungen zu den Übungen zu Register und Multiseiten
12.25 Steuerelemente zur Laufzeit erzeugen
12.26 Übungen zu Steuerelemente zur Laufzeit erzeugen
12.27 Tipps zu den Übungen zu Steuerelemente zur Laufzeit erzeugen
12.28 Lösungen zu den Übungen zu Steuerelemente zur Laufzeit erzeugen
12.29 Weitere Steuerelemente
13 Word VBA
13.1 Programmzugriff (Application)
13.2 Dateizugriff
13.3 Übungen zum Dateizugriff
13.4 Lösungen zu den Übungen zum Dateizugriff
13.5 Bewegen, Markieren, Markierung auslesen
13.6 Übungen zum Bewegen, Markieren, Markierung auslesen
13.7 Tipps zu den Übungen zum Bewegen, Markieren, Markierung auslesen
13.8 Lösungen zu den Übungen zum Bewegen, Markieren, Markierung auslesen
13.9 Position des Cursors bestimmen
13.10 Range – ein polymorphes Wesen
13.11 Übungen zum Objekt Range
13.12 Tipps zu den Übungen zum Objekt Range
13.13 Lösungen zu den Übungen zum Objekt Range
13.14 Tabellen
13.15 Übungen zu den Tabellen
13.16 Tipps zu den Übung zu den Tabellen
13.17 Lösungen zu den Übung zu den Tabellen
13.18 Formularfelder
13.19 Übungen zu den Formularfeldern
13.20 Tipps zu den Übungen zu den Formularfeldern
13.21 Lösungen zu den Übungen zu den Formularfeldern
13.22 Ereignisse in Word
13.23 Übungen zu den Ereignissen in Word
13.24 Tipps zu den Übungen zu den Ereignissen in Word
13.25 Lösungen zu den Übungen zu den Ereignissen in Word
13.26 Einige nützliche, erstaunliche und lustige Befehle
14 Das Objektmodell von Excel
14.1 Programmzugriff
14.2 Dateizugriff
14.3 Zugriff auf Tabellenblätter
14.4 Übungen zum Programmzugriff, Dateizugriff, Tabellenzugriff
14.5 Lösungen zu den Übungen zum Programmzugriff, Dateizugriff, Tabellenzugriff
14.6 Zugriff auf Zellen
14.7 Zeilen und Spalten
14.8 Rechnen in Excel
14.9 Zugriff auf Zeichen innerhalb einer Zelle
14.10 Hilfsmittel in Excel
14.11 Übungen zum Zellzugriff
14.12 Tipp zu den Übungen zum Zellzugriff
14.13 Lösungen zu den Übungen zum Zellzugriff
14.14 Diagramme
14.15 Ereignisse in Excel
14.16 Übungen zu den Ereignissen
14.17 Lösungen zu den Übungen zu den Ereignissen
14.18 Einige nützliche, erstaunliche und lustige Befehle
15 Das Objektmodell von PowerPoint
15.1 Datei- und Programmzugriff
15.2 Folien
15.3 Folienhintergründe
15.4 Objekte auf Folien
15.5 Besonderheiten bei der PowerPoint-Programmierung
15.6 Übungen zu PowerPoint
15.7 Lösungen zu den Übungen zu PowerPoint
16 Zugriff auf Visio
16.1 Die oberste Ebene: Application
16.2 Das Document-Objekt
16.3 Schablonen
16.4 Seiten (das Page-Objekt)
16.5 Shape-Zugriff
16.6 Neue Shapes zeichnen
17 Das Objektmodell von Outlook
17.1 Neue Elemente erzeugen
17.2 Das Namespace-Objekt
17.3 Die Items
17.4 Ereignisse in Outlook
17.5 Übung zu Outlook
17.6 Lösung zur Übung zu Outlook
18 Austausch zwischen den Programmen
18.1 Ein Programm aus einem anderen starten
18.2 Zugriff auf Office-Programme
18.3 Übungen zum Programmaustausch Word nach Excel
18.4 Lösungen zu den Übungen zum Programmaustausch Word nach Excel
18.5 Übungen zum Programmaustausch Excel nach Word
18.6 Lösungen zu den Übungen zum Programmaustausch Excel nach Word
18.7 Übung zum Programmaustausch Outlook nach Word und Excel
18.8 Lösung zum Programmaustausch Outlook nach Word und Excel
18.9 Übung zum Programmaustausch Visio nach Excel
18.10 Lösung zur Übung zum Programmaustausch Visio nach Excel
19 Guter Code – ein Vorschlag
19.1 Code
19.2 Programmierstil und Programmierstrategien
19.3 Fazit
20 Stichwortverzeichnis
VBA existiert nun seit mehr als 20 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 2016, 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.
VBA untergliedert sich in drei Bereiche. Zum einen ist der Sprachkern selbst zu nennen: der Teil von VBA, der sich auch in VB.NET befindet. 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 (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.
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.17) habe ich nur das Zugriffsmodell DOM beschrieben, nicht SAX. Ich habe nicht gezeigt, wie man in Excel Pivottabellen programmiert oder was man beachten muss, wenn man eigene Funktionen für Excel erstellt. Wie man in Visio überprüft, ob ein Shape auf einem bestimmten Layer liegt. Wie man weitere Steuerelemente in die Dialoge einbaut. Ich habe kein Wort über das Starten der Makros verloren: an welche Elemente man sie binden kann, wie man in der Multifunktionsleiste neue Registerkarten einfügt und diese mit Symbolen bestückt. 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 die Programmsprache VBA erhalten.
Nun bleibt mir nur noch, Ihnen viel Spaß beim Lesen des Buchs zu wünschen.
René Martin
im März 2016
Über Anregungen, Bemerkungen und Kritik freue ich mich:
Die Beispiele können Sie von meiner Seite
www.compurem.de dort: Autorentätigkeit / Downloads (Bücher) herunterladen.
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:
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 den 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:
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.
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
MsgBox MeinFahrrad.Anschaffungspreis
End Sub
Die Syntax der Const-Anweisung besteht aus folgenden Teilen:
Tabelle 3: Die Syntax der Const-Anweisung
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 Einstellung 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.
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 z.B. 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:
Sub Mein erstes Makro()
MsgBox "Hallo"
End Sub
Sub Gruß()
MsgBox(Prompt:="Guten Morgen")
End Sub
Sub Ende1()
MsgBox "Diese Anweisung wird aufgrund eines ungültigen _
Vorgangs geschlossen.", vbCritical
End Sub
Sub Ende2()
MsgBox _
"Wenden Sie sich an den Hersteller, " & _
"falls das Problem weiterhin besteht.", _
vbCritical rem Keine schöne Meldung
End Sub
Sub Wertezuweisen()
Dim strJahreszeit(4) As String
Dim i As Integer
End Sub
Sub Wertezuweisen2()
Dim strHimmelsrichtung() As String
ReDim strHimmelsrichtung(0)
ReDim strHimmelsrichtung(1)
ReDim strHimmelsrichtung(2)
ReDim strHimmelsrichtung(3)
End Sub
Achten Sie genau auf die Schreibweise, auf Leerzeichen, auf korrekte Umbrüche und auf korrekt deklarierte Variablen!
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
Wird das Meldungsfenster mit einer Klammer verwendet, dann muss ein Wert übergeben werden. Also beispielsweise so:
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!
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
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.
Arrays beginnen, wenn nichts Anderes festgelegt wird, bei 0. Das heißt, LBound(strJahreszeiten) 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
Wenn Sie das Datenfeld vergrößern:
ReDim strHimmelsrichtung(3)
und anschließend füllen:
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:
Tabelle 4: Die Operatoren in VBA
Die Verknüpfungsmöglichkeiten können in einer Tabelle aufgelistet werden:
Tabelle 5: Die Konjunktoren in VBA
Das Gleichheitszeichen hat in VBA zwei Bedeutungen: Es übergibt einen Wert an eine Variable:
oder es vergleicht den Inhalt einer Variablen mit einem Wert:
Während mit dem Vergleichsoperator „=“ nur exakte Gleichheit überprüft werden kann, kann mit Like mit Platzhaltern gearbeitet werden. Beispiele:
ergibt „True“.
ergibt dagegen „False“. „True“ liefern folgende drei Vergleiche:
"Struwwelpeter" Like "Struwwel*"
"Struwwelpeter" Like "*peter"
"Struwwelpeter" Like "S?ruwwelpe?er"
„False“ ist das Ergebnis von folgendem Vergleich:
"STRUWWELPETER" Like "Struwwelpeter"
Wird dagegen vor den Prozeduren im allgemeinen Deklarationsteil folgender 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 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 (sehr selten verwendete) Verzweigung hat die folgende Syntax:
IIf(expr, truepart, falsepart)
Während die If-Verzweigung, wie in Kapitel 4.2 beschrieben, Anweisungen verarbeiten kann, liefert IIf als Funktion einen Wert. Beispielsweise so:
"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
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:
Tabelle 6: Die Liste der Informationsabfragen
Im rechtwinkligen Dreieck gilt für die drei Seiten:
Der Benutzer gibt die Werte von a und b ein und erhält die Länge der Hypotenusen c.
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
Schreiben Sie eine Prozedur, in der die Benutzerin oder der Benutzer nach ihrem / seinem Geschlecht („w“ oder „m“) 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.
Gesucht ist die Lösung der Gleichung
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?).
Der Benutzer gibt eine Jahreszahl ein. Es wird überprüft, ob es sich um ein Schaltjahr handelt. Diese Information wird ausgegeben.
Achten Sie auf die korrekten Anführungszeichen!
Zu dieser Lösung existieren zwei Varianten, wie der Benutzer ein großes oder ein kleines „m“ (oder „w“) 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.
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.
Sub RechtwinklDreieck()
Dim dblSeiteA As Double
Dim dblSeiteB As Double
MsgBox "Die Länge der Hypotenuse beträgt " & _
(dblSeiteA ^ 2 + dblSeiteB ^ 2) ^ 0.5
End Sub
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.
Sub Begrüßung()
Dim strName As String
Dim strGeschlecht As String
vbCr & "Bitte ""m"" oder ""w"" eingeben!", "Name")
MsgBox "Hallo, liebe " & strName
MsgBox "Hallo, lieber " & strName
Else
MsgBox "Walnusshirn: Bitte ""m"" oder ""w"" eingeben!"
End If
End Sub
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
MsgBox "Wir berechnen die Lösung der Gleichung " & _
strZeile1 & ". Bitte geben Sie die Werte für a " & _
"und für b ein!",, strZeile2
"*x + " & dblb
If dblD < 0 Then
MsgBox strGleichungszeile & " hat keine Lösung. Schade!" _
,, strZeile2
MsgBox strGleichungszeile & " hat eine Lösung: " & _ -
dbla / 2,, strZeile2
ElseIf dblD > 0 Then
MsgBox strGleichungszeile & " hat zwei Lösungen: " & _
dblx1 & " und " & dblx2,, strZeile2
End If
End Sub
Sub Schaltjahr()
Dim intJahreszahl As Integer
Dim strAusgabe As String
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
If intJahreszahl Mod 4 <> 0 Then
Else
If intJahreszahl Mod 100 <> 0 Then
Else
If intJahreszahl Mod 400 <> 0 Then
Else
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 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:
Tabelle 7:Die mathematischen Funktionen
Tabelle 8:Die finanzmathematischen Funktionen
Tabelle 9:Die String-Funktionen
Syntax: DateAdd(Intervall, Anzahl, Datum)
Dabei wird das Intervall als String ausgegeben (vergleiche DateDiff).
DateDiffgibt die Anzahl der Zeitintervalle zurück, die zwischen zwei Datumsangaben liegenSyntax: DateDiff(Intervall, Date1, Date2[, FirstDayofWeek] [, FirstDayofYear]
Intervallwird als String angegeben. Es bedeuten: DTag YKalendertag WWochentag WWWoche MMonat QQuartal YYYYJahr SSekunde NMinute HStunde Date1, Date2die beiden Datumsangaben, deren Differenz berechnet werden soll FirstDayOfWeekgibt den ersten Wochentag an. Ohne Angaben wird Sonntag als erster gesetzt, sonst: VbUseSytem0Einstellung der Applikation VbSunday1Sonntag VbMonday2Montag VbTuesday3Dienstag VbWednesday4Mittwoch VbThursday5Donnerstag VbFriday6Freitag VbSaturday7Samstag FirstWeekofYeargibt die erste Woche des Jahres an. Ohne Angabe wird die Woche verwendet, die den 1. Jan. enthält. (Wichtig zur Berechnung von Kalenderwochen!) VbUseSystem0Einstellung der Applikation VbFirstJan11Woche mit 1. Januar VbFirstFourDays2Woche mit mindestens vier Tagen des neuen Jahres (zur Berechnung von Kalenderwochen (laut ISO 8601)) VbFirstFullWeek3erste komplette Woche im neuen Jahr DatePartberechnet, zu welchem Teil eines angegebenen Intervalls ein Datum gehört: DatePart(Intervall, Date [, FirstDayofWeek] [, FirstDayofYear] Die Zahlen und Variablen entsprechen denen von DateDiff.Dayfiltert den Tag aus einem Datum.Monthfiltert den Monat aus einem Datum.Yearfiltert das Jahr aus einem Datum.Weekdaygibt 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
Hourfiltert die Stunde aus einer Uhrzeit.Minutefiltert die Minutenanzahl aus einer Uhrzeit.Secondfiltert die Sekundenanzahl aus einer Uhrzeit.Tabelle 10: Die Uhrzeit- und Datumsfunktionen
Format(Ausdruck[,Format[,firstdayofweek[,firstweekofyear]]])
Ihre Argumente:
Format(1234, "0.00") liefert 1234,00 Format(1234.5678, "0") liefert 1235
Format(1234.5678, "0.00") liefert 1234,57
#Platzhalter für eine Ziffer, die nur angezeigt wird, wenn sich an dieserStelle eine Ziffer befindet, gedacht für Tausendertrennzeichen.
Format(1234, "0") liefert 1234Format(1234, "#,##0") liefert 1.234
Format(123, "#,##0") liefert 123
. und,Der Punkt dient als Trennzeichen für Dezimalzeichen, das Komma fürTausendertrennzeichen. Also umgekehrt als im Deutschen!
Siehe oben%multipliziert die Zahl mit 100 und fügt ein %-Zeichen an.Format(0.15, "#,##0.00%") liefert 15,00%Format(0.125, "0.00 %") liefert 12,50 %
E- E+ e- e+wissenschaftliche ZahlenschreibweiseFormat(1250000, "0.00 E+00") liefert 1,25 E+06Format(1250000, "0.00 E-00") liefert 1,25 E06
Format(1250000, "0.00 e+0") liefert 1,25 e+6
Format(0.125, "0.00 e-0") liefert 1,25 e-1
Format(0.000125, "0.00 E-00") liefert 1,25 E-04
+, - Leerzeichen und $können zur Darstellung direkt in die Formatierung eingefügt werden.Format(1234, "#,##0.00 $") liefert 1.234,00 $\Das nächste Zeichen wird als Zeichen und nicht als Formatierung ausgegeben. Das „\“ verschwindet in der Anzeige.Format(1234, "#,##0.00 \L\i\r\e") liefert 1.234,00 LireTabelle 11: Die Funktion Format und Zahlen
Es können bis zu vier verschiedene Zahlenformate in Abschnitten ausgegeben werden. Dabei bedeuten:
Tabelle 12: Die Funktion Format und Zahlen und Abschnitte
Datumsformatierungen:
Tabelle 13: Die Funktion Format und Datumsformatierungen
Die Zeitangaben:
Tabelle 14: Die Funktion Format und Zeitformatierungen
Zeichenformatierungen:
Tabelle 15: Die Funktion Format und Zeichenformatierungen
Tabelle 16: Umwandlungsfunktionen
Berechnen Sie Ostersonntag! Die Lösung dieses Problems stammt vom Mathematiker, Astronom und Physiker Carl Friedrich Gauß, und sieht wie folgt aus: Die Jahreszahl sei J und J - 1900 sei a. Der Rest von a/19 wird schlicht b genannt. Jetzt wird vom Ausdruck (7*b+1)/19 der ganzzahlige Quotient genommen, der c genannt wird. Mit d wird der Rest von (11*b+4-c)/29 bezeichnet und der Quotient von a/4 mit e. Dann bleibt noch der Rest von (a+e+31-d)/7. Und dieser soll f genannt werden. Daraus folgt, dass für das Osterdatum April die Formel 25 - d - f gilt.
Soll beispielsweise von 2016 der Ostersonntag berechnet werden, so ergeben sich folgende Werte:
Analog für das Jahr 2017:
Die Funktion Round rundet nur Stellen nach dem Dezimalzeichen. Lassen Sie mit ihrer Hilfe vor dem Komma runden, also beispielsweise 1.234.567 ergibt auf 2 Stellen vor dem Komma 1.234.600 und auf 6 Stellen: 1.000.000.
Schreiben Sie eine Prozedur, die einen Namen mit Vornamen und Zunamen in Vor- und Zunamen zerlegt.
Schreiben Sie eine Prozedur, die aus einem Dateipfad den Dateinamen (ohne Endung) herausliest.
Schreiben Sie eine Prozedur, die überprüft, ob von einem eingegebenen Text das erste Zeichen eine Ziffer ist.
Der Benutzer oder die Benutzerin wird aufgefordert, ein „m“ oder ein „w“ für das Geschlecht einzugeben. Gibt er oder sie weder ein „w“, „W“, „m“ noch ein „M“ ein, dann wird er oder sie darauf hingewiesen.
Der Benutzer gibt sein