Tech-Ecke / CATScript/VBS Inhalt / Visual Basic Script (VBS)

 

Visual Basic Script (VBS) ist eine auf Visual Basic basierende Scriptsprache. Ein VB-Script benötigt immer einen Interpreter "Scripting Engine" zum Auszuführen. "Scripting Engines" sind in verschiedenen Programmen integriert, z.B. HTML-Browsern und eben auch in CATIA V5. Selbstverständlich kommt Windows selbst auch mit einem VB-Interpreter daher und ermöglicht somit das direkte Ausführen von VB-Scripten. Im Gegensatz zu Visual Basic (VB) und Visual Basic for Applications (VBA) verzichtet die Scripting Engine auf das deklarieren von Variablen, deshalb können die hier bereitgestellten Code-Schnipsel nicht immer 1 zu 1 in VBA Projekte übernommen werden.  

VBS Grundlagen

Seiteninhalt:

 

 

Der Script-Aufbau (CATIA V5)
 
Catia möchte, dass der Hauptteil des Scripts zwischen Sub CATMain() und dem dazugehörigen End Sub steht. Aus diesem Grund wird man diesen Aufbau hier oft begegnen. Wenn man die Beispiele in einer ".vbs" Dateie verbauen möchte, so lässt man Sub CATMain() und das dazugehörige End Sub einfach weg.
 
 

Nur für Scripts die direkt unter CATIA laufen sollen !

  Sub CATMain()

' hier steht der eigentliche Programmteil

End
Sub

 

 

Variable in VBS

Mal von Feldvariablen (Arrays) abgesehen, ist es in VBS nicht zwingend notwendig eine Variable zu deklarieren. Das heißt, weder ihren Datentyp zu bestimmen, noch sie anzumelden. Folglich kann an jeder Stelle im Script eine Buchstaben-/Zahlenkombination direkt als Variable genutzt werden. Dennoch ist das Deklarieren natürlich auch möglich.

 

  public GobalVariable   ' globale Variable anmelden

Sub
CATMain()

dim Variable1   ' nur anmelden
dim Variable2 as String   ' anmelden und Typ zuweisen
dim Variable3 as Integer   ' anmelden und Typ zuweisen

End
Sub

 
   Boolean Enthält entweder True oder False.
   Integer Ganzzahliger Wertebereich von -32.768 bis 32.767
   Single Gleitkommazahlen mit einfacher Genauigkeit
   Double Gleitkommazahlen mit doppelter Genauigkeit
   Sting Zeichenkette
 
Feldvariable (Array - eindimensional)
 
Im Gegensatz zu allen anderen Variablen müssen Arrays in VBS deklariert werden. Dabei wird auch die maximale Anzahl der Arrays (Felder) bestimmt.
 
  Sub CATMain()

dim ArrayVariable1(5)   ' 5 gibt Anzahl der Felder an, da bei 0 begonnen wird, hat das Array 6 Felder

End
Sub

 
Werte zuweisen:
 
  Variable1 = true          ' Wahrheitswert ture oder false
Variable2 = "Text"          ' Zeichen bzw. Zeichenkette
Variable3 = 123          ' Zahl

FeldVariable1 (0) =  "erstes Element"          ' erstes Element einer eindimensionalen Feldvariable (Array) als Text
FeldVariable2 (1) =  "zweites Element"          ' zweites Element einer eindimensionalen Feldvariable (Array) als Text
 

Dynamische Feldvariablen (Arrays - eindimensional)

Bei dynamischen Arrays kann die Anzahl der Felder während der Laufzeit bestimmt und erweitert werden. In VBS funktioniert "ReDim Preserve" nur für eindimensionale Feldvariablen.
 
  Sub CATMain()

dim DynArrayVariable()

Felder = 5
ReDim DynArrayVariable(Felder)   ' Anzahl Felder bestimmen

Felder = Felder +3
ReDim Preserve DynArrayVariable(Felder)   ' Anzahl der Felder erweitern, und vorhandene Feldinhalte beibehalten

End
Sub

 

Inhalt einer Feldvariable umdrehen (eindimensional)

Mit der folgenden Sub kann der Inhalt einer Feldvariable (Reihenfolge des Inhalts) umgekehrt werden.
 
  Sub ReverseArray(ByRef aArray)

