1 VBScript - Installation und Sprachumfang 1.1 Installation VBScript 1.1.1 Script-Engine Die Visual Basic Script Engine wird automatisch mit der Installation im DIAdem-Programmverzeichnis gespeichert. Nur diese VBS-Engine wird von DIAdem benutzt. Notwendig wurde diese Vorgehensweise um eine optimale Verarbeitungsgeschwindigkeit zu erreichen und um Probleme bei Kunden zu vermeiden, bei denen aus Sicherheitsgründen standardmäßig kein VBS installiert wird. Startet man eine VBS-Autosequenz, die sich auf einem Netzlaufwerk befindet von einem lokalen Rechner aus, so wird die VBS-Datei in den lokalen Speicherbereich geladen und dort von der VBS-Engine, die sich im DIAdem-Programmpfad befindet, ausgeführt. Höchstens, wenn der Zugriff auf VBS-Dateien - also auch das lesen - von Netztools grundsätzlich untersagt wird, gibt es Probleme. 1.1.2 Dokumentation Die Installation der original Microsoft-Dokumentation erfolgt automatisch mit der Installation von DIAdem. 1.1.3 Debugger Der Debugger muss aus lizenzrechtlichen Gründen in jedem Fall von der Microsoft-Webseite heruntergeladen werden. Die Adresse ist : http://www.microsoft.com/germany/scripting/default.htm Dort unter dem Punkt ScriptDebugger Downloads nachsehen und die Version für Deutschland und egal welches Betriebssystem Sie einsetzen, bitte immer den Debugger für Windows NT/2000 herunterladen. Achtung : Es ist wichtig den richtigen Debugger herunterzuladen. Eine Deinstallation des falschen Debuggers ist sehr umständlich. VBScript-Sprachumfang Die wesentlichen Punkte zu VBScript sind in der Online-Hilfe detailliert beschrieben. Die folgenden Kapitel gehen auf die wichtigsten Punkte des VBScript-Sprachumfanges ein. Die Dokumentation wurde großteils der original Microsoft Dokumentation entliehen. Das untenstehende Bild zeigt wo in der Online-Hilfe die Informationen zum Sprachumfang zu finden sein. 1.1.4 VBScript-Datentypen VBScript kennt nur einen Datentyp namens Variant. Ein Variant ist eine besondere Art von Datentyp, der je nach Verwendung verschiedene Arten von Informationen aufnehmen kann. Weil Variant der einzige Datentyp in VBScript ist, geben alle Funktionen in VBScript diesen Datentyp zurück. Im einfachsten Fall kann Variant numerische Werte oder Zeichenfolgen enthalten. Ein Variant verhält sich wie eine Zahl, wenn Sie ihn in einem numerischen Zusammenhang verwenden, und wie eine Zeichenfolge, wenn Sie ihn wie eine Zeichenfolge verwenden. Wenn Sie also mit Daten arbeiten, die wie Zahlen "aussehen", interpretiert VBScript diese als Zahlen und verfährt entsprechend. Wenn Sie mit Daten arbeiten, die nur als Zeichenfolgen interpretiert werden können, behandelt VBScript diese als Zeichenfolgen. Sie können immer dafür sorgen, dass sich Zahlen wie Zeichenfolgen verhalten, indem Sie diese in Anführungszeichen (" ") einschließen. 1.1.4.1 Untertypen des Datentypes "Variant" Über die einfache Einteilung in numerische Werte und Zeichenfolgen hinaus kann bei Variant-Werten zwischen weiteren Arten von numerischen Informationen unterschieden werden. Numerische Informationen können beispielsweise ein Datum oder eine Uhrzeit darstellen. In Verbindung mit anderen Datums- oder Uhrzeitinformationen wird das Ergebnis immer als Datum oder Uhrzeit ausgedrückt. Es stehen auch viele verschiedene Arten numerischer Informationen zur Verfügung, angefangen von booleschen Werten bis hin zu großen Fließkommazahlen. Diese unterschiedlichen Informationskategorien, die ein Variant aufnehmen kann, werden als Untertypen bezeichnet. Meistens genügt es, einem Variant einfach die gewünschten Daten zuzuweisen, damit er sich entsprechend verhält. Die folgende Tabelle zeigt verschiedene Untertypen von Daten, die ein Variant enthalten kann. Untertyp Empty Beschreibung Variant ist nicht initialisiert. Der Wert ist 0 bei numerischen Variablen und eine Nullzeichenfolge ("") bei Zeichenfolgenvariablen. Null Boolean Byte Integer Currency Long Single Double Date (Time) String Object Error Variant enthält absichtlich keine gültigen Daten. Enthält entweder True oder False. Enthält eine Ganzzahl von 0 bis 255. Enthält eine Ganzzahl von -32.768 bis 32.767. -922.337.203.685.477,5808 bis 922.337.203.685.477,5807. Enthält eine Ganzzahl von -2.147.483.648 bis 2.147.483.647. Enthält eine Fließkommazahl einfacher Genauigkeit von -3,402823E38 bis 1,401298E-45 für negative Werte und von 1,401298E-45 bis 3,402823E38 für positive Werte. Enthält eine Fließkommazahl doppelter Genauigkeit von 1,79769313486232E308 bis -4,94065645841247E-324 für negative Werte und von 4,94065645841247E-324 bis 1.79769313486232E308 für positive Werte. Enthält eine Zahl, die ein Datum vom 1. Januar 100 bis zum 31. Dezember 9999 darstellt. Enthält eine Zeichenfolge variabler Länge, die bis zu etwa 2 Milliarden Zeichen lang sein kann. Enthält ein Objekt. Enthält eine Fehlernummer. Daten können mithilfe von Konvertierungsfunktionen von einem Untertyp in den anderen konvertiert werden. Zusätzlich gibt die Funktion VarType Informationen über die Art und Weise der Speicherung von Daten in einem Variant zurück. 1.1.5 VBScript-Variablen 1.1.5.1 Deklarieren von Variablen Sie deklarieren Variablen in Ihrem Skript explizit mit den Anweisungen Dim, Public und Private. Beispiel: Dim GradCelsius Sie deklarieren mehrere Variablen, indem Sie diese durch Kommas voneinander trennen. Beispiel: Dim Oben, Unten, Links, Rechts Sie können eine Variable auch implizit deklarieren, indem Sie einfach ihren Namen an einer beliebigen Stelle in Ihrem Skript verwenden. Dies gilt allgemein als schlechter Programmierstil, weil Sie den Variablennamen an der einen oder anderen Stelle falsch eingeben könnten, was bei der Ausführung des Skriptes zu unerwarteten Ergebnissen führt. Aus diesem Grund gibt es die Option Explicit-Anweisung, mit der Sie die explizite Deklaration aller Variablen erzwingen können. Die Option ExplicitAnweisung sollte die erste Anweisung innerhalb Ihres Skriptes sein. 1.1.5.2 Einschränkungen für Namen Für Variablennamen gelten die Standardregeln zum Benennen von Sprachelementen in VBScript. Für Variablennamen gilt: Sie müssen mit einem Zeichen des Alphabets beginnen. Sie dürfen keinen Punkt enthalten. Sie dürfen nicht länger als 255 Zeichen sein. Sie müssen innerhalb des Gültigkeitsbereichs, für den sie deklariert werden, eindeutig sein. 1.1.5.3 Gültigkeitsbereich und Lebensdauer von Variablen Der Gültigkeitsbereich einer Variablen hängt davon ab, wo sie deklariert wurde. Wenn Sie eine Variable in einer Prozedur deklarieren, kann normalerweise nur Code innerhalb dieser Prozedur auf den Variablenwert zugreifen oder ihn ändern. Sie hat somit einen lokalen Gültigkeitsbereich und wird als Variable auf Prozedurebene bezeichnet. Wenn Sie eine Variable außerhalb einer Prozedur deklarieren, ist sie für alle Prozeduren in Ihrem Skript sichtbar. Es handelt sich somit um eine Variable auf Skriptebene mit der Skriptebene als Gültigkeitsbereich. Die Lebensdauer einer Variable hängt von der Zeitspanne ab, in der eine Variable existiert. Die Lebensdauer einer Variablen auf Skriptebene reicht vom Zeitpunkt der Deklaration bis zur Beendigung des Skriptes. Eine Variable auf Prozedurebene existiert nur solange, wie die Prozedur aktiv ist. Bei Verlassen der Prozedur wird die Variable "vernichtet". Lokale Variablen eignen sich gut als temporärer Speicherplatz während der Ausführung einer Prozedur. Sie können lokale Variablen mit demselben Namen in mehreren Prozeduren verwenden, da jede nur von der Prozedur erkannt wird, in der sie deklariert wurde. 1.1.5.4 Zuweisen von Werten zu Variablen Variablen werden Werte zugewiesen, indem ein Ausdruck in folgender Form erstellt wird: Die Variable steht auf der linken Seite des Ausdruckes, und der Wert, welcher der Variablen zugewiesen werden soll, steht auf der rechten Seite. Beispiel: B = 200 1.1.5.5 Skalare Variablen und Datenfeldvariablen Meistens weisen Sie einer deklarierten Variablen nur einen einzelnen Wert zu. Solche Variablen werden skalare Variablen genannt. In anderen Fällen ist es sinnvoll, einer Variablen mehrere zusammenhängende Werte zuzuweisen. In diesen Fällen können Sie eine Variable erstellen, die eine Folge von Werten enthalten kann. Solche Variablen werden Datenfeldvariablen genannt. Datenfeldvariablen werden fast genauso deklariert wie skalare Variablen. Der einzige Unterschied besteht darin, dass bei der Deklaration von Datenfeldvariablen auf den Namen Klammern folgen. Im folgenden Beispiel wird ein eindimensionales Datenfeld mit 11 Elementen deklariert: Dim A(10) Obwohl in Klammern die Zahl 10 angegeben wird, enthält dieses Datenfeld 11 Elemente, weil alle Datenfelder in VBScript nullbasiert sind, d. h. mit dem Index 0 beginnen. In einem nullbasierten Datenfeld ist die Anzahl der Elemente immer um Eins höher als der in Klammern angegebene Wert. Diese Art von Datenfeld nennt man Datenfeld fester Größe. Zur Zuweisung von Daten an die Elemente des Datenfeldes verwenden Sie einen Index im Datenfeld. Mit Indizes von 0 bis 10 können den Elementen eines Datenfeldes auf folgende Weise Werte zugewiesen werden: A(0) = 256 A(1) = 324 A(2) = 100 ... A(10) = 55 Auf ähnliche Weise (mit einem Index im Datenfeld) kann der Wert eines beliebigen Datenfeldelements wieder abgerufen werden. Beispiel: ... EineVariable = A(8) ... Datenfelder sind nicht auf eine einzige Dimension beschränkt. Sie können bis zu 60 Dimensionen angeben, obwohl sich die meisten Menschen nur drei oder vier Dimensionen vorstellen können. Sie können mehrere Dimensionen deklarieren, indem Sie die Datenfeldgrößen zwischen den Klammern durch Kommas voneinander trennen. Im folgenden Beispiel ist die Variable MeineTabelle ein zweidimensionales Datenfeld mit 6 Zeilen und 11 Spalten: Dim MeineTabelle(5, 10) In einem zweidimensionalen Datenfeld gibt die erste Zahl immer die Anzahl der Zeilen und die zweite Zahl die Anzahl der Spalten an. Sie können auch Datenfelder deklarieren, deren Größe sich während des Ablaufs Ihres Skriptes ändern kann. Solche Datenfelder werden als dynamische Datenfelder bezeichnet. Das Datenfeld wird in einer Prozedur anfänglich mit einer Dim-Anweisung (wie jedes andere Datenfeld auch) oder mit einer ReDim-Anweisung deklariert. Der Unterschied besteht darin, dass zwischen den Klammern keine Größe oder Anzahl von Dimensionen angegeben wird. Beispiel: Dim MeinDatenfeld() ReDim EinAnderesDatenfeld() Um ein dynamisches Datenfeld verwenden zu können, müssen Sie anschließend die Zahl der Dimensionen und deren Größen mit ReDim bestimmen. Im folgenden Beispiel wird die anfängliche Größe des dynamischen Datenfeldes mit ReDim auf 25 festgelegt. Eine darauf folgende ReDim-Anweisung ändert die Größe des Datenfeldes auf 30. Mithilfe des Schlüsselwortes Preserve wird der Inhalt des Datenfeldes vor der Größenänderung gesichert. ReDim MeinDatenfeld(25) ... ReDim Preserve MeinDatenfeld(30) Die Größe eines dynamischen Datenfeldes kann beliebig oft geändert werden. Beachten Sie jedoch, dass bei einer Verkleinerung des Datenfeldes die Daten in den eliminierten Elementen verloren gehen. 1.1.6 VBScript-Features Kategorie Ablaufsteuerung Arraybehandlung Ausdrücke Datums-/Zeitangaben Deklarationen Eingabe/Ausgabe Fehlerbehandlung Formatieren von Zeichenfolgen Kommentare Konstanten/Literale Konvertierungen Schlüsselwörter Do...Loop For...Next For Each...Next If...Then...Else Select Case While...Wend With Array Dim, Private, Public, ReDim IsArray Erase LBound, UBound Eval Execute RegExp Replace Test Date, Time DateAdd, DateDiff, DatePart DateSerial, DateValue Day, Month, MonthName Weekday, WeekdayName, Year Hour, Minute, Second Now TimeSerial, TimeValue Class Const Dim, Private, Public, ReDim Function, Sub Property Get, Property Let, Property Set InputBox LoadPicture MsgBox On Error Err FormatCurrency FormatDateTime FormatNumber FormatPercent Kommentare mit ' oder Rem Empty Nothing Null True, False Abs Asc, AscB, AscW Chr, ChrB, ChrW CBool, CByte CCur, CDate CDbl, CInt CLng, CSng, CStr DateSerial, DateValue Hex, Oct Fix, Int Sgn TimeSerial, TimeValue Literale Mathematik Objekte Operatoren Optionen Prozeduren Runden Skriptmodul-ID Variant-Werte Verschiedenes Zeichenfolgen Empty False Nothing Null True Atn, Cos, Sin, Tan Exp, Log, Sqr Randomize, Rnd CreateObject Err-Objekt GetObject RegExp Addition (+), Subtraktion (-) Exponenten (^) Modulo (Mod) Multiplikation (*), Division (/) Ganzzahldivision (\) Negation (-) Zeichenfolgenverkettung (&) Gleichheit (=), Ungleich (<>) Kleiner als (<), Kleiner oder gleich (<=) Größer als (>) Größer oder gleich (>=) Is And, Or, Xor Eqv, Imp Option Explicit Call Function, Sub Property Get, Property Let, Property Set Abs Int, Fix, Round Sgn ScriptEngine ScriptEngineBuildVersion ScriptEngineMajorVersion ScriptEngineMinorVersion IsArray IsDate IsEmpty IsNull IsNumeric IsObject TypeName VarType Eval-Funktion Execute-Anweisung RGB-Funktion Asc, AscB, AscW Chr, ChrB, ChrW Filter, InStr, InStrB InStrRev Join Len, LenB LCase, UCase Left, LeftB Mid, MidB Right, RightB Replace Space Split Zuweisungen StrComp String StrReverse LTrim, RTrim, Trim Set 1.1.7 Konstanten Eine Konstante ist ein aussagekräftiger Name, der anstelle einer Zahl oder einer Zeichenfolge verwendet wird, und dessen Wert sich nie ändert. VBScript legt eine Anzahl integrierter Konstanten fest. Weitere Informationen zu diesen integrierten Konstanten finden Sie im VBScript-Sprachverzeichnis. Beispiele zu Zeichenfolgekonstanten : Konstante vbCr VbCrLf Wert Chr(13) Chr(13) & Chr(10) vbFormFeed Chr(12) vbLf vbTab Chr(10) Chr(13) & Chr(10) oder Chr(10) Chr(0) Zeichenfolge mit dem Wert 0 Chr(9) vbVerticalTab Chr(11) vbNewLine vbNullChar vbNullString Beschreibung Wagenrücklauf. Wagenrücklauf-Zeilenvorschub. Seitenvorschub (nicht sinnvoll unter Microsoft Windows). Zeilenvorschub. Plattformspezifisches Zeilenumbruchzeichen (je nach Plattform unterschiedlich). Zeichen mit dem Wert 0. Entspricht nicht einer Zeichenfolge mit der Länge Null (""); für den Aufruf externer Prozeduren. Horizontaler Tabstopp. Vertikaler Tabstopp (nicht sinnvoll unter Microsoft Windows). Da diese Konstanten in VBScript integriert sind, müssen sie vor einer Verwendung nicht definiert werden. Diese Konstanten können im Code an einer beliebigen Stelle verwendet werden, um die jeweils angezeigten Werte darzustellen. 1.1.8 VBScript-Operatoren Arithmetisch Beschreibung Potenzierung Vergleich Symbol Beschreibung ^ Gleichheit Unäre Negation - Ungleichheit Multiplikation * Kleiner als Division / Größer als Ganzzahldivision \ Kleiner oder gleich Modulo-Arithmetik Mod Größer oder gleich Addition Subtraktion Zeichenfolgenverkettung + - Objektäquivalenz Logisch Symbol Beschreibung = Logische Negation Logische <> Konjunktion Logische < Disjunktion > Logische Exklusion Logische <= Äquivalenz Logische >= Implikation Is Symbol Not And Or Xor Eqv Imp & 1.1.9 Verwenden von Bedingungsanweisungen 1.1.9.1 Steuern der Programmausführung Der Ablauf eines Skriptes mit Bedingungs- und Schleifenanweisungen kann gesteuert werden. Mithilfe von Bedingungsanweisungen ist es möglich, VBScript-Code schreiben, mit dem Entscheidungen getroffen und Aktionen wiederholt werden können. Die folgenden Bedingungsanweisungen sind in VBScript verfügbar: If...Then...Else-Anweisung Select Case-Anweisung 1.1.9.2 Treffen von Entscheidungen mithilfe von If...Then...Else Die If...Then...Else-Anweisung wird verwendet, um zu bestimmen, ob eine Bedingung True oder False ist, und um anzugeben, ob je nach Ergebnis eine oder mehrere Anweisungen ausgeführt werden. Im Allgemeinen ist die Bedingung ein Ausdruck, der einen Vergleichsoperator zum Vergleichen eines Wertes oder einer Variablen mit einem/r anderen verwendet. Informationen zu Vergleichsoperatoren finden Sie unter Vergleichsoperatoren. If...Then...ElseAnweisungen können nach Bedarf auf beliebig vielen Ebenen verschachtelt werden. Ausführen von Anweisungen, wenn eine Bedingung True ist Um nur eine Anweisung auszuführen, wenn eine Bedingung True ist, verwenden Sie die einzeilige Syntax für die If...Then...Else-Anweisung. Das folgende Beispiel zeigt die einzeilige Syntax. Beachten Sie, daß in diesem Beispiel das Schlüsselwort Else weggelassen wird. Sub DatumSetzen() Dim meinDatum meinDatum = #2/13/95# If meinDatum < Now Then meinDatum = Now End Sub Zum Ausführen von mehr als einer Codezeile müssen Sie die mehrzeilige Syntax oder Blocksyntax verwenden. Diese Syntax enthält die End IfAnweisung ,wie im folgenden Beispiel gezeigt: Sub BenutzerWarnen(wert) If wert = 0 Then AlertLabel.ForeColor = vbRed AlertLabel.Font.Bold = True AlertLabel.Font.Italic = True End If End Sub Ausführen bestimmter Anweisungen, wenn eine Bedingung True ist, und Ausführen anderer Anweisungen, wenn eine Bedingung False ist Mit der If...Then...Else-Anweisung können Sie zwei Blöcke mit ausführbaren Anweisungen definieren: ein Block wird ausgeführt, wenn die Bedingung True ist, der andere wird ausgeführt, wenn die Bedingung False ist. Sub BenutzerWarnen(wert) If wert = 0 Then AlertLabel.ForeColor = AlertLabel.Font.Bold = AlertLabel.Font.Italic Else AlertLabel.Forecolor = AlertLabel.Font.Bold = AlertLabel.Font.Italic End If End Sub vbRed True = True vbBlack False = False Entscheiden zwischen mehreren Alternativen Mithilfe einer Variante der If...Then...Else-Anweisung können Sie aus mehreren Alternativen auswählen. Durch das Hinzufügen der ElseIf-Klausel können Sie die Funktionalität der If...Then...Else-Anweisung erweitern, so dass der Programmablauf auf mehreren Möglichkeiten basiert. Beispiele: Sub WertAusgeben(wert) If wert = 0 Then MsgBox wert ElseIf wert = 1 Then MsgBox wert ElseIf wert = 2 then MsgBox wert Else Msgbox "Wert außerhalb des Bereichs!" End If Sie können nach Bedarf beliebig viele ElseIf-Klauseln hinzufügen, um alternative Möglichkeiten bereitzustellen. Durch eine zu häufige Verwendung der ElseIf-Klausel wird der Code allerdings umständlich. Eine bessere Möglichkeit zum Auswählen aus mehreren Alternativen bietet die Select Case-Anweisung. Treffen von Entscheidungen mit Select Case Die Select Case-Struktur bietet eine Alternative zu If...Then...ElseIf, um gezielt einen Anweisungsblock aus mehreren Anweisungsblöcken auszuführen. Eine Select Case-Anweisung bietet dieselbe Funktionalität wie die If...Then...Else-Anweisung, macht den Code jedoch effizienter und leichter lesbar. Eine Select Case-Struktur arbeitet mit einem einzelnen Testausdruck, der einmalig, auf der obersten Ebene der Struktur, ausgewertet wird. Das Ergebnis der Struktur wird dann mit den Werten für jedes Case in der Struktur verglichen. Gibt es eine Übereinstimmung, wird der mit diesem Case verknüpfte Anweisungsblock wie in dem folgenden Beispiel ausgeführt: Select Case Document.Formular1.Kartentyp.Options(SelectedIndex).Text Case "MasterCard" MCLogoAnzeigen MCKontoPruefen Case "Visa" VisaLogoAnzeigen VisaKontoPruefen Case "American Express" AMEXCOLogoAnzeigen AMEXCOKontoPruefen Case Else UnbekanntBildAnzeigen ErneutAuffordern End Select Beachten Sie, daß die Select Case-Struktur einen Ausdruck einmalig am Anfang der Struktur auswertet. Im Gegensatz dazu kann eine If...Then...ElseIf-Struktur für jede ElseIf-Anweisung unterschiedliche Ausdrücke auswerten. Eine If...Then...ElseIf -Struktur kann nur dann durch eine Select Case-Struktur ersetzt werden, wenn in jeder ElseIf-Anweisung derselbe Ausdruck ausgewertet wird. 1.1.10 Durchlaufen von Codeschleifen Das Durchlaufen von Schleifen ermöglicht Ihnen, eine Anweisungsgruppe wiederholt auszuführen. Einige Schleifen wiederholen Anweisungen, bis eine Bedingung falsch (False) ist, andere wiederholen Anweisungen, bis eine Bedingung wahr (True) ist. Es gibt auch Schleifen, die Anweisungen in einer bestimmten Anzahl wiederholen. Die folgenden Schleifenanweisungen sind in VBScript verfügbar: For...Next: Verwendet einen Zähler, der angibt, wie häufig Anweisungen ausgeführt werden. Do...Loop: Schleife durchlaufen, solange oder bis eine Bedingung True ist. While...Wend: Schleife durchlaufen, solange eine Bedingung True ist. For Each...Next: Wiederholt eine Anweisungsgruppe für jedes Element in einer Auflistung oder jedes Element in einem Datenfeld. 1.1.10.1 Verwenden von For...Next Sie können For...Next-Anweisungen verwenden, um genau festzulegen, wie oft ein Anweisungblock ausgeführt werden soll. Für Schleifen verwenden Sie eine Zählervariable, deren Wert mit jeder Wiederholung der Schleife erhöht und verringert wird. Das folgende Beispiel hat zur Folge, dass eine Prozedur mit dem Namen MeineProz 50-mal ausgeführt wird. Die For-Anweisung gibt als Zählervariable x an und legt den zugehörigen Start- und Endwert fest. Die Next-Anweisung zählt die Zählervariable jeweils um 1 hoch. Sub MeineProz50Mal() Dim x For x = 1 To 50 MeineProz Next End Sub Mit dem Schlüsselwort Step können Sie die Zählervariable um den darin angegebenen Wert vergrößern oder verkleinern. Im folgenden Beispiel wird die Zählervariable j bei jedem Schleifendurchlauf um 2 hochgezählt. Wenn die Schleife beendet ist, enthält ergebnis die Summe von 2, 4, 6, 8 und 10. Sub ZweierSumme() Dim j, ergebnis For j = 2 To 10 Step 2 ergebnis = ergebnis + j Next MsgBox "Die Summe ist " & ergebnis End Sub Zum Verkleinern der Zählervariable verwenden Sie einen negativen Wert für Step. Sie müssen einen Endwert angeben, der kleiner als der Startwert ist. Im folgenden Beispiel wird die Zählervariable meineZahl bei jedem Schleifendurchlauf um 2 verkleinert. Wenn die Schleife beendet ist, enthält ergebnis die Summe von 16, 14, 12, 10, 8, 6, 4 und 2. Sub NeueSumme() Dim meineZahl, ergebnis For meineZahl = 16 To 2 Step -2 ergebnis = ergebnis + meineZahl Next MsgBox "Die Summe ist " & ergebnis End Sub Sie können jede For...Next-Anweisung beenden, bevor der Zähler seinen Endwert erreicht, indem Sie die Exit For-Anweisung verwenden. Da die Schleifenausführung normalerweise nur in bestimmten Situationen beendet werden soll, z. B. wenn ein Fehler auftritt, müssen Sie die Exit For-Anweisung im True-Anweisungsblock einer If...Then...Else-Anweisung verwenden. Wenn die Bedingung False ist, wird die Schleife normal ausgeführt. 1.1.10.2 Verwenden von Do-Schleifen Sie können Do...Loop-Anweisungen verwenden, um einen Anweisungblock mehrmals auszuführen, ohne dass die Anzahl der Durchläufe festgelegt ist. Die Anweisungen werden entweder wiederholt, solange eine Bedingung True ist oder bis eine Bedingung True ist. Wiederholung von Anweisungen, während eine Bedingung True ist Verwenden Sie das Schlüsselwort While, um eine Bedingung in einer Do...Loop-Anweisung zu überprüfen. Sie können die Bedingung überprüfen, bevor die Schleife ausgeführt wird (wie im folgenden Beispiel WhileZuerst gezeigt), oder Sie können sie überprüfen, nachdem die Schleife mindestens einmal ausgeführt wurde (wie im Beispiel WhileDanach gezeigt). Wenn in der WhileZuerst-Prozedur meineZahl auf 9 anstatt auf 20 festgelegt wird, werden die Anweisungen in der Schleife niemals ausgeführt. In der WhileDanachProzedur werden die Anweisungen in der Schleife nur 1-mal ausgeführt, weil die Bedingung bereits False ist. Sub WhileZuerst() Dim zaehler, meineZahl zaehler = 0 meineZahl = 20 Do While meineZahl > 10 meineZahl = meineZahl - 1 zaehler = zaehler + 1 Loop MsgBox "Die Schleife wurde " & zaehler & " mal wiederholt." End Sub Sub WhileDanach() Dim zaehler, meineZahl zaehler = 0 meineZahl = 9 Do meineZahl = meineZahl - 1 zaehler = zaehler + 1 Loop While meineZahl > 10 MsgBox "Die Schleife wurde " & zaehler & " mal wiederholt." End Sub Wiederholen einer Anweisung bis eine Bedingung True wird Es gibt zwei Möglichkeiten, das Schlüsselwort Until zu verwenden, um eine Bedingung in einer Do...Loop-Anweisung zu überprüfen. Sie können die Bedingung überprüfen, bevor die Schleife ausgeführt wird (wie im folgenden Beispiel UntilZuerst gezeigt), oder Sie können sie überprüfen, nachdem die Schleife mindestens einmal ausgeführt wurde (wie im Beispiel UntilDanach gezeigt). Solange die Bedingung False ist, wird die Schleife durchlaufen. Sub UntilZuerst() Dim zaehler, meineZahl zaehler = 0 meineZahl = 20 Do Until meineZahl = 10 meineZahl = meineZahl - 1 zaehler = zaehler + 1 Loop MsgBox "Die Schleife wurde " & zaehler & " mal wiederholt." End Sub Sub UntilDanach() Dim zaehler, meineZahl zaehler = 0 meineZahl = 1 Do meineZahl = meineZahl + 1 zaehler = zaehler + 1 Loop Until meineZahl = 10 MsgBox "Die Schleife wurde " & zaehler & " mal wiederholt." End Sub Beenden einer Do...Loop-Anweisung aus der Schleife heraus Sie können eine Do...Loop-Schleife beenden, indem Sie die Exit DoAnweisung verwenden. Da die Schleifenausführung normalerweise nur in bestimmten Situationen beendet werden soll, z. B. um eine Endlosschleife zu vermeiden, müssen Sie die Exit Do-Anweisung im True-Anweisungsblock einer If...Then...Else-Anweisung verwenden. Wenn die Bedingung False ist, wird die Schleife normal ausgeführt. Im folgenden Beispiel wird meineZahl ein Wert zugewiesen, der eine Endlosschleife verursacht. Die If...Then...Else-Anweisung überprüft, ob dieser Zustand eintritt, und verhindert die endlose Wiederholung. Sub ExitBeispiel() Dim zaehler, meineZahl zaehler = 0 meineZahl = 9 Do Until meineZahl = 10 meineZahl = meineZahl - 1 zaehler = zaehler + 1 If meineZahl < 10 Then Exit Do Loop MsgBox "Die Schleife wurde " & zaehler & " mal wiederholt." End Sub 1.1.10.3 Verwenden von While...Wend Die While...Wend-Anweisung wird in VBScript für Entwickler zur Verfügung gestellt, die mit ihrer Verwendung vertraut sind. Auf Grund der eingeschränkten Flexibilität von While...Wend wird jedoch empfohlen, stattdessen Do...Loop zu verwenden. 1.1.10.4 Verwenden von For Each...Next Eine For Each...Next-Schleife ist einer For...Next -Schleife ähnlich. Anstatt die Anzahl der Schleifendurchläufe zum Wiederholen der Anweisungen anzugeben, wird in einer For Each...Next-Schleife eine Anweisungsgruppe für jedes Element in einer Auflistung von Objekten oder für jedes Element in einem Datenfeld ausgeführt. Dies ist besonders dann hilfreich, wenn nicht bekannt ist, wie viele Elemente in einer Gruppe enthalten sind. Im folgenden HTML-Codebeispiel wird der Inhalt eines Dictionary-Objekts verwendet, um Text in mehrere Textfelder einzusetzen. Sub cmdAendern_OnClick Dim d ' Erstellen einer Variablen Set d = CreateObject("Scripting.Dictionary") d.Add "0", "Athen" ' Einige Schlüssel und Elemente hinzufügen d.Add "1", "Belgrad" d.Add "2", "Kairo" For Each I in d Document.frmFormular.Elements(I).Value = D.Item(I) Next End Sub 1.1.11 VBScript-Prozeduren In VBScript gibt es zwei Arten von Prozeduren, die Sub-Prozedur und die Function-Prozedur. 1.1.11.1 Sub-Prozeduren Eine Sub-Prozedur ist eine Folge von VBScript-Anweisungen, die zwischen den Anweisungen Sub und End Sub eingeschlossen sind und Aktionen ausführen, aber keine Werte zurückgeben. Eine Sub-Prozedur kann Argumente (Konstanten, Variablen oder Ausdrücke, die von einer aufrufenden Prozedur übergeben wurden) übernehmen. Wenn eine Sub-Prozedur keine Argumente hat, muss ihre Sub-Anweisung ein leeres Klammernpaar () enthalten. Die folgende Sub-Prozedur verwendet zwei integrierte (oder eingebaute) VBScript-Funktionen,MsgBox und InputBox, um einen Benutzer zur Eingabe von Informationen aufzufordern. Dann zeigt sie das Ergebnis einer Berechnung an, die auf diesen Informationen basiert. Die Berechnung wird in einer mit VBScript erstellten Function-Prozedur ausgeführt. Diese wird in der Behandlung der nachfolgenden Function-Prozedur ebenfalls gezeigt. Sub KonvertTemp() temp = InputBox("Geben Sie die Temperatur in Fahrenheit ein.", 1) MsgBox "Die Temperatur ist " & Celsius(temp) & " Grad Celsius." End Sub 1.1.11.2 Function-Prozeduren Eine Function-Prozedur ist eine Folge von VBScript-Anweisungen, die zwischen den Anweisungen Function und End Function eingeschlossen sind. Eine FunctionProzedur ist einer Sub-Prozedur ähnlich, kann aber auch einen Wert zurückgeben. Eine Function-Prozedur kann Argumente (Konstanten, Variablen oder Ausdrücke, die von einer aufrufenden Prozedur übergeben werden) übernehmen. Wenn eine FunctionProzedur keine Argumente hat, muss ihre Function-Anweisung ein leeres Klammernpaar enthalten. Eine Function-Prozedur gibt Werte zurück, indem ihrem Namen in einer oder mehreren Anweisung(en) der Prozedur ein Wert zugewiesen wird. Der Typ des Rückgabewertes einer Function-Prozedur ist immer ein Variant. Die Funktion Celsius im folgenden Beispiel berechnet aus Temperaturangaben in Fahrenheit die entsprechenden Werte in Grad Celsius. Beim Aufruf der Funktion aus der Sub-Prozedur KonvertTemp wird eine Variable mit dem Argumentwert an die Funktion übergeben. Das Ergebnis der Berechnung wird an die aufrufende Prozedur zurückgegeben und in einem Meldungsfeld angezeigt. Sub KonvertTemp() temp = InputBox("Geben Sie die Temperatur in Fahrenheit ein.", 1) MsgBox "Die Temperatur ist " & Celsius(temp) & " Grad Celsius." End Sub Function Celsius(GradF) Celsius = (GradF - 32) * 5 / 9 End Function 1.1.11.3 Übergeben von Daten an bzw. aus Prozeduren Die Übergabe eines Datenelements an Prozeduren erfolgt über ein Argument. Argumente dienen als Platzhalter für die an die Prozedur zu übergebenden Daten. Als Bezeichner für Argumente können Sie jeden als Variablennamen gültigen Bezeichner verwenden. Wenn Sie eine Prozedur mit der Sub- oder der Function-Anweisung erstellen, müssen nach dem Namen der Prozedur Klammern eingefügt werden. Alle Argumente werden zwischen diesen Klammern angegeben und durch Kommas getrennt. In der folgenden Prozedur ist beispielsweise GradF ein Platzhalter für den Wert, der an die Funktion Celsius zur Konvertierung übergeben wird. Function Celsius(GradF) Celsius = (GradF - 32) * 5 / 9 End Function Um Daten von einer Prozedur als Rückgabe zu erhalten, müssen Sie eine Function-Prozedur definieren. Denken Sie daran, dass eine FunctionProzedur einen Wert zurückgeben kann, eine Sub-Prozedur dagegen nicht. 1.1.11.4 Verwenden von Sub- und Function-Prozeduren im Code Um eine Function-Prozedur in Ihrem Code zu verwenden, müssen Sie diese auf der rechten Seite einer Variablenzuweisung oder in einem Ausdruck verwenden. Beispiele: temperatur = Celsius(temp) oder MsgBox "Die Temperatur ist " & Celsius(temp) & " Grad Celsius." Um eine Sub-Prozedur aus einer anderen Prozedur aufzurufen, geben Sie den Namen der Prozedur zusammen mit den erforderlichen Argumenten (durch Kommas getrennt) ein. Die Call-Anweisung ist nicht erforderlich. Wenn Sie sie jedoch verwenden, müssen Sie die Argumente in Klammern einschließen. Das folgende Beispiel zeigt zwei Aufrufe der Prozedur MeineProz. In einem Fall wird die Call-Anweisung im Code verwendet, im anderen nicht. Beide Aufrufe haben genau dieselbe Wirkung. Call MeineProz(erstesArg, zweitesArg) MeineProz erstesArg, zweitesArg Beachten Sie, dass bei Nichtverwendung der Call-Anweisung die Klammern weggelassen werden müssen. 1.1.12 CreateObject-Funktion Erstellt ein Automatisierungsobjekt und gibt einen Verweis darauf zurück. CreateObject(Servername.Klassenname [, Speicherort]) Argumente Servername Erforderlich. Der Name der Anwendung, die das Objekt bereitstellt. Klassenname Erforderlich. Der Typ oder die Klasse des zu erstellenden Objekts. Speicherort Optional. Der Name des Netzwerkservers, auf dem das Objekt erstellt werden soll. Hinweise : Alle Automatisierungsserver stellen mindestens einen Objekttyp zur Verfügung. Eine Textverarbeitung kann beispielsweise ein Anwendungsobjekt, ein Dokumentobjekt und ein Symbolleistenobjekt bereitstellen. Sie erstellen ein Automatisierungsobjekt, indem Sie das Objekt, das von CreateObject zurückgegeben wird, einer Objektvariablen zuweisen: Dim ExcelTabelle Set ExcelTabelle = CreateObject("Excel.Sheet") Der Code startet die Anwendung, die das Objekt erstellt (in diesem Fall eine Microsoft Excel-Tabelle). Anschließend können Sie aus dem Code mit der von Ihnen festgelegten Objektvariablen auf das Objekt zugreifen. In diesem Beispiel können Sie auf Eigenschaften und Methoden des neuen Objekts mit der Objektvariablen ExcelTabelle und auf Eigenschaften und Methoden anderer Excel-Objekte wie dem Application-Objekt und der ActiveSheet.CellsAuflistung zugreifen: ' Excel über das Application-Objekt sichtbar machen. ExcelTabelle.Application.Visible = True ' Text in die ersten Zelle der Tabelle einfügen. ExcelTabelle.ActiveSheet.Cells(1,1).Value = "Das ist Spalte A, Zeile 1" ' Tabelle speichern. ExcelTabelle.SaveAs "C:\Eigene Dateien\TEST.XLS" ' Excel über die Quit-Methode des Application-Objekts beenden. ExcelTabelle.Application.Quit ' Objektvariable freigeben. Set ExcelTabelle = Nothing Das Erstellen von Objekten auf einem Remoteserver kann nur durchgeführt werden, wenn die Internetsicherheit deaktiviert wurde. Sie können ein Objekt auf einem entfernten Netzwerkcomputer erstellen, indem Sie den Computernamen an das Argument Servername von CreateObject übergeben. Dieser Name entspricht dem Computernamenteil im Freigabenamen. Bei der Netzwerkfreigabe "\\meinserver\public" ist der Servername "meinserver". Darüber hinaus können Sie auch den Servernamen unter Verwendung des DNS-Formats oder einer IP-Adresse angeben. Der nachstehend aufgeführte Code gibt die Versionsnummer einer ExcelInstanz zurück, die auf dem entfernten Netzwerkcomputer "meinserver" ausgeführt wird: Function VersionAnzeigen Dim XLApp Set XLApp = CreateObject("Excel.Application", "MeinServer") VersionAnzeigen = XLApp.Version End Function Ist der angegebene Remoteserver nicht vorhanden oder kann er nicht gefunden werden, wird eine Fehlermeldung generiert. 1.2 Nicht in VBScript enthaltene Visual Basic für Applikationen-Features Kategorie Ablaufsteuerung Arraybehandlung Auflistung Bedingte Kompilierung Dateieingabe/ausgabe Nicht verfügbares Feature/Schlüsselwort DoEvents GoSub...Return, GoTo On Error GoTo On...GoSub, On...GoTo Zeilennummern, Zeilenmarken Option Base Deklarieren von Arrays mit Untergrenzen <> 0 Add, Count, Item, Remove Zugriff auf Auflistungen unter Verwendung des Ausrufungszeichens (!) (z. B. MeineAuflistung!Foo) #Const #If...Then...#Else Alle in Basic üblichen Dateiein- und -ausgaben Alle intrinsischen Datentypen außer Variant Type...End Type Datums-/Zeitangaben Date-Anweisung, Time-Anweisung DDE LinkExecute, LinkPoke, LinkRequest, LinkSend Debug.Print Debuggen End, Stop Declare (zum Deklarieren von DLLs) Optional Deklaration ParamArray Static Erl Fehlerbehandlung Error Resume, Resume Next Finanzmathematik Alle finanzmathematischen Funktionen CVar, CVDate Konvertierung Str, Val Objektbearbeitung TypeOf Clipboard Objekte Collection Datentypen Operatoren Optionen Select Case Verwenden von Objekten Zeichenfolgen Like Deftype Option Base Option Compare Option Private Module Ausdrücke, die das Is-Schlüsselwort oder einen oder mehrere Vergleichsoperatoren enthalten Ausdrücke, die einen Wertebereich unter Verwendung des ToSchlüsselworts enthalten. Zugriff auf Auflistungen unter Verwendung des Ausrufungszeichens (!) Zeichenfolgen mit fester Länge LSet, RSet Mid-Anweisung StrConv