Basic-Sprachfamilie. Der Begriff Visual Basic wird in der Fachwelt in drei unterschiedlichen Bedeutungen verwendet:



Ähnliche Dokumente
5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Modul 122 VBA Scribt.docx

VisualBasic - Variablen

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Zwischenablage (Bilder, Texte,...)

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Datentypen. Agenda für heute, 4. März, Pascal ist eine streng typisierte Programmiersprache

Einführung in die Java- Programmierung

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel für Mac. amac-buch Verlag

E-PRIME TUTORIUM Die Programmiersprache BASIC

Diana Lange. Generative Gestaltung Operatoren

Sin-Funktion vgl. Cos-Funktion

Access [basics] Programmieren mit Arrays. Beispieldatenbank. Arrays. Eindimensionale Arrays. VBA-Grundlagen Programmieren mit Arrays

Datenbanken Kapitel 2

GEONET Anleitung für Web-Autoren

Objektorientierte Programmierung

IT-Zertifikat: Allgemeine Informationstechnologien II PHP

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Access [basics] Aktionsabfragen per VBA ausführen. Beispieldatenbank. Aktionsabfragen. Die Execute-Methode. Datenzugriff per VBA

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Kennen, können, beherrschen lernen was gebraucht wird

4 Aufzählungen und Listen erstellen

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

xcall White Paper Wählen-Buttons in Excel

Einführung in die C++ Programmierung für Ingenieure

Mediator 9 - Lernprogramm

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: )

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten

Wir arbeiten mit Zufallszahlen

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Zur drittletzten Zeile scrollen

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

Einführung zum Arbeiten mit Microsoft Visual C Express Edition

E Mail Versand mit der Schild NRW Formularverwaltung

Schnelleinstieg. Datenimport für die EXPOSÉ - Familie. Import von Adress / Objektdaten aus MS Excel. = Datenintegration aus anderen Lösungen

Einführung in die Programmierung

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG

Neben dem Symbol Entwurfsmodus ist das Symbol Befehlschaltfläche zu sehen.

Primzahlen und RSA-Verschlüsselung

Excel Funktionen durch eigene Funktionen erweitern.

Wie kann ich in der Backstage-Ansicht eigene Dokumentationen einbinden?

STRATO Mail Einrichtung Mozilla Thunderbird

Installationsleitfaden kabelsafe backup professional unter MS Windows

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

1 Vom Problem zum Programm

AutoTexte und AutoKorrektur unter Outlook verwenden

Handbuch ECDL 2003 Basic Modul 5: Datenbank Access starten und neue Datenbank anlegen

Nutzung von GiS BasePac 8 im Netzwerk

Programmierung in C. Grundlagen. Stefan Kallerhoff

1 Mathematische Grundlagen

Programmierparadigmen. Programmierparadigmen. Imperatives vs. objektorientiertes Programmieren. Programmierparadigmen. Agenda für heute, 4.

Modellierung und Programmierung 1

DYNAMISCHE SEITEN. Warum Scriptsprachen? Stand: CF Carola Fichtner Web-Consulting

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Informationen zur Verwendung von Visual Studio und cmake

Dokumentation IBIS Monitor

P&P Software - Adressexport an Outlook 05/29/16 14:44:26

Auf der linken Seite wählen Sie nun den Punkt Personen bearbeiten.

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar CAP-News 40

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

DELFI. Benutzeranleitung Dateiversand für unsere Kunden. Grontmij GmbH. Postfach Bremen. Friedrich-Mißler-Straße Bremen

Menü Macro. WinIBW2-Macros unter Windows7? Macros aufnehmen

Visual Basic Express erstes Projekt anlegen

Anleitung zur Verwendung der VVW-Word-Vorlagen

Lehrer: Einschreibemethoden

Wie Sie mit Mastern arbeiten

Windows 8.1. Grundkurs kompakt. Markus Krimm, Peter Wies 1. Ausgabe, Januar inkl. zusätzlichem Übungsanhang K-W81-G-UA

Die Textvorlagen in Microsoft WORD und LibreOffice Writer

4. BEZIEHUNGEN ZWISCHEN TABELLEN

Wählen Sie bitte START EINSTELLUNGEN SYSTEMSTEUERUNG VERWALTUNG und Sie erhalten unter Windows 2000 die folgende Darstellung:

Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten

Zahlen auf einen Blick

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Informatik Kurs Simulation. Hilfe für den Consideo Modeler

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

Computeranwendung und Programmierung (CuP)

Einrichtung des DFÜ-Netzwerkes

Drucken aus der Anwendung

Office Objektmodell (1)

Hinweise zur Datensicherung für die - Prüfmittelverwaltung - Inhalt

Bedienungsanleitung Anlassteilnehmer (Vereinslisten)

Datenübernahme von HKO 5.9 zur. Advolux Kanzleisoftware

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

Gruppenrichtlinien und Softwareverteilung

Wo möchten Sie die MIZ-Dokumente (aufbereitete Medikamentenlisten) einsehen?

Terminland Schritt für Schritt

Praktikum Ingenieurinformatik. Termin 2. Verzweigungen (if-else), printf und scanf, while-schleife

Eine eigene Seite auf Facebook-Fanseiten einbinden und mit einem Tab verbinden.

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

ecall sms & fax-portal

Access und die andern (Office) Programme. Armin Hess

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden.

Windows Server 2012 RC2 konfigurieren

2.1 Sicherheits-Zonen ActiveX-Steuerelemente Skripting Verschiedenes Erweitert... 9

Kapitel 7 - Wägungen

Anzeige von eingescannten Rechnungen

Transkript:

3 Die Visual Basic-Sprachfamilie Dieses Kapitel liefert Ihnen eine kompakte Einführung in die Programmiersprache Visual Basic, wobei der Schwerpunkt auf dem kleinsten Mitglied der Sprachfamilie, VBScript (VBS), liegt. Aber auch die großen Brüder, die»vollversion«visual Basic 6.0 (VB6) und Visual Basic for Applications (VBA), finden Berücksichtigung. Soweit nicht anders erwähnt sind alle Beispiele in diesem Buch in VBScript geschrieben, aber auch in den anderen Dialekten lauffähig. Das neue Visual Basic.NET (VB.NET) ist in vielen Punkten anders als die anderen Mitglieder der Sprachfamilie. Die Aussagen in diesem Kapitel lassen sich nicht unbedingt auf VB.NET übertragen. Zur automatisierten Administration mit VB.NET wird Ende des Jahres 2001 ein separates Buch bei Addison-Wesley erscheinen. Auf die Darstellung anderer (Skript-)Sprachen wird an dieser Stelle bewusst verzichtet, um die Komplexität der Komponentendokumentation und der Automatisierungslösungen nicht durch den Wechsel zwischen verschiedenen Sprachen zu erhöhen. VBScript ist die verbreitetste Skriptsprache im Windows-Bereich und bietet sich auf Grund der starken Synergieeffekte mit VB6 und VBA als zentrale Sprache in diesem Buch an. Bewusst werden die Unterschiede zu VBA und der VB-Vollversion herausgearbeitet, die geringer sind, als oft vermutet wird. In der Praxis werden viele von Ihnen zwischen den verschiedenen Dialekten wechseln, denn die VB-Vollversion und VBA sind ernstzunehmende Umgebungen für Automationslösungen und auch für das Prototyping von Skripten eine gute Wahl. Sie sollten also die Unterschiede zwischen VB6, VBA und VBS gut kennen. Das gilt auch dann, wenn Sie nur Skripte programmieren wollen, denn Sie werden immer wieder Codebeispiele in VB6 und VBA finden, die Sie in VBS umsetzen möchten. VBS, VBA, VB6.0, VB.NET VB.NET Sprachregelungen in diesem Buch Der Begriff Visual Basic wird in der Fachwelt in drei unterschiedlichen Bedeutungen verwendet: Visual Basic meint eine Programmiersprache. Visual Basic bezeichnet eine Entwicklungsumgebung im Rahmen von Visual Studio. Visual Basic dient als Oberbegriff über die VB-Sprachfamilie. Diese Mehrfachbedeutung macht es schwierig, sich eindeutig auszudrücken. In diesem Buch werden folgende Sprachregelungen verwendet: Visual Basic (oder kurz»vb«) wird als Oberbegriff über die Sprachfamilie verwendet. Die Bezeichnung»VB-Vollversion«wird für die kompilierungsfähige Programmiersprache im Rahmen von Visual Studio verwendet, VB6 für die Version 6.0 der VB-Vollversion. Zur Vereinfachung wird an einigen Stellen VB6 synonym zu»vb-vollversion«die großen Brüder sind beachtenswert Begriffsabgrenzung VB VB6 145