l = UBound(aArray)
h = Int(l/2)
for i = 0 to h
   s = aArray(i)
   aArray(i) = aArray(l-i)
   aArray(l-i) = s
next

End Sub

Inhalt einer Feldvariable löschen

  erase aArray


Mehrdimensionale Feldvariable

Zweidimensionale Variablen kann man sich wie ein Schachbrett oder eine Excel-Tabelle vorstellen.



Dreidimensionale Feldvariablen kann man sich wie ein Würfel vorstellen. Bei Vierdimensionalen Variablen kann man sich zum Würfel noch die Zeit hinzudenken, bei allem darüber gehen mir gerade die Beispiele aus :-)

  Sub CATMain()

dim ArrayVariable1(4, 5)   ' 4 (5) Anzahl der Felder erste Dimension, 5 (6) Felder zweite Dimension

End
Sub

 
Werte zuweisen:
 
  FeldVariable1(0,0) =  "1. Feld"
FeldVariable1(0,1) =  "2. Feld"

FeldVariable1(1,0) =  "6. Feld"  ' Basis dim (4,5)
FeldVariable1(1,1) =  "7. Feld"   ' Basis dim (4,5)

FeldVariable1(4,5,0) =  "30. Feld"  ' Basis dim (4,5,3)
FeldVariable1(4,5,1) =  "31. Feld"  ' Basis dim (4,5,3)


 

Datentyp einer Variable ermitteln

Da in VBS weder der Datentyp noch die Variable selbst deklariert werden muss, kann es unter Umständen mal nötig sein den aktuellen Datentyp einer Variable zu ermitteln, das geht so:
 

  Sub CATMain()

MsgBox TypeName(variable), vbInformation

End
Sub
 
 

Datentyp (Variableinhalt) umwandeln:

CStr(Variable)   ' Wandelt in Typ String (Text) CVar(Variable)   ' Wandelt in Typ Variant
CInt(Variable)   ' Wandelt in Typ Integer, mit Rundung CDate(Variable)   ' Wandelt in Typ Datum
CSng(Variable)   ' Wandelt in Typ Singel CCur(Variable)   ' Wandelt in Typ Währung
CDbl(Variable)  ' Wandelt in Typ Double CBool(Variable)   ' Wandelt in Typ Boolean
CLng(Variable)  ' Wandelt in Typ Long, mit Rundung  
 
 
Beispiel: String in einen Integer wandeln
  Sub CATMain()

Zahl = CInt(Text)     ' wandelt die Zeichen in der Variable Text in einen Integer und weist sie der Variable Zahl zu

End
Sub
 
 
 
 
 
   + Addition    ^ Potenz
   - Subtraktion    
   * Multiplikation    
   / Division    
 
 
 
 
 
Round - Zahl kaufmännisch runden
 
  Sub CATMain()

Zahl = 2,123456

Zahl = round(Zahl,2)      ' das Ergebnis wird 2,12 sein
MsgBox Zahl

End
Sub


NXOpen: System.Math.Zahl = round(Zahl,2)  ' System muss per "Imports System" eingebunden werden
 
 
Sqr - liefert die Quadratwurzel einer Zahl
 
  Sub CATMain()

Zahl = Sqr(9)      ' das Ergebnis wird 3 sein
MsgBox Zahl

End
Sub
 
 
Abs - liefert den positiven Wert einer Zahl zurück
 
  Sub CATMain()

PosZahl = Abs(-5.25)      ' das Ergebnis wird 5.25 sein
MsgBox PosZahl

End
Sub
 
 
Fix - liefert den ganzzahligen Wert einer Gleitkommazahl zurück
 
  Sub CATMain()

GanzZahl = Fix(-5.25)     ' das Ergebnis wird -5 sein
MsgBox GanzZahl

GanzZahl = Fix(5.75)     ' das Ergebnis wird 5 sein
MsgBox GanzZahl

End
Sub

 

Int - rundet immer auf die nächst niedrigere Ganzzahl

  Sub CATMain()

GanzZahl = Int(-5.25)     ' das Ergebnis wird -6 sein
MsgBox GanzZahl

GanzZahl = Int(5.75)     ' das Ergebnis wird 5 sein
MsgBox GanzZahl

End
Sub

 
 
isNumeric - prüft ob es sich bei einer Zeichenkette (String) um einen Zahlenwert handelt
 
  Sub CATMain()

Ausgabe = isNumeric("5.25")     'die Ausgabe wird "true" sein
Ausgabe = isNumeric("egal")     'die Ausgabe wird "false" sein

End
Sub
 

Sgn - liefert das Vorzeichen einer Zahl

  Sub CATMain()

Vorzeichen = Sgn(-5.25)     ' das Ergebnis wird -1 (Integer) sein
MsgBox Vorzeichen

Vorzeichen = Sgn(0)          ' das Ergebnis wird 0 (Integer)  sein
MsgBox Vorzeichen

Vorzeichen = Sgn(5.25)     ' das Ergebnis wird 1 (Integer)  sein
MsgBox Vorzeichen

End
Sub
 
 
Rnd - liefert eine Zufallszahl
         (Eigentlich handelt es sich nicht wirklich um eine Zufallszahl, sondern die Zahl wird über die Systemuhr ermittelt)

 
  Sub CATMain()

Randomize     ' reicht einmal am Begin einer Prozedur/Funktion

Zufallszahl = Int(100*Rnd)+1     ' liefert eine Zufallszahl von 0-100
MsgBox Zufallszahl

End
Sub
 
 
 
 
 
   > größer    >= größer gleich
   < kleiner    <= kleiner gleich
   = gleich    
   <> ungleich    
 
 
 
 
   & Stringverkettung    

 

 
 
Asc - liefert den ANSI-Code eines ANSI-Zeichen
 
  Sub CATMain()

Zahl = Asc("A")   ' das Ergebnis wird 65 sein
MsgBox Zahl

End
Sub
 
 
Chr - liefert das ANSI-Zeichen zu einem ANSI-Code
 
  Sub CATMain()

Zeichen = Chr(65)   ' das Ergebnis wird A sein
MsgBox Zeichen

End
Sub
 

LCase und UCase - wandelt alle Buchstaben eines Strings in Kleinschrift (lower case) bzw. Großschrift (upper case) um

  Sub CATMain()

MsgBox LCase("HIER WIRD ALLES KLEIN SEIN")
MsgBox UCase("hier wird alles groß sein")

End
Sub
 

Len - liefert die Anzahl der Zeichen einer Zeichenkette (String)

  Sub CATMain()

Anzahl = Len("Das ist ein Test")   ' das Ergebnis wird 16 sein
MsgBox Anzahl

End
Sub
 

Split - teilt einen String an einem angegebenen Zeichen

siehe auch in Verbindung mit CharCount.

  Sub CATMain()

Geteilt = split("das;wird;geteilt",";")    ' Geteilt als Array 
MsgBox Geteilt(0)
MsgBox Geteilt(1)
MsgBox Geteilt(2)

End
Sub
 

InStr - liefert die Position eines bestimmten Zeichen (oder Zeichenkette) in einer Zeichenkette (String)

  Sub CATMain()

Test = "Das ist ein Test"
Pos = InStr(1,Test, "e")    ' das Ergebnis wird 2 sein  -  wird der String nicht gefunden, so ist Pos 0
MsgBox Pos

End
Sub
 

 
Einen String umdrehen (Zeichenreihenfolge umkehren)
 
  Sub CATMain()

MsgBox StrReverse("ABC")     ' das Ergebnis wird CBA sein

End
Sub
 

 
Strings zusammenhängen (verketten)
 
  Sub CATMain()

AString = "te"
BString = "st"
MsgBox AString & BString   ' die Ausgabe wird ' test ' sein

End
Sub
 

 
Zeichen in einem String austauschen/ersetzen
 
  Sub CATMain()

AString = "teba"
MsgBox Replace(AString, "ba", "st")   ' die Ausgabe wird ' test ' sein

End
Sub
 
 
 
Zuschneiden eines Strings:
 

Mid - scheidet ein Teilstring aus einer Zeichenkette (String)

  Sub CATMain()

Zeichenkette = "Test"
Mid(Zeichenkette, 3, 1)  ' das Ergebnis wird "s" sein
Mid(Zeichenkette, 2, 2)  ' das Ergebnis wird "es" sein

End
Sub
 
 
Left und Right
 
Zeigt die ersten 3 Zeichen, das Ergebnis wird "tes" sein Zeigt die letzten drei Zeichen, das Ergebnis wird "est" sein
  Sub CATMain()