verwendet. Auf die Kompatibilität zu früheren Versionen wird nicht eingegangen. Grundsätzlich kann allerdings festgehalten werden, dass sich von VB5 zu VB6 an der Sprache selbst nicht viel geändert hat. Der Schritt von VB 6.0 zu VB.NET ist wesentlich größer. VB6/VBA Das Kürzel VB6/A bedeutet: VB6 und VBA. Dies ist sinnvoll, weil die meisten Aussagen für die VB-Vollversion häufig auch für VBA gelten. VBS Die Ausdrücke Visual Basic Script, VBScript und VBS bezeichnen die Skriptsprache. Beispiele Beispiele in diesem Kapitel Die Beispiele in diesem Kapitel wurden in der Regel in VBScript für den Windows Script Host (WSH) geschrieben, weil dieser Scripting Host am einfachsten zu beherrschen ist. Wenn Sie noch keine Erfahrungen mit dem WSH haben, sollten Sie einen Blick in das Kapitel 4 werfen. Die Beispiele zu diesem Kapitel finden Sie als WSH-Dateien mit der Extension.VBS auf der Buch-CD [CD:/code/sprachen/vbs/]. Die Beispiele, die nicht in VBS lauffähig sind, finden Sie in einem VB6-Projekt [CD:/code/sprachen/_alle/vb-beispiele.vbp]. Soweit dies auf Grund der Sprachunterschiede möglich ist, ist in dieser Projektdatei auch eine Kopie der VBS-Beispiele enthalten. Die meisten Beispiele sind ohne weiteres auch in VB6/VBA lauffähig, wenn Sie beachten, dass anders als in VBS alle Befehle Teile einer Unterroutine sein müssen. Außerhalb einer Unterroutine dürfen nur Variablen und Typen deklariert werden. Dazu ein Beispiel: ausgabe = "Hallo" MsgBox ausgabe Listing 3.1: Ein VBS-Skript für den WSH [helloworld.vbs] Umsetzung in VB6/VBA Sub Main() Dieses Skript müssen Sie in VB6/VBA in folgenden Code umsetzen und dann die Unterroutine main() starten: Sub main() Jede Programmzeile muss Teil ausgabe = "Hallo" einer Unterroutine sein. MsgBox ausgabe End Sub Listing 3.2: Umsetzung des vorherigen Skripts in VB6/VBA Wenn Sie eine VB6-Anwendung starten, wird automatisch das Unterprogramm Sub Main() oder ein in der Projektkonfiguration ausgewähltes Formular aufgerufen. Aus der Entwicklungsumgebung heraus haben Sie die Möglichkeit, die Ausführung auch bei anderen Unterroutinen beginnen zu lassen. 146

3.1 Die Visual Basic-Sprachfamilie Visual Basic ist Microsofts Weiterentwicklung der Programmiersprache Basic. Visual Basic ist inzwischen die beliebteste Programmiersprache in der Microsoft-Windows-Welt [CWO99]. Sie zeichnet sich durch das Rapid Application Development (RAD) aus: die Fähigkeit, einfach und schnell Anwendungen zu entwickeln. Basic wurde 1965 entwickelt und ist die Abkürzung für Beginners All Purpose Symbolic Instruction Code. Diese Sprache war bei Computer-Einsteigern beliebt, unter Profis jedoch auf Grund ihrer mangelnden Strukturiertheit (Stichwort: Goto-Anweisung) verrufen. Microsoft hat Basic mit Visual Basic aus der Schmuddelecke unter den Programmiersprachen geholt und um Konstrukte der Objektorientierung erweitert. Geschichte Visual Basic war bis einschließlich Version 6.0 nur eine klassenbasierte, nicht jedoch eine objektorientierte Programmiersprache, da das wesentliche objektorientierte Prinzip der Vererbung nicht vorhanden war (Klassifikation nach Wegner, siehe [WEG89], S. 245ff. und [WEG90]). Visual Basic.NET (VB7.0) unterstützt jedoch Vererbung und die darauf aufbauenden Formen des Polymorphismus. Visual Basic bleibt aber weiterhin eine hybride Programmiersprache, da es ähnlich wie in C++ möglich ist, auch rein prozedural zu programmieren. Java und Smalltalk sind dagegen Sprachen aus der Gruppe der reinen objektorientierten Programmiersprachen. Auch wurde mit der VB-Version 7.0 (VB.NET) endlich das letzte Einsatzgebiet der Goto-Anweisung eliminiert. Visual Basic hat inzwischen zwei kleine Brüder bekommen: Visual Basic for Applications (VBA) und Visual Basic Script (VBS oder VBScript). Die folgende Grafik veranschaulicht den Umfang der Sprachdefinition in den verschiedenen VB-Dialekten in verschiedenen Versionen. Objektorientierung VBA und VBS Abbildung 3.1: Sprachumfang der VB-Dialekte 147

3.1.1 Visual Basic for Applications (VBA) Visual Basic for Applications (VBA) ist eine Interpretersprache zur Automatisierung der Bedienung einer Anwendung und ersetzt in vielen Fällen die früheren Makrosprachen der Anwendungen. Ein VBA-Programm läuft stets innerhalb eines VBA-Hosts. Dieser ist eine VBA-fähige Anwendung. Vorreiter bei der Integration von VBA in Anwendungen ist Microsoft mit seiner Office-Produktfamilie. Darüber hinaus unterstützen aber auch noch viele andere Anwendungen VBA: WordPerfect Office 2000 CorelDraw ab Version 9.0 AGRESSO 5 VBA in MS Office Interpretation und Kompilierung TurboCAD Professional IntelliCAD 2000 Micrografx igrafx Professional Psipenta Rational Rose Eine Liste aller VBA-fähigen Produkte findet man unter [VBA01]. In früheren Versionen der Microsoft Office-Produktfamilie hatten die Kernprodukte ihre eigenen Basic-Dialekte: Excel VBA, Word Basic, Access Basic. Mit Microsoft Office 97 erfolgte eine Vereinheitlichung hinsichtlich der Sprachsyntax. Außerdem wurde Powerpoint ebenfalls VBA-fähig. In Office 97 trägt VBA die Versionsnummer 5.0, in Office 2000 6.0. Office 2001 enthält VBA 6.3. VBA 6.0 ist hinsichtlich der Sprachkonstrukte kompatibel zur Visual Basic 6.0-Vollversion. Uneinheitlich blieb jedoch die Entwicklungsumgebung. Die Features der VBA-Entwicklungsumgebung werden im Rahmen der fortgeschrittenen Techniken in Kapitel 6 besprochen. Grundsätzlich gilt, dass VBA interpretiert wird. Während es in Office 97 keine Möglichkeit gab, VBA zu kompilieren, ist dieser Grundsatz in Office 2000 in einigen Fällen aufgeweicht worden. Mit VBA können nun in zwei abgegrenzten Fällen COM-DLLs erstellt werden: zum einen bei der Erstellung von COM-Add-Ins, zum anderen bei der Erstellung von so genannten Datenumgebungen.»Light«- Version 3.1.2 Visual Basic Script (VBS) Visual Basic Script ist eine»light«-version von Visual Basic. Bewusstes Entwicklungsziel war es, eine einfache und speicherschonende Interpretersprache zu schaffen. Microsoft nennt Visual Basic Script in Dokumentationen auch häufig Visual Basic Scripting Edition. Gebräuchliche Abkürzungen sind VBScript und VBS. Die Kernunterschiede zu VB 6.0 und VBA sind: eingeschränkte Fehlerbehandlung keine Datentypen (daher keine Typisierung) 148