Text = "Test"
MsgBox Left(Text,3)

End
Sub
 
  Sub CATMain()

Text = "Test"
MsgBox right(Text,3)

End
Sub
 
 
Schneidet die letzten beiden Zeichen ab, Ergebnis ist "Te" Schneidet die ersten beiden Zeichen ab, Ergebnis ist "st"
  Sub CATMain()

Text = "Test"
Anzahl = Len(Text)     ' zählt die Anzahl der Zeichen (4)
MsgBox Left(Text, Anzahl -2)

End
Sub
 
  Sub CATMain()

Text = "Test"
Anzahl = Len(Text)     ' zählt die Anzahl der Zeichen (4)
MsgBox right(Text, Anzahl -2)

End
Sub
 
 
Ab einem bestimmten Zeichen alles wegschneiden, das Ergebnis wird "schön" sein
 
  Sub CATMain()

Text = "schön,Test"
Position = InStr(1,Text,",")     ' gibt die Stelle an, bei der das Komma (",") zum ersten mal gefunden wird
Ergebnis = left(Text,Position -1)
MsGBox Ergebnis

End
Sub
 
 
Bis zu einem bestimmten Zeichen alles wegschneiden, das Ergebnis wird "Test" sein
 
  Sub CATMain()

Text = "schön,Test"
Position = InStr(1,Text,",")     ' gibt die Stelle an, bei der das Komma (",") zum ersten mal gefunden wird
Ergebnis = right(Text,Len(Text) -Position)
MsGBox Ergebnis

End
Sub
 

Ein bestimmtes Zeichen in einer Zeichenkette (String) zählen

Siehe auch in Verbindung mit split.

  function CharCount(SIn,Character)

CharCount = UBound(Split(SIn, Character))

end function
 

Aufruf:

  Sub CATMain()

MsgBox CharCount("1;2;3;4",";") ' das Ergebnis wird 3 sein

End
Sub
 


  Dateioperationen

 

Erstell-, Änderungs- und Zugriffsdatum ermitteln
 
  function GetFileDate(DateiPfad, DateMode)

' DateMode 1 = Erstelldatum
' DateMode 2 = letzter Zugriff
' DateMode 3 = letztes Speichern


set fso = CreateObject("Scripting.filesystemobject")
set Datei = fso.GetFile(DateiPfad)
if DateMode = 1 then
GetFileDate = Datei.DateCreated
elseif DateMode = 2 then
GetFileDate = Datei.DateLastAccessed
elseif DateMode = 3 then
GetFileDate = Datei.DateLastModified
else
MsgBox "DateMode falsch definiert",48,"GetFileDate"
end if

end function
 

Aufruf:

  Sub CATMain()

MsgBox "Erstellt: " &GetFileDate("c:\test.txt", 1)
MsgBox "Letzter Zugriff: " &GetFileDate("c:\test.txt", 2)
MsgBox "Letzte Änderung: " &GetFileDate("c:\test.txt", 3)

End
Sub
 

 

Stringoperationen für Dateinamen und Pfade:
 

Dateipfad ermitteln Dateiname ermitteln
  Function ExtractFileDir(DateiPfad)