keine direkten Aufrufe von durch DLLs exportierten Funktionen (»API-Calls«) lediglich Unterstützung des späten Bindens via IDispatch bei der Nutzung von COM- Komponenten weniger eingebaute Funktionen Allerdings gibt es wie die Abbildung 3.1 darstellt auch einige Befehle in VBScript, die in anderen Dialekten von VB noch nicht auftreten. Dies sind insbesondere die Schlüsselwörter Execute, Eval, ExecuteGlobal und Class. Zusätzliche Features Der erste Einsatzort von Visual Basic Script war der Microsoft Internet Explorer 3.0 als Microsofts Antwort auf das von Netscape entwickelte JavaScript. Dabei sollte VBScript schon damals zwei Aufgabengebiete abdecken: die Herstellung der Verbindung verschiedener ActiveX-Steuerelemente in Webseiten und die Erledigung kleinerer dynamischer Aufgaben innerhalb des Browsers. Naheliegend war das nächste Einsatzgebiet der Webserver innerhalb der Active Server Pages (ASP). Microsoft erkannte aber bald, dass VBScript mehr Potenzial bietet. Die Darstellung in diesem Buch basiert auf der Version 5.6, die sich von Version 5.1 nur um Erweiterungen bei der mitgelieferten Komponente RegExp zur Verarbeitung von regulären Ausdrücken unterscheidet. Die Version 5.6 ist vom Funktionsumfang her identisch zur Version 5.5. VBScript-Version Ausgeliefert mit 1.0 Internet Explorer 3.0 2.0 Internet Information Server 3.0 3.0 Internet Explorer 4.0 Internet Information Server 4.0 Windows Scripting Host 1.0 Outlook 98 4.0 Visual Studio 6.0 5.0 Internet Explorer 5.0 5.1 Windows 2000 5.5 Separates Add-on, siehe [MSS00] 5.6 Windows.XP (»Whistler«) Windows.NET Server Internet Explorer 6.0 Teil des WSH 5.6-Add-ons für Windows NT4/98/ME/2000, siehe [MSS00] Einsatzgebiete Tabelle 3.1: Auslieferung verschiedener VBS-Versionen 149

Eingebaute Versionskonstanten Ermittlung der Sprachversion Mit den folgenden Codezeilen können Sie innerhalb eines Skripts die Versionsnummer von VBScript ermitteln. VBScript stellt dazu vier eingebaute Konstanten bereit. Diese sind in anderen VB-Dialekten allerdings nicht verfügbar. MsgBox "Dies ist die Sprache " & ScriptEngine _ & " Version " & ScriptEngineMajorVersion & _ "." & ScriptEngineMinorVersion & "." & _ ScriptEngineBuildVersion Listing 3.3: Ermittlung der VBS-Version [_Sprachversion.vbs] evb.net 3.1.3 Embedded Visual Basic (evb) Embedded Visual Basic ist ein Visual Basic-Dialekt zur Entwicklung von Anwendungen für Windows CE. Die Sprache embedded Visual Basic hat Microsoft mit der Version 3.0 sterben lassen und empfiehlt die Migration auf Visual Basic.NET, das auch für das.net Compact Framework für Windows CE/Pocket PC 2002 verfügbar ist. 3.1.4 Visual Basic.NET Im Zuge von Visual Basic.NET (VB.NET) fusioniert Microsoft die drei Geschwister Visual Basic 6.0, Visual Basic for Applications (VBA) und VBScript zu einer Sprache. VB.NET wird in Kapitel 7 behandelt. 3.1.5 Anwendungsgebiete Die Abbildung 3.2 auf Seite 151 zeigt die Anwendungsgebiete der verschiedenen Visual Basic-Dialekte. 3.2 Grundlagen Dieses Kapitel beschäftigt sich mit grundlegenden Syntaxregeln und dem Aufbau von Programmen in den verschiedenen VB-Dialekten. Grundregeln 3.2.1 Grundlegendes zur Syntax Zu Beginn die wichtigsten Regeln zur Visual Basic-Syntax im Überblick: Grundsätzlich enthält jede Zeile genau einen Befehl. Es ist möglich, mehrere Befehle getrennt durch einen Doppelpunkt in eine Zeile zu schreiben. Von dieser Möglichkeit sollten Sie aber aus Gründen der Übersichtlichkeit keinen Gebrauch machen. Wenn Befehle sich über mehr als eine Zeile erstrecken sollen, müssen alle Zeilen mit nicht abgeschlossenen Befehlen mit einem Unterstrich»_«enden. 150

Grundlagen Leerzeilen, Leerzeichen und Tabulatoren werden ignoriert. Visual Basic ist nicht case-sensitive: Die Groß- und Kleinschreibung der Schlüsselwörter ist also ebenso ohne Bedeutung wie die Schreibweise Ihrer selbstgewählten Bezeichner für Variablen, Unterroutinen, etc. Für Bezeichner gibt es folgende Regeln: Sie müssen mit einem Buchstaben beginnen. Sie dürfen nicht länger als 255 Zeichen sein. Sie dürfen nicht mit Schlüsselwörtern der Sprache identisch sein. Sie dürfen außer dem Unterstrich keine Satz- oder Sonderzeichen enthalten. Kommentarzeilen werden mit einem Hochkomma (') eingeleitet. Alternativ können Sie als Markierung für Kommentare das Schlüsselwort REM verwenden.!"#$ ) *!"#$!"#$ Bezeichner Kommentare Abbildung 3.2: Anwendungsgebiete der verschiedenen Visual Basic- Dialekte #$ " +, )+*,-,- %&& '(& & 151

Module und Projekte Skripte In Zusammenhang mit VBS sind die Begriffe Modul und Projekt nicht gebräuchlich. Vielmehr spricht man von Skripten. Ein Skript entspricht in etwa einem Modul. Die Anordnung und Speicherung der Skripte ist stark vom Scripting Host abhängig: In einigen Fällen sind die Skripte in eigenständigen Dateien abgelegt (z.b. beim Windows Scripting Host), in anderen Fällen sind sie nur Mitbewohner in anderen Dateien (z.b. ASP, DHTML). In einigen Umgebungen können Skripte andere Skripte einbinden, um Skriptcode wiederzuverwenden. Programmstart 3.2.2 Speicherung des Programmcodes In VB6/VBA wird Visual Basic Code in Modulen (bzw. Forms und Klassenmodulen) angeordnet, wobei jedes Modul entweder in einer eigenen Datei (VB6) gespeichert wird oder alle Module in einer Dokumentdatei (VBA). Bei VB6 gibt es zusätzlich eine Projektdatei, die die Information enthält, welche Moduldateien zum Projekt gehören. In VBA hält die Dokumentendatei die einzelnen Moduldateien zusammen. 3.2.3 Startpunkt eines Programms Die verschiedenen VB-Dialekte unterscheiden sich auch darin, wo ein Programm startet: In VB6/VBA muss jede Zeile Programmcode Teil einer Unterroutine sein. Beim Aufruf des Programms in VB6 wird die Ausführung mit der Unterroutine begonnen, die Sub Main() heißt. Alternativ dazu kann die Ausführung in VB6 auch mit dem Start eines Formulars beginnen. In VBA ist die Ausführung komplett ereignisbasiert. Sie beginnt mit der Ereignisbehandlungsroutine, deren Ereignis zuerst getriggert wird. Manuell kann jede beliebige Unterroutine gestartet werden. In VBS kann es Programmcode geben, der nicht Teil einer Unterroutine ist. In Abhängigkeit vom Scripting Host gibt es zwei Möglichkeiten zum Start: Üblicherweise beginnt die Ausführung bei der ersten Programmzeile, die nicht Teil einer Unterroutine ist. Einige Scripting Hosts arbeiten jedoch ausschließlich ereignisgesteuert und starten das Skript mit einer bestimmten Ereignisbehandlungsroutine. 3.3 Einfache Ein- und Ausgabefunktionen Hello World Wenn man sich neu mit einer Programmiersprache beschäftigt, dann interessieren zunächst nicht die mächtigen Sprachkonstrukte, sondern eine ganz einfache Funktion: Wie kann ich eine Ausgabe machen? Das erste Programm heißt dann traditionell»hello World«und steht daher auch hier am Anfang. Nach der Erläuterung der Funktion MsgBox() folgt die Beschreibung der Funktion InputBox(). 152

Einfache Ein- und Ausgabefunktionen Bitte beachten Sie, dass nicht alle Scripting Hosts die Ausführung von MsgBox() und InputBox() zulassen: Serverseitige Skripte, die unbeaufsichtigt laufen, sollten keine Dialogboxen ausgeben und auf keinen Fall modale Dialogboxen, die darauf warten, dass ein nicht vorhandener Benutzer sie wegklickt. Es gibt auch serverseitige Scripting Hosts (z.b. SQL7 Server Agent Job Scripting), die bei Verwendung von MsgBox() und InputBox() leider nicht protestieren. Sie laufen leicht in die Falle, dass Ihr Skript»hängt«, weil niemand die Dialogbox beenden kann. MsgBox() und InputBox() werden in den folgenden Beispielen zur Vorstellung der einzelnen Sprachkonstrukte immer wieder gute Dienste leisten. 3.3.1 Ausgaben mit MsgBox() Die einfachste Ausgabeprozedur, die in allen Visual Basic-Dialekten zur Verfügung steht, heißt MsgBox(). MsgBox "Hello World" Listing 3.4: Ihr erstes VB-Programm MsgBox() Die Ausgabe erfolgt in einer einfachen Dialogbox. MsgBox() hat weitere Parameter, mit denen das Aussehen der Ausgabe beeinflusst werden kann. MsgBox text[,buttons][,titel] Erforderlich ist nur der eigentliche Dialogboxtext. Mit Hilfe des Parameters Buttons können die darzustellenden Schaltflächen und das die Dialogbox zierende Symbol festgelegt werden. Für Buttons kann ein Wert angegeben werden, der sich aus der Addition von mehreren Werten aus Tabelle 3.2 und Tabelle 3.3 ergibt. Zusätzlich kann die Konstante 4096 (vbsystem Modal) hinzuaddiert werden. Dadurch steht das Meldungsfenster immer im Vordergrund. Wert Symbolische Konstante Bedeutung 0 vbokonly <OK> 1 vbokcancel <OK> + <Abbrechen> 2 vbabortretryignore <Beenden> + <Wiederholen> + <Ignorieren> 3 vbyesnocancel <Ja> + <Nein> + <Abbrechen> 4 vbyesno <Ja> + <Nein> 5 vbretrycancel <Wiederholen> + <Abbrechen> Wert Konstante Symbol 16 vbcritical rotes Kreuz 32 vbquestion Fragezeichen 48 vbexclamation Ausrufezeichen in gelbem Dreieck 64 vbinformation Normales Ausrufezeichen Buttons Tabelle 3.2: Konstanten für MsgBox()- Buttons Tabelle 3.3: Konstanten für die MsgBox()- Icons 153

Sprache Rückgabewerte Tabelle 3.4: Konstanten für die MsgBox()- Rückgabewerte Die Sprache, in der die Schaltflächen beschriftet werden, hängt immer von der Sprachversion des Betriebssystems ab. So werden Sie auf einem englischen Betriebssystem immer»cancel«statt»abbrechen«lesen müssen, auch wenn Sie einen deutschen Text ausgeben wollen. Wenn MsgBox() mit mehr als nur einer Schaltfläche dargestellt wurde, interessiert es natürlich, welche Schaltfläche der Anwender gewählt hat. Dafür steht MsgBox() auch noch in einer Variante als Funktion mit Rückgabewert zur Verfügung. antwort = MsgBox(text[,buttons][,titel]) Bitte beachten Sie dabei die Verwendung der Klammern im Gegensatz zu der Verwendung von MsgBox() ohne Rückgabewert. Diese Spitzfindigkeit wird in Kapitel 0 näher erläutert. Es gibt für jeden der sieben Schaltflächen-Typen einen Rückgabewert (siehe folgende Tabelle). Wert Konstante Gedrückter Button 1 vbok OK 2 vbcancel Abbrechen 3 vbabort Beenden 4 vbretry Wiederholen 5 vbignore Ignorieren 6 vbyes Ja 7 vbno Nein»Hello World«in einer verbesserten Version könnte dann folgendermaßen aussehen: antwort = MsgBox("Macht Ihnen das Lesen dieses Buches Spaß?",_ vbyesno + vbquestion, "Hallo Leser") MsgBox "Die Antwort war: " & antwort Listing 3.5:»Hello World«mit Antwort InputBox() 3.3.2 Eingaben mit InputBox() empfangen Wenn das Klicken auf einen von sieben verschiedenen Buttons als Antwort des Benutzers nicht reicht, können Sie auf die eingebaute InputBox()-Funktion zurückgreifen und erhalten eine Dialogbox mit Eingabezeile. antwort = InputBox(text[,titel][,vorgabewert]) Pflicht ist die Angabe des Fragetextes. Optional sind Dialogboxtitel und Vorgabewerte für die Eingabezeile. antwort = InputBox("Wie heißen Sie?", _ "Wichtige Frage", "Holger Schwichtenberg") MsgBox "Sie heißen " & antwort Listing 3.6: InputBox mit Vorgabewert [hello_world_3.vbs] 154

Variablen Abbildung 3.3: InputBox mit Vorgabewert 3.4 Variablen Variablennamen unterliegen den erwähnten Regeln für Bezeichner. Es ist in keinem der VB- Dialekte Pflicht, Variablen zu deklarieren. Im Standardmodus ist die Deklaration optional. Sie erfolgt mit dem Schlüsselwort DIM, gefolgt vom Namen der Variablen. Weitere Variablen können durch Kommata abgetrennt werden. DIM a DIM name,vorname,strasse,ort Jedoch kann der Programmierer sich selbst die Pflicht auferlegen, alle Variablen deklarieren zu müssen. Dazu dient die Anweisung Option Explicit, die zu Beginn eines jeden Code- Moduls bzw. Skripts stehen muss. Nach einem Option Explicit führt jeder Zugriff auf eine nicht deklarierte Variable zu einem Fehler. Option Explicit Dim a Dim b a = 1 b = 2 ' Fehler: c nicht deklariert! c = b + a Listing 3.7: Verwendung von Option Explicit [explicitdemo.vbs] Variablen Option Explicit Ohne die Verwendung von Option Explicit kann es leicht zu schweren Fehlern kommen. Im folgenden Beispiel führt ein Tippfehler (vergessenes t bei start) dazu, dass VB 1000 minus 0 statt 1000 minus 500 errechnet. start = 500 Hier fehlt ein "t". ende = 1000 dauer = ende sart MsgBox ende & " " & start & " = " & dauer Listing 3.8: Ein Tippfehler kann schwere Folgen haben. 3.4.1 Gültigkeitsbereich von Variablen Visual Basic kennt drei unterschiedliche Gültigkeitsbereiche (engl. Scope) von Variablen: Lokale (prozedurweite) Variablen gelten nur in einer Unterroutine. Modul-globale (modulweite) Variablen gelten in allen Unterroutinen eines Moduls. Globale (programmweite) Variablen gelten in allen Modulen eines Projekts. Scope 155

Dies ist die Sichtweise von VB6/VBA. In VBS laufen die Uhren wie so oft etwas anders: Überlappung von Variablendeklarationen Public und Private Da VBS keine Module kennt, sind alle globalen Variablen auch programmweite Variablen. Da in VBS Programmcode außerhalb von Unterroutinen existieren darf, besitzt das Hauptprogramm keine eigenen lokalen Variablen. Alle lokalen Variablen des Hauptprogramms sind globale Variablen. Für alle VB-Dialekte gilt jedoch, dass lokale Variablen in Unterroutinen den gleichen Namen haben dürfen wie globale Variablen oder lokale Variablen in anderen Unterroutinen. Lokale Variablen überlagern globale Variablen, ohne diese zu beschädigen. Wenn also eine globale Variable x existiert und in einer Unterroutine eine lokale Variable x deklariert wird, so ist das globale x von dem lokalen x verdeckt. Jeder Zugriff auf x ist ein lokaler Zugriff. Nach dem Verlassen der Routine hat das globale x den gleichen Wert wie vorher. Visual Basic Script kennt ebenso wie die anderen VB-Dialekte die Einschränkung des Gültigkeitsbereichs mit den Schlüsselwörtern Private und Public. Dabei treten diese Schlüsselwörter an die Stelle des Dim. Allerdings hat die Einschränkung auf Private in den meisten Scripting Hosts keine Bedeutung, da es in der Regel nur ein Skript in einer Datei gibt. Innerhalb eines Skripts sind ebenso wie in VB6/VBA innerhalb eines Moduls alle Variablen öffentlich. Ungarische Notation Tabelle 3.5: Vorschläge für Variablennamen gemäß ungarischer Notation 3.4.2 Benennung von Variablen Gemäß der ungarischen Notation gibt es in Visual Basic einen Vorschlag zur Benennung von Variablen anhand des Datentyps. Dabei steht jeweils zu Beginn des Variablennamens in Kleinschrift ein dreibuchstabiges Präfix. (Unter-)Typ Präfix Beispiel Boolean bln blnaktiviert Byte byt bytalter Date dtm dtmgeburtstag Double dbl dblumsatz Integer int inteinwohnerzahl Long lng lngeinwohnerzahl Single sng sngumsatz String str strbuchtitel Object obj objbenutzer 156

Datentypen 3.5 Datentypen Ein wichtiges Kriterium für eine Programmiersprache ist der Grad der Typisierung. Er gibt an, inwieweit eine Variable an einen Datentyp gebunden wird und wie streng der Compiler oder Interpreter der Sprache es mit Zuweisungen an solche Variablen hält, die nicht dem zugewiesenen Datentyp entsprechen. 3.5.1 Datentypen in VBS Visual Basic Script ist eine sehr schwach typisierte Sprache: Es gibt in VBScript nur einen Datentyp mit Namen Variant, der alle möglichen Arten von Daten aufnehmen kann. Ein und dieselbe Variable kann während des Programmablaufs Daten unterschiedlichen Typs speichern. Je nach dem aktuellen Inhalt wird die Variable jedoch einem von zwölf so genannten Subtypen zugeordnet. (Unter-)Typ Beschreibung Symbolische Typkonstante TypID Boolean Wahrheitswert; True oder False vbboolean 11 Byte Ganzzahl (8 Bit); 0 bis 255 vbbyte 17 Integer Ganzzahl (16 Bit); 32.768 bis 32.767 vbinteger 2 Currency Fließkommazahl; vbcurrency 3 922.337.203.685.477,5808 bis 922.337.203.685.477,5807 Long Ganzzahl (32 Bit); 2.147.483.648 bis vblong 4 2.147.483.647 Single Fließkommazahl; 3,402823E38 bis vbsingle 5 1,401298E 45 für negative Werte und von 1,401298E 45 bis 3,402823E38 für positive Werte Double Fließkommazahl; vbdouble 6 1,79769313486232E308 bis 4,94065645841247E 324 für negative Werte und von 4,94065645841247E 324 bis 1.79769313486232E308 für positive Werte Date Datums und Uhrzeitangaben; Speicherung vbdate 7 in Form einer Fließkommazahl, die die Anzahl der Tage relativ zum 31.12.1899 angibt. Durch negative Werte können auch Daten vor diesem Bezugspunkt angegeben werden. String Zeichenfolge mit variabler Länge vbstring 8 Object Zeiger auf ein Objekt (siehe Kapitel 0) vbobject 9 Variant Kann einen beliebigen Wert aufnehmen vbvariant 12 Typisierungsgrad Schwache Typisierung in VBS Tabelle 3.6: Datentypen in VB6/VBA bzw. Subtypen in VBS 157

Typinformationen Informationen über den aktuellen Subtyp Mit den Funktionen TypeName(varname) und VarType(varname) kann ermittelt werden, welchen Subtyp eine Variable oder ein Wert aktuell hat. Während TypeName() den Namen des Datentyps als String liefert, gibt VarType() eine Typkonstante (vgl. Tabelle 3.6) zurück. x = 2000 MsgBox typename(x) & "," & VarType(x) ' liefert Integer, 2 x = "Holger Schwichtenberg" MsgBox typename(x) & "," & VarType(x) ' liefert String, 8 x = #8/1/1972# MsgBox typename(x) & "," & VarType(x) ' liefert Date, 7 MsgBox typename("1.8.72") ' liefert String MsgBox typename(1234.56) ' liefert Double Listing 3.9: Ermittlung des Datentyps einer Variablen [Datentypen1.vbs] Für einzelne Datentypen kann auch mit Hilfe spezieller Funktionen direkt geprüft werden, ob eine Variable einen bestimmten Wertetyp enthält: isnumeric(varname) isdate(varname) Starke Typisierung in VB6/ VBA Typkonvertierung Schlüsselwort»As«3.5.2 Datentypen in VB6/VBA Einer der wesentlichen Unterschiede von VB6/VBA zu VBS ist die Möglichkeit, Variablen explizit einem Datentyp zuzuweisen. Damit kann der Programmierer eine strenge (obschon im Vergleich zu anderen Sprachen wie C/C++ und Java immer noch lockere) Form der Typisierung erreichen. Wenn einer Variablen ein Typ zugewiesen wurde, dann kann diese Variable innerhalb ihres Gültigkeitszeitraums nur Werte des vorgegebenen Typs aufnehmen. Eine Missachtung führt zu einem Laufzeitfehler. Allerdings wird bei der Zuweisung von Variablen bzw. Werten unterschiedlichen Typs keine Fehlermeldung generiert, sondern eine automatische Typkonvertierung durchgeführt. Eine Typangabe erfolgt mit dem Schlüsselwort As im Rahmen einer Variablendeklaration. Da VBS keine Typisierung kennt, führt jegliche Verwendung des Schlüsselwortes As in VBS zu einem Fehler! Dim s As String Dim x As Integer Dim z As Long Dim c As Currency Wählbarer Typisierungsgrad In VB6/VBA gibt es aber auch den Datentyp Variant, der genauso flexibel ist wie Variant aus VBS. Die strengere Typisierung ist eine Option in VB6/VBA, von der viele Entwickler gerne Gebrauch machen, um den Programmcode übersichtlicher und robuster zu gestalten. In VB6/VBA gibt es drei Möglichkeiten, eine Variable vom Typ Variant zu erhalten: 158

Datentypen Die Variable wird gar nicht deklariert. Die Variable wird nur mit DIM varname deklariert. Die Variable wird mit DIM varname As Variant deklariert. Eine beliebte Falle bei VB-Anfängern ist die Deklaration von mehreren Variablen in einer Zeile. Dabei muss zu jeder Variablen der Datentyp einzeln angegeben werden! ' In dieser Zeile sind a und b Variants! Dim a, b, c As Integer ' Nur so sind alle drei Integer! Dim a As Integer, b As Integer, c As Integer Definition eigener Datentypen Eigene, zusammengesetzte Datentypen (in anderen Sprachen»Strukturen«genannt) können in VBA und VB6 mit Type...End Type definiert werden. Diese Möglichkeit gibt es in VBS nicht, da dafür eine stärkere Typisierung der Sprache notwendig ist. Type Person Name As String Geb As Date Kinderanzahl As Byte Verheiratet As Boolean End Type Type ' === Nutzung eines eigenen Datentyps Sub EigenerTyp() Dim HS As Person HS.Name = "Holger Schwichtenberg" HS.Geb = #8/1/1972# HS.Kinderanzahl = 0 HS.Verheiratet = False MsgBox HS.Name & Chr(13) & _ "ist am " & HS.Geb & " geboren," & Chr(13) & _ "ist " & IIf(Not HS.Verheiratet, "nicht ", "") & _ "verheiratet " & Chr(13) & _ "und hat " & HS.Kinderanzahl & " Kinder!" End Sub Listing 3.10: Definition und Nutzung eines eigenen Datentyps Abbildung 3.4: Ausgabe des obigen Beispiels 159

Zusammengesetzte Typen können wie jeder elementare Datentyp zum Aufbau von Arrays oder zur Übergabe an Unterroutinen verwendet werden. Den Unterschied zwischen einem Typ und einer Klasse (Klassen werden in Kapitel 0 behandelt) zeigt die folgende Tabelle. Tabelle 3.7: Typ versus Klasse Eigenschaft Typ Klasse Öffentliche Mitglieder Ja Ja Private Mitglieder Nein Ja Methoden Nein Ja Ereignisse Nein Ja Instanziierung Wie elementarer Datentyp Mit New-Operator Möglich in VBS Nein Ja Möglich in VB6 Ja Ja Möglich in VBA Ja Ja Startwerte Empty 3.5.3 Startwerte von Variablen Visual Basic belegt Variablen automatisch mit einem Startwert. Eine typisierte Variable hat zu Beginn den jeweiligen Grundwert des Typs (0, Leerstring oder 00:00:00). Für Variant-Variablen kennt VB einen besonderen Startzustand: Empty. Empty bedeutet, dass eine Variant-Variable noch nicht mit einem Wert belegt wurde. Ob eine Variant-Variable bereits belegt wurde, kann mit isempty (variablenname) überprüft werden. Der Zustand Empty kann einer Variant-Variablen aber auch nach Gebrauch wieder explizit zugewiesen werden. Eine Variable im Zustand Empty, die in einem Ausdruck verwendet wird, nimmt dort den Wert 0 oder Leerstring an, jeweils passend zu dem Ausdruck. MsgBox typename(x) ' liefert Empty If IsEmpty(y) Then MsgBox "y ist Empty!" MsgBox x ' liefert Leerstring MsgBox x + 5 ' liefert 5 If x = 0 Then MsgBox "x ist 0" ' liefert 5 If x = "" Then MsgBox "x ist Leerstring" ' liefert 5 x = 5 ' liefert Integer MsgBox typename(x) x = Empty MsgBox typename(x) ' liefert Empty Listing 3.11: Beispiel für den Wert Empty [datentypen2.vbs] 160

Darstellung von Werten 3.6 Darstellung von Werten Statische Werte können in Visual Basic in zwei Formen vorkommen: Als Literale, also als direkte Angabe von Werten innerhalb eines Ausdrucks Literale und symbolische Konstanten Beispiel: MsgBox "Sie heißen:" & Name Hier ist die Zeichenkette»Sie heißen:«ein Literal. Als symbolische Konstanten, die Literale repräsentieren Beispiel: Const AUSGABE = "Sie heißen: " MsgBox AUSGABE & Name. Hier ist AUSGABE eine symbolische Konstante für das Literal»Sie heißen: «. 3.6.1 Literale Literale sind alle statischen Werte, die direkt im Programmcode hinterlegt, also nicht in Variablen oder symbolischen Konstanten (siehe nächstes Kapitel) gespeichert sind. In Visual Basic werden Literale wie folgt dargestellt: Ganzzahlige numerische Werte werden einfach durch die Aneinanderreihung von Ziffern dargestellt. Bei Fließkommazahlen (nicht-ganzzahlige numerische Werte) wird das Dezimaltrennzeichen nicht durch ein Komma dargestellt, sondern amerikanisch durch einen Punkt. Hexadezimalzahlen werden durch ein vorangestelltes &h, Oktalzahlen durch ein &o kenntlich gemacht. Begrenzer für Zeichenketten ist das doppelte Anführungszeichen. Zeichenketten innerhalb von Zeichenketten können durch zweifache doppelte Anführungszeichen dargestellt werden. Zahlen Andere Zahlensysteme Strings MsgBox "Hallo" Execute "MsgBox ""Hallo""" Manche Umgebungen (z.b. HTML) und Komponenten (z.b. WMI) erlauben auch einfache Anführungszeichen als Alternative zu den unübersichtlichen zweifachen doppelten Anführungszeichen. Der Sonderzustand»Variable ist leer«wird durch das Wort Empty angezeigt, der Sonderzustand»Variable hat keinen gültigen Wert«durch das Wort Null. Null kann ebenso wie Empty nur Variant-Variablen zugewiesen werden. Zur Überprüfung auf diese Werte sollte nicht das Gleichheitszeichen verwendet werden, sondern die eingebauten Funktionen isnull() und isempty(). Sofern eine Variant-Variable die Werte Empty oder Null enthält, werden als Typen»Empty«(vbEmpty = 0) oder»null«(vbnull = 1) zurückgeliefert. Empty und Null 161

Datum und Uhrzeit Datums- und Uhrzeitangaben werden mit dem Nummer-Zeichen (#) begrenzt und sind im amerikanischen Stil anzugeben (siehe Tabelle 3.8). True und False Boolsche Werte (also die Wahrheitswerte wahr und falsch) werden durch die Konstanten True und False repräsentiert. Aber Achtung: Die Konstante True steht nicht wie man vermuten könnte für den Wert 1, sondern für -1. Zum Glück ist False wenigstens 0. 0 und -1 können alternativ zu den Konstanten True und False verwendet werden. Währungsangaben VB sieht auch explizit einen Wertetyp für Währungen vor, die sich nach der jeweiligen Ländereinstellung des Systems richten. In Deutschland besteht ein gültiger Währungstyp aus einer Fließkommazahl mit nachgestelltem Währungssymbol DM. Dabei ist das Dezimaltrennzeichen ein Komma und zusätzlich ist als Tausendertrennzeichen ein Punkt erlaubt. Das Ganze wird wie ein String in Hochkommata gesetzt. Auf Grund der Abhängigkeit von den Systemeinstellungen sollten Sie den Datentyp Currency (Währung) nicht verwenden. Sie können auch intern mit Fließkommazahlen arbeiten und dann für die Ausgabe das Währungssymbol anhängen bzw. eine der eingebauten Formatierungsfunktionen von VB nutzen. Tabelle 3.8: Darstellung von Literalen in VB Wertetyp Beispiel Ganzzahlige Zahl 1234 Fließkommazahl 1234.5678 Hexadezimalzahl &h0ae1 (entspricht 2785) Oktalzahl &o77 (entspricht 63) Zeichenkette (String) "Holger Schwichtenberg" Datum und/oder Uhrzeit #8/1/1972# #2:30:00 PM# #12/30/1999 1:20:00 AM# Wahrheitswerte True, False, -1, 0 Währung "22345,80 DM" Sonderzustände Null, Empty Const 3.6.2 Symbolische Konstanten Literale, die in einem Programm mehrfach vorkommen, sollten in Form von symbolischen Konstanten (auch benannte Konstanten genannt) definiert werden, so dass man sie an einem zentralen Ort ändern kann. Dazu dient in allen VB-Dialekten das Schlüsselwort const. Const KonstantenName = Wert Danach kann eine Konstante wie eine Variable verwendet werden, aber nur lesend. Eine Veränderung ist nicht gestattet. In VB6/VBA kann in der Konstantendefinition als Wert auch ein Ausdruck angegeben werden. VBS unterstützt nur Literale. 162

Darstellung von Werten Symbolische Konstanten sollten Sie immer dann anwenden, wenn Werte entweder wiederholt verwendet werden oder aber die Werte besonders lang sind. Sie erhöhen mit symbolischen Konstanten die Verständlichkeit und Wartbarkeit Ihrer Skripte. Mit der gleichzeitigen Erzwingung der Variablendeklaration mit Option Explicit vermeiden Sie Fehler, da falsch geschriebene symbolische Konstanten dem Sprachinterpreter auffallen Literale werden dagegen nicht überprüft. Enum VB6/VBA unterstützen die Definition von Konstantenlisten (Enumerationen). Dazu dient das Schlüsselwort Enum. Enum definiert eine Konstantenliste mit n Konstanten. Das Schlüsselwort wird in VBScript nicht unterstützt. [Public Private] Enum LISTENNAME NAME [= WERT] NAME [= WERT]... End Enum Die Angabe eines Wertes für die einzelnen Konstanten ist optional. Ohne diese Angabe werden die Konstanten automatisch mit fortlaufenden Zahlen belegt, wobei die erste Zahl 0 ist. Das erste Beispiel zeigt die Definition einer Konstantenliste mit expliziten Werten. Enum MitarbeiterTypen Professor = 3 Wissenschaftlicher Mitarbeiter = 2 StudentischeHilfskraft = 1 Sonstiger = 0 End Enum Erlaubt sind nur Werte vom Typ Long, keine Zeichenketten oder Datumsangaben. Im zweiten Beispiel werden keine Werte explizit genannt. Gelb erhält daher den Wert 0, schwarz den Wert 3. Enum GrundFarben gelb rot gruen schwarz End Enum Beide Formen können gemischt werden. Visual Basic zählt nach einer expliziten Wertzuweisung von dem Wert aus weiter hoch. Grau ist also 0, rosa 101 und orange 102. Enum AndereFarben grau lila = 100 rosa orange End Enum Konstantenlisten Beispiel 1 Beispiel 2 Beispiel 3 163

Verwendung Die folgende VB6-Unterroutine zeigt die Anwendung der Konstantenlisten: Die Konstantenliste ist ein Datentyp, der zur Deklaration von Variablen verwendet werden kann. Die einzelnen Konstanten der Konstantenliste können an beliebiger Stelle verwendet werden. Den mit dem Namen einer Konstantenliste typisierten Variablen kann auch direkt eine Zahl zugewiesen werden, auch eine Zahl, die nicht in der Konstantenliste vorkommt. Sub teste_enum() Dim diesermitarbeiter As MitarbeiterTypen ' --- Zuweisung mit Konstantennamen diesermitarbeiter = Professor ' --- Zuweisung mit Wert diesermitarbeiter = 3 ' --- Zuweisung mit Wert ' außerhalb der Konstantenliste diesermitarbeiter = 9 ' --- Verwendung If diesermitarbeiter <> StudentischeHilfskraft Then_ MsgBox "Keine studentische Hilfskraft!" Führt nicht zum Fehler! MsgBox gruen ' ergibt 2 MsgBox orange ' ergibt 102 End Sub Listing 3.12: Verwendung von mit»enum«definierten Konstantenlisten [modenum.bas] Vordefinierte Konstanten Vordefinierte Konstanten Alle VB-Dialekte kennen eine Reihe von vordefinierten symbolischen Konstanten, beispielsweise die Konstanten für die MsgBox()-Funktion (vgl. Kapitel 3.3) oder die Datentypkonstanten (vgl. Tabelle 3.4). Auf diese Konstanten kann ohne weitere Definition zugegriffen werden. Je nach Umgebung gibt es verschiedene Möglichkeiten, weitere Konstanten verfügbar zu machen: Immer besteht die Möglichkeit, Konstantendefinitionen mit dem Schlüsselwort const in den Quelltext zu übernehmen. Scripting Hosts ermöglichen die Einbindung externer Quellcode-Dateien, die Konstantendefinitionen enthalten können. Gegenüber der ersten Möglichkeit entfällt die Doppelspeicherung der Konstantendefinitionen. Entwicklungsumgebungen wie die von VB6/VBA, aber auch bereits einige Scripting Hosts (z.b. WSH ab Version 2.0) gestatten die Einbindung von Typbibliotheken. Dadurch stehen die dort in Konstantenlisten definierten symbolischen Konstanten zur Verfügung. 164

Operatoren 3.7 Operatoren Die nachfolgende Tabelle zeigt die wichtigsten Visual Basic-Operatoren. Eine Erläuterung der Operatoren auf Objektvariablen finden Sie in Kapitel 0. Zweck VB-Dialekte Verfügbare Operatoren Wertzuweisung unter elementaren Datentypen Zuweisungen von Objektvariablen VBS/VBA/VB6 VBS/VBA/VB6 A = B oder Let A = B Set O1 = O2 Grundrechenarten alle + (Addition) - (Subtraktion) * (Multiplikation) / (Division) Potenzierung alle ^ Division ganzzahlig alle \ Divisionsrest alle mod Vergleich unter elementaren Datentypen Vergleich von Objektvariablen alle = < <= >= > <> alle O1 is O2 O1 is Nothing Logische Operatoren VBS/VBA/VB6 and or not xor eqv imp Bitweise Operatoren VBS/VBA/VB6 and or not xor Zeichenverkettung alle & (Zeichenverkettung ist auch mit dem Pluszeichen möglich, sollte aber nicht verwendet werden!) Rechenoperationen sind sowohl mit Währungs- als auch mit Datumsangaben möglich. Bei den Datumsangaben ist die Grundeinheit immer ein Tag. Um beispielsweise die Datumsangabe um eine Stunde zu erhöhen, müssen Sie 1/24 addieren. Die folgende Tabelle zeigt einige Beispiele. Für die Arbeit mit Datumsangaben gibt es jedoch auch einfachere Datums- /Uhrzeitfunktionen (siehe Anhang C). Operatoren Tabelle 3.9: Operatoren in VB Rechnen mit Datumsangaben 165

Tabelle 3.10: Berechnungen mit Datumsund Währungswerten Berechnung Ergebnis #5/1/2000 6:49:00 PM# + 1 02.05.00 18:49:00 #5/1/2000 6:49:00 PM# 1 / 24 01.05.00 17:49:00 #5/1/2000 6:49:00 PM# + (1 / 24 / 60) * 50 01.05.00 19:39:00 "1234,56 DM" 100 1134,56 "10,10 DM" * "20 DM" 202 Vollständige Auswertung In VBS/VB6/VBA wird jeder Teilausdruck in einem logischen Ausdruck ausgewertet, auch wenn das Ergebnis durch einen vorherigen Teilausdruck bereits feststeht. Die folgenden Code-Beispiele würden in VBS/VB6/VBA mit einem»division durch 0«-Fehler (Fehlernummer 11) abbrechen. Sub short_circuit_demo1() Dim a, b Führt zum "Division a = 1 durch 0"-Fehler. b = 0 If b = 0 Or a / b > 1 Then MsgBox "Bedingung erfüllt!" End Sub Listing 3.13: [short_circuit_demo1.wsf] Beispiel 2 Gleichheitszeichen Das zweite Beispiel zeigt dies mit einer AND-Verknüpfung. Hier werden unter VB6/VBA/ VBS beide Teilausdrücke ausgewertet, obwohl der erste (x <> 0) bereits falsch ist. Folge ist ein»division durch 0«-Fehler beim Ausdruck y / x > 0. Sub short_circuit_demo2() Dim x ' As Integer Dim y ' As Integer x = 0 y = 5 If (x <> 0) And y / x > 0 Then say ("Richtig!") Else say ("Falsch") End If End Sub Listing 3.14: [short_circuit_demo2.wsf] Führt zum "Division durch 0"-Fehler. Doppeldeutiges Gleichheitszeichen Das Gleichheitszeichen hat, wie in vielen anderen Sprachen auch, eine Doppelfunktion als Zuweisungs- und Vergleichsoperator. Einige Sprachen (z.b. C, C++, Java) trennen diese beiden Operatoren jedoch sauber, indem sie ein einfaches Gleichheitszeichen als Zuweisungsoperator und ein doppeltes Gleichheitszeichen (==) als Vergleichsoperator nutzen. 166

Typkonversion Zu den Aufgaben, die der Autor in seinen Schulungen am liebsten stellt, gehört das folgende Beispiel: Kleines Rätsel a = 5 b = 6 c = a = b MsgBox c Welcher Wert wird hier ausgegeben? Nun, für c wird der Wert False bzw. 0 ausgegeben. Überrascht? Hatten Sie vermutet, c wäre 6? Dass dies falsch ist, liegt daran, dass VB nur das erste Gleichheitszeichen einer Anweisung als Zuweisungsoperator interpretiert. Das zweite Gleichheitszeichen ist ein Vergleichsoperator. c wird also das Ergebnis des Vergleichs von a mit b zugewiesen. Da a und b verschiedene Werte haben, ist c also False. 3.8 Typkonversion Visual Basic besitzt eine implizite Datentypkonversion, die viele»unsaubere«anweisungen erlaubt, die in anderen Sprachen verpönt sind. Es ist unter VB-Programmierern an vielen Stellen jedoch Usus, die implizite Typkonversion zu nutzen, anstatt die Werte vorher mit einer der eingebauten Konvertierungsfunktionen umzuwandeln. Dim s, d, a s = "Holger Schwichtenberg" d = #8/1/1972# a = 28 ausgabe = s & " ist am " & d & _ " geboren und daher jetzt " & a & " Jahre alt!" MsgBox ausgabe Listing 3.15: Beispiel zur impliziten Typkonversion Die Verkettung von Stringvariablen, Zeichenkonstanten, Datumsangaben und Zahlen funktioniert problemlos. Dabei wäre es besser gewesen, die Konvertierung von Datums- und Zahlenwerten explizit mit der Funktion CStr() vorzunehmen: Implizite Typkonversion Explizite Typkonversion ausgabe = s & " ist am " & CStr(d) & _ " geboren und daher jetzt " & _ CStr(a) & " Jahre alt!" Listing 3.16: Beispiel zur expliziten Typkonversion [typkonv_1.vbs] Während das vorherige Beispiel ja vielleicht gerade noch hinnehmbar gewesen ist, werden sich jetzt bei allen erfahrenen Programmierern die Haare sträuben: Dim a As String Dim b As String Dim c As String a = 10 b = 20.33 "1020,33" c = a + b MsgBox c Listing 3.17: Unsauberes Programmieren in VB [typkonv_2.vbs] 167

Obwohl in dem Listing alle drei Variablen als String deklariert wurden, können Zahlen zugewiesen werden. Das Ergebnis ist dann aber nicht das, was der Programmierer sich wohl erhofft hat, denn das Pluszeichen addiert in diesem Fall nicht die Zahlen, sondern verbindet die Zeichenketten. Das Ergebnis ist also»1020,33«. Auf Grund der Tatsache, dass VBS keine Deklaration von Variablen mit einem bestimmten Datentyp kennt, würde das Beispiel dann so aussehen: Dim a Dim b Dim c a = 10 b = 20.33 "30,33" c = a + b MsgBox c Listing 3.18: Analog zum vorherigen Listing in VBS, aber mit anderem Ergebnis [typkonv_3.vbs] Hier ist das Ergebnis dann 30,33. Der Subtyp der Variablen a, b und c wird ja jeweils über die letzte Wertzuweisung festgelegt. Dabei erhielten alle Variablen einen Zahlentyp als Subtyp. Um hier die Stringverkettung zu erreichen, muss das kaufmännische Und (&) statt des Pluszeichens verwendet werden. Verwenden Sie nie das Pluszeichen zur Stringverkettung, wenn Sie zwei Variablen miteinander verketten wollen, bei denen Sie davon ausgehen, dass Strings enthalten sind. Wenn nämlich durch Zufall beide Variablen eine Zahl enthalten, wird Visual Basic addieren und nicht verketten! Explizite Typumwandlung Explizite Typumwandlung Die folgende Tabelle zeigt Funktionen zur expliziten Typumwandlung. In VB6/VBA gibt es darüber hinaus auch noch ältere Versionen der Konvertierfunktionen (Str(), Value(),...), die Sie aber nicht mehr verwenden sollten. Im Gegensatz zu CStr() fügt die ältere Funktion Str(), die in VB6/VBA verfügbar ist, immer noch ein führendes Leerzeichen hinzu. Tabelle 3.11: Funktionen zur Typumwandlung Ergebnistyp Boolean Byte Currency Date Single Double Integer Long String Funktion CBool() CByte() CCur() CDate() CSng() CDbl() CInt() CLng() CStr() 168

Arrays 3.9 Arrays Arrays sind Datenfelder in Form von Mengen von Variablen. Ein solches Datenfeld kann in VB bis zu 60 Dimensionen haben. Für jede Dimension kann jeweils eine Ausdehnung festgelegt werden. VB kennt zwei Formen von Arrays: statische Arrays, bei denen Dimensionen und deren Ausdehnung fest zur Entwicklungszeit vorgegeben werden dynamische Arrays, bei denen die Anzahl der Dimensionen und deren Ausdehnung zur Laufzeit verändert werden können Ein Array unterscheidet sich in VB von einer einfach skalaren Variablen durch an den Namen angehängte runde Klammern. Die runden Klammern enthalten den Index des Eintrags, auf den zugegriffen werden soll. a(5,10,8) bezeichnet zum Beispiel in einem dreidimensionalen Array das Feld mit den Koordinaten 5,10 und 8. Die Verwendung erfolgt analog zu normalen Variablen. a(5,10,8) = wert wert = a(5,10,8) Ein Array muss in allen VB-Dialekten, auch VBScript immer deklariert werden. d.h., Sie müssen die Variable mit Dim deklarieren. Wenn Sie auf eine nicht deklarierte Variable unter Angabe der runden Klammern zugreifen, erhalten Sie einen Fehler. Statische versus dynamische Arrays Wann und wie die Dimensionierung, d.h. die Festlegung der Anzahl der Dimensionen des Datenfeldes und die Ausdehnung jeder Dimension definiert wird, ist unterschiedlich zwischen dynamischen und statischen Arrays. Deklaration VBS VB6/VBA statisches Array dynamisches Array ohne Vorgabewerte dynamisches Array mit Vorgabewerten Dim arrayname (x,y,z,...) Dim arrayname() nicht unterstützt Dim arrayname ( [x1 to] x2, [y1 to] y2, [z1 to] z2,...) [As Datentyp] Dim arrayname() [As Datentyp] nicht unterstützt Tabelle 3.12: Array-Deklarationen in den VB-Dialekten 3.9.1 Statische Arrays Bei der Deklaration wird zumindest die Anzahl der Dimensionen und die Obergrenze für jede Dimension angegeben. Standarduntergrenze ist 0. Dim a(x) deklariert also ein Array von 0 bis x mit x+1 Feldern. Grenzen 169

In VB6/VBA kann jedoch optional die Untergrenze gesetzt und ein Datentyp angegeben werden: Dim Lottozahlen(1 to 7) As Byte In VBS ist 0 als untere Grenze jeder Dimension vorgegeben. VBS/VBA/VB6 ReDim ReDim Preserve 3.9.2 Dynamische Arrays Bei der Deklaration in VBS/VBA/VB6 werden weder die Anzahl der Dimensionen noch die Grenzen für jede Dimension angegeben. Dim arrayname() ' dynamisches Array Redimensionierung dynamischer Arrays Ein dynamisches Array kann mit dem Befehl ReDim zur Laufzeit dimensioniert werden: z.b.: ReDim d(10,10,10). Die Ausführung von ReDim auf einem statischen Array führt zu einem Fehler. ReDim kann auf ein und demselben Array mehrfach ausgeführt werden. Dabei können alle Eigenschaften (Dimensionen und deren Obergrenzen und außer in VBS auch deren Untergrenzen) verändert werden. In der Regel geht dabei jedoch der Inhalt des Arrays verloren. Mit dem Zusatz Preserve kann der Inhalt bewahrt werden, dann ist die Redimensionierung jedoch darauf beschränkt, die Obergrenze der letzten Dimension zu verändern. Mit ReDim Preserve können weder die Anzahl der Dimensionen noch die Grenzen anderer Dimensionen verändert werden. ' Dynamisches Array deklarieren Dim domains() ' Erste Dimensionierung ReDim domains(10, 10, 10) ' Wert setzen domains(1, 1, 1) = "www.it-visions.de" ' 1. Umdimensionierung ReDim Preserve domains(10, 10, 20) ' Wert ist noch da MsgBox domains(1, 1, 1) ' 2. Umdimensionierung ReDim domains(10, 20, 20) ' Wert ist weg MsgBox domains(1, 1, 1) Listing 3.19: Redimensionierung dynamischer Arrays in VBScript [array1.vbs] 3.9.3 Array-Operationen Dieses Kapitel behandelt die Verwendung von Arrays. 170

Arrays 3.9.3.1 Füllen eines Arrays Ein Array kann auf zwei Weisen gefüllt werden: elementweise (wie schon im vorherigen Kapitel dargestellt) durch die eingebaute Funktion Array(). Array() Array() erwartet als Parameter eine beliebig lange Liste von Werten und erzeugt daraus ein eindimensionales Array. Die Werte können Werte eines beliebigen elementaren Datentyps (Zahlen, Zeichenketten, Datumsangaben, Boolean) und auch Objektzeiger sein. Die Variable, die den Rückgabewert von Array() aufnimmt, muss in VBS als Variant deklariert sein. In VB6 und VBA kann die Variable auch als Array gekennzeichnet sein. Das Array muss aber ein dynamisches Array vom Typ Variant sein. ' ### Arrays füllen Sub array_fuellen() Dim domains1(6) Dim domains2 Dim domain Dim x As New Collection ' --- Elementweises Füllen domains1(0) = "www.it-visions.de" domains1(1) = "www.windows-scripting.de" domains1(2) = "www.it-objects.de" domains1(3) = "www.schwichtenberg.de" domains1(4) = "www.holgerschwichtenberg.de" domains1(5) = "www.net-komponenten.de" ' --- Array ausgeben For Each domain In domains1 MsgBox domain Next ' --- Füllen per Array-Funktion domains2 = Array("www.IT-Visions.de", _ "www.windows-scripting.de", "www.it-objects.de", _ "www.schwichtenberg.de", "www.holgerschwichtenberg.de", _ "www.net-komponenten.de") ' --- Array ausgeben For Each domain In domains2 MsgBox domain Next If IsArray(Domains1) Then MsgBox "Domains1 ist ein Array!" If IsArray(domains2) Then MsgBox "Domains2 ist ein Array!" End Sub Listing 3.20: [array_fuellen.wsf] 171

isarray() TypeName() und VarType() Kopieren 3.9.3.2 Typbestimmung Ob eine Variable ein Array enthält, kann mit der eingebauten Funktion isarray() geprüft werden. If IsArray(Domains1) Then MsgBox "Domains1 ist ein Array!" If IsArray(domains2) Then MsgBox "Domains2 ist ein Array!" Listing 3.21: Ausschnitt aus [array_fuellen.wsf] TypeName() und VarType() bei Arrays Sofern die übergebene Variable ein Array ist, hängt TypeName() an den Typnamen ein Klammernpaar»()«an. VarType() addiert den Wert 8192 hinzu. Dim z(10) MsgBox TypeName(z) ' liefert Variant() MsgBox VarType(z) ' liefert 8204 z(1) = "test" MsgBox TypeName(z(1)) ' liefert String() MsgBox VarType(z(1)) ' liefert 8 Dim y() As String ' nur in VB6/VBA! MsgBox TypeName(y) ' liefert String() MsgBox VarType(y) ' liefert 8200 (8192 + 8) Listing 3.22: Datentypen bei Arrays [datentypen3.vbs] 3.9.3.3 Wertzuweisungen Bei einer Zuweisung eines Arrays an ein anderes Array (oder eine Variant-Variable) mit dem Zuweisungsoperator (Gleichheitszeichen) wird das Array kopiert. Anders als bei Objekten wird also hier nicht ein Verweis kopiert, sondern tatsächlich die Inhalte. Dies beweist das folgende Beispiel, in dem nach dem Zuweisen des Arrays ein Element in der Kopie geändert wird. Dadurch bleibt das ursprüngliche Array unverändert. ' === Array kopieren Sub array_kopie() Dim domains1 Dim domains2 Dim domain domains1 = Array("www.IT-Visions.de", _ "www.windows-scripting.de", "www.it-objects.de", _ "www.schwichtenberg.de", "www.holgerschwichtenberg.de", _ "www.net-komponenten.de") ' --- Kopie erzeugen domains2 = domains1 If IsArray(domains1) Then MsgBox "Domains1 ist ein Array!" If IsArray(domains2) Then MsgBox "Domains2 ist ein Array!" MsgBox "--- Inhalt von domains2:" ' --- ausgeben For Each domain In domains2 172