s = DateiPfad
s = StrReverse(s)
Position = InStr(1,s,"\")
s = right(s,Len(s) -Position)
s = StrReverse(s)
if Len(s) = 2 then s = s &"\"
ExtractFileDir = s

End
Function
 
  Function ExtractFileName(DateiPfad)

s = DateiPfad
s = StrReverse(s)
Position = InStr(1,s,"\")
s = left(s, Position -1)
ExtractFileName = StrReverse(s)

End Function

 
 

Aufruf:

  Sub CATMain()

MsgBox ExtractFileDir("C:\Test\Ordner\datei.txt")
MsgBox ExtractFileName("C:\Test\Ordner\datei.txt")

End
Sub
 


Dateiendung auslesen:

Endung auslesen Endung tauschen bzw. entfernen
  Function ExtractFileExt(s)

if InStr(s,".") > 0 then
s = StrReverse(s)
Position = InStr(1,s,".")
s = left(s,Position -1)
s = StrReverse(s)
end if

ExtractFileExt = s

End Function


 
 
  Function ChangeFileExt(s, e)

if InStr(s,".") > 0 then
   s = StrReverse(s)
   Position = InStr(1,s,".")
   s = right(s,Len(s)-Position)
   s = StrReverse(s)
   s = s &e
else
   s = s &e
end if

ChangeFileExt = s

End Function
 

Aufruf:

  Sub CATMain()

MsgBox ExtractFileExt("C:\test.txt")  ' Endung auslesen

MsgBox ChangeFileExt("C:\test.txt", ".bmp")      ' Endung tauschen von .txt nach .bmp
MsgBox ChangeFileExt("test.txt", ""            ' Endung entfernen

End
Sub

 

 
Sonderzeichen aus String entfernen
 
Möchte man einen String als Dateiname verwenden, so muss man sicherstellen, dass alle Sonderzeichen aus dem String entfernt werden die in einem Dateinamen nichts zu suchen haben. Für diesen Zweck kann man die Funktion ClearFileName verwenden. Hier sind die wichtigsten Sonderzeichen im Umfeld mit Catia zusammengefasst.
 
  Function ClearFileName(DateiName)

DateiName = Replace(DateiName, Chr(10), "")
DateiName = Replace(DateiName, Chr(13), "")
DateiName = Replace(DateiName, ".", "_")
DateiName = Replace(DateiName, "*", "_")
DateiName = Replace(DateiName, "±", "_")
DateiName = Replace(DateiName, "´", "_")
DateiName = Replace(DateiName, "\", "_")
DateiName = Replace(DateiName, "/", "_")
DateiName = Replace(DateiName, ":", "_")
DateiName = Replace(DateiName, ";", "_")

ClearFileName = DateiName

End
Function
 
 
Aufruf:
 
  Sub CATMain()

MsgBox CleanFileName("Hier*fliegt;einiges:raus")   ' -> Ergebnis: Hier_fliegt_einiges_raus

End
Sub
 
 
 
 
 
Zum ermitteln von Systemverzeichnissen wie beispielsweise Startmenü, Desktop, AppData... gibt es den Befehl  "SpecialFolder(".
 
  Sub CATMain()

set WSShell = CreateObject("WScript.Shell")
s = WSShell.SpecialFolders("AppData")
MsgBox s

End
Sub
"AppData" Programmdatenverzeichnis "Desktop" User Desktop
"MyDocuments" Eigene Dateine "StartMenu" Start Menü
"Startup" Start Ordner "Programs" Programme

 

Über Systemvariable festgelegte Verzeichnisse wie z.B. der User-Temp-Ordner lassen sich mit "ExpandEnvironmentStrings(" auslesen.

  Sub CATMain()

set WSShell = CreateObject("WScript.Shell")
s = WSShell.ExpandEnvironmentStrings("%Temp%")
MsgBox s

End
Sub

 

 
 
 
 
Ermitteln der aktuellen Zeit und Datum
 
  Sub CATMain()

MsgBox Time   ' gibt die aktuelle Uhrzeit aus
MsgBox Date   ' gibt das aktuelle Datum aus
MsgBox Now    ' gibt das Datum und die Uhrzeit aus

End
Sub
 
 
Stunden, Minuten und Sekunden als Zahl (Integer) auslesen
 
  Sub CATMain()

MsgBox Hour(Time)   ' Stunden als Zahl
MsgBox Minute(Time)   ' Minute als Zahl
MsgBox Second(Time)    ' Sekunde als Zahl

End
Sub
 
 
Tag, Monat und Jahr als Zahl (Integer) auslesen
 
  Sub CATMain()

MsgBox Day(Date)   ' Tag als Zahl
MsgBox Month(Date)   ' Monat als Zahl
MsgBox Year(Date)    ' Jahr als Zahl

End
Sub
 
 

Timer
- liefert die verstrichenen Sekunden seit Mitternacht (Systemuhr).
            (Dies kann genutzt werden um während der Laufzeit eines Makros die Zeit zu stoppen.)
 
  Sub CATMain()

WieLange = Int(Timer)       ' Sekunden seit Mitternacht als Zahl, hier abgerundet auf einen Integer
MsgBox WieLange

End
Sub
 
 
 
 
 
IF... THEN
 
  Sub CATMain()

if Wert = 0 then 
     MsgBox "Variable ist: "&Wert              ' bei String:    if Wert ="null"
else
     MsgBox "Variable ist: "&Wert
end if

End
Sub
 

SELECT CASE

 
  Sub CATMain()

select Case Wert

   case 1                                               ' bei String:    Case "Text"
        MsgBox "Variable ist: "&Wert

   case 2
        MsgBox "Variable ist: "&Wert

   case else
        MsgBox "Variable ist: "&Wert

end select

End
Sub
 

 

Schleifen

 
FOR... NEXT
 
  Sub CATMain()

for Wert = 1 to 5                                                      ' 5x wiederholen mit anzeige der Wiederholungen über Fenstermeldung
     MsgBox "Durchlauf  Nummer: "&Wert&" von 5"
next

End
Sub
 

 

FOR... NEXT - Rückwärts
 
  Sub CATMain()

for Wert = 5 to 1 Step -1                                           ' 5x wiederholen mit anzeige der Wiederholungen über Fenstermeldung
     MsgBox "Durchlauf  Nummer: "&Wert&" von 5"
next

End
Sub
 

 

DO... LOOP
 
  Sub CATMain()

Wert = 0

do
     Wert = Wert + 1
     MsgBox "Durchlauf  Nummer: "&Wert
loop until Wert = 5                                       ' 5x wiederholen mit anzeige der Wiederholungen über Fenstermeldung

End
Sub
 

 

Subroutinen

In VBS gibt es Subroutinen und Functions, wobei Functions einen Rückgabewert ausgeben können, Subroutinen nicht.
Sowohl der Subroutine als auch der Function können beim Aufruf Variablen (Eingangswerte) übergeben werden. Diese werden hinter dem Subroutinen- bzw. Function-Namen in Klammer angegeben. Mehrere Variable werden durch ein Komma getrennt. Muss kein Wert übergeben werden, so bleibt die Klammer leer.
Der Rückgabewert einer Funktion erfolgt über den Function-Name (siehe Beispiel).
 

   Function Funktionsname(Eingangswert1, Eingangswert2...)
         Anweisungen
        Function-Name = Rückgabewert

   End Function
Sub Prozedurname(Eingangswert1, Eingangswert2...)
     Anweisungen
End Sub
 
 
Beispiel für eine Subroutine:
 
  Sub CATMain()

     Call MachWas(5)

End
Sub

Sub MachWas(Eingangswert)
     MsgBox "Der Wert "&Eingangswert + 5&" wurde ermittelt"        ' die Prozedur gibt den Wert 10 aus
End
Sub
 
 
 
Beispiel für eine Function:
 
  Sub CATMain()

     MsgBox "Funktion liefert "&MachWas(5)&" zurück"        ' die Funktion liefert den Wert 10 zurück

End
Sub

Function MachWas(Eingangswert)
     MachWas =Eingangswert + 5
End
Function
 

 

VBS Interaktion mit dem Benutzer

 

 

Die einfachste Form einer MsgBox:

  Sub CATMain()

MsgBox "Hallo Welt"

End
Sub

NXOpen: MsgBox("Hallo Welt")
         

 

MsgBox mit Typ-Angabe und Fenstertext:

  Sub CATMain()

MsgBox "Fenstertext",0,"Fenstername"

End
Sub

NXOpen: MsgBox("Fenstertext",0,"Fenstername")
         

 

Die Festlegung des Fenstertyps erfolgt durch einen Zahlenwert, der zwischen dem Fenstertext und dem Fensternamen steht (",0,") .

0 16 32 48 64
normales Fenster Fehler Frage Warnung Hinweis
 

 

MsgBox mit mehrzeiligem Fenstertext:

Einen mehrzeiligen Text erreicht man mit dem Character Code "Chr(10)" (new line)

  Sub CATMain()

MsgBox "erste   Zeile" +Chr(10)+_
             "zweite Zeile" +Chr(10)+_ 
             "dritte   Zeile" ,0,"Fenstername"

End
Sub
 
         

 

MsgBox mit mehreren Buttons und deren Abfrage:

  Sub CATMain()

Antwort = MsgBox("Soll ich?",1,"Fenstername")
   if Antwort = vbOk then
        MsgBox"OK wurde gedrückt!"
  
end if
   if Antwort = vbCancel then
       
MsgBox"Abbrechen wurde gedrückt!"
   end if

End
Sub
 
         

Welche Button-Paare geboten werden, wird analog, wie im vorangegangenen Beispiel über den Fenstertyp festgelegt. Dabei nimmt man sie Summe vom Fenstertyp und Buttonkombination. Möchte man beispielsweise den Fenstertyp "Fehler" (16) und die Buttonkombination Ja, Nein, Abbrechen (3) so ergibt sich der Wert 19 -> MsgBox "Fenstertext",19,"Fenstername"

1 2 3 4 5
[OK] + [Abbrechen] [Abbrechen] + [Wiederholen] + [Ignorieren] [Ja] + [Nein] + [Abbrechen] [Ja] + [Nein] [Wiederholen] + [Abbrechen]

Die Abfrage  kann über den Button-Code oder über eine dem Button fest zugeordnete Zahl erfolgen:

6 7 1 2 4 5
vbYes vbNo vbOk vbCancel    
[Ja] [Nein] [OK] [Abbrechen] [Wiederholen] [Ignorieren]

 

InputBox

  Sub CATMain()

Antwort = InputBox("Wie ist dein Name?","Fenstertext")

   MsgBox("Dein Name ist " & Antwort)

End
Sub
 
         

Der Variable "Antwort" zugewiesene Wert ist generell vom Typ String, es sei denn der Inputbox-Dialog wird über den Button [Abbruch] beendet, dann wird der Variable der Boolean Wert "false" übergeben.

  if not Antwort then exit Sub ' um z.B. bei "Abbrechen" die Sub zu verlassen
 

 

Eine Eingabe vorgeben:

  Sub CATMain()

Antwort = InputBox("Wie ist dein Name?","Fenstertext","Vorgabe")

   MsgBox("Dein Name ist " & Antwort)

End
Sub
 
         

 

InputBox mit Auswahlmenü:

  Sub CATMain()

DasMenu = "Wähle ein Eintrag" +Chr(10)+_
" "+Chr(10)+_
"1 erster Eintrag" +Chr(10)+_
"2 zweiter Eintrag" +Chr(10)+_
"3 dritter Eintrag"

Antwort = InputBox(DasMenu,"Auswahl:")
If IsNumeric(Antwort) then
   select case Antwort
      case 1
          MsgBox "Du hast den ersten Eintrag gewählt."
      case 2
         MsgBox "Du hast den zweiten Eintrag gewählt."
      case 3
         MsgBox "Du hast den dritten Eintrag gewählt."
      case else
         MsgBox "Den Eintrag gibt es nicht!"
   end select
else
   MsgBox "Falsche Eingabe. Nur Nummern sind erlaubt."
end If

End
Sub
 
         

 

Fehlermeldungen Abfangen

Möchte man nicht, dass das laufende Script aufgrund eines Fehlers abbricht, so kann man dies mittels "On Error Resume Next" unterdrücken. Der Befehl gilt ab der Zeile in der er gesetzt wird. Aufgehoben wird das ganze mittels "On Error Goto 0". Die Anweisung gilt nur für die aktuelle Subroutine/Function.
Ein eventuell aufgetretener Fehler (nur der letzte) kann mittels "err.number " oder "err.description" abgefragt werden.

  Sub CATMain()

On Error Resume Next      ' ab hier werden alle Fehler abgefangen

' hier steht die Anweisungen...

if err.number <> 0 then
    
MsgBox"Es gab einen Fehler. Die Fehlernummer lautet: "&err.number
end if

On Error Goto
0     ' ab hier
wird wieder abgebrochen wenn es zu einem Fehler kommt


End
Sub

 

 

 

Externe Anwendungen starten

 

Datei/Anwendung aus laufendem Script heraus aufrufen

Der Pfadnamen darf kein Leerzeichen enthalten. z.B. "C:\Eigene Dateien\Egal.exe"  wäre unzulässig. Mit dieser Anweisung lassen sich auch Dateien mit der unter Windows verknüpften Anwendung öffnen.

  Sub CATMain()

set oShell = CreateObject("Wscript.shell")
oShell.Run "C:\WINDOWS\system32\calc.exe", 1, true  ' true = warten bis Anwendung beendet ist

End
Sub
 

Möchte man eine Konsolenanwendung starten und dabei das CMD Fenster unterdrücken, so setzt man den Zahlenwert der sich hinter dem Dateipfad befindet auf 0.

  oShell.Run "C:\Konsolenanwendung.exe", 0, true  ' true = warten bis Anwendung beendet ist
 

 

DOS- bzw. Konsolenanwendung starten und Ausgabe auslesen

Mit diesem Script ist es möglich eine Konsolenanwendung zu starten und deren Ausgabe auszulesen, um sie im weiteren Scriptverlauf zu nutzen.

  Sub CATMain()

set oShell = CreateObject("WScript.Shell")
set Abfrage = oShell.Exec("c:\test.exe")
Ausgabe = ""

fertig = false
do
   if not Abfrage.StdOut.AtEndOfStream then
      Ausgabe = Ausgabe &Abfrage.StdOut.Read(1)
   else
      fertig = true
   end if
loop until fertig = true

MsgBox Ausgabe

End
Sub
   
 

 

Prüfen ob Anwendung ausgeführt wird
 

  Function IsRunning(ExeName)

set wmi = GetObject("winmgmts:")
set system = wmi.instancesOf("win32_process")
IsRunning =
false
for each process in system
   if LCase(process.name) = LCase(ExeName) then
      IsRunning =
true
   end if
next

End Function

 

Aufruf:

  MsgBox IsRunning("notepad.exe") ' die Rückgabe ist Boolean
 

 

Anwendung (Prozess) abschießen bzw. schließen
 

  Sub KillProcess(ExeName)

set wmi = GetObject("winmgmts:")
set system = wmi.instancesOf("win32_process")
for each process in system
   if LCase(process.name) = LCase(ExeName) then
      process.Terminate (
0)
   end if
next

End Sub

 

Aufruf:

  Call KillProcess("notepad.exe")
 

Oder etwas sanfter mit CloseApp

Bei KillProcess gehen eventuell nicht gespeicherte Daten definitiv verloren. Abhilfe kann da die etwas sanftere Methode CloseApp schaffen. Jedoch ist mir unter Win7-64 aufgefallen, dass diese Routine die Anwendung nicht immer schließt wenn diese (bzw. dessen Fenster) gerade aktiv ist? 

 

Sub CloseApp(ExeName, FensterName)

set wmi = GetObject("winmgmts:")
s
et system = wmi.instancesOf("win32_process")
for each process in system
  
if LCase(process.name) = LCase(ExeName) then
     
set WshShell = CreateObject("WScript.Shell")
      f = WshShell.AppActivate(FensterName)
     
if f then WshShell.SendKeys "%{F4}" 'ALT-F4
 
 end if
next

End Sub

 

Aufruf:

  Call CloseApp("notepad.exe", "Unbenannt - Editor")
 

 

Windows Registry - Lesen/Schreiben
 

String in die Registry schreiben

  Sub CATMain()

Text = "das steht jetzt in der Registry"
set oShell = CreateObject("WScript.Shell")
oShell.RegWrite "HKEY_CURRENT_USER\Software\MeinPRG\MeinText", Text, "REG_SZ"     ' für Strings
oShell.RegWrite "HKEY_CURRENT_USER\Software\MeinPRG\MeinBool", 1, "REG_DWORD"     ' für Boolean 1 = true / 0 = false
oShell.RegWrite "HKEY_CURRENT_USER\Software\MeinPRG\MeinInteger", 123, "REG_DWORD"  ' für Integer

End
Sub
 

String aus Registry lesen

  Sub CATMain()

set oShell = CreateObject("WScript.Shell")
Text = oShell.RegRead("HKEY_CURRENT_USER\Software\MeinPRG\MeinText")
MsgBox Text

End
Sub
 

 

Aktuell angemeldeter Benutzername auslesen
 

  Function GetUserName()

set objWSHNetwork = CreateObject("WScript.Network")
GetUserName = objWSHNetwork.UserName
' Speicher freigeben
set objWSHNetwork = nothing

End Function
 

 

Wait in VBScript

in VBScript gibt es keinen Wait-Command aber mit folgendem Code kann man den Code für eine vogegebene Zeit in Sekunden in eine Endlosschleife rennen lassen. Zu beachten ist, dass für die Wartezeit der Prozessor voll ausgelastet ist.
 

  Sub wait(sec)

x = timer
do while timer -x < sec
loop

End Sub
 

Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !

[letzte Aktualisierung 08.01.2014]