Als folgt nun eine Kurzreferenz der Sprache. 
Es werden die grundlegenden Datentypen, Steuerstrukturen und das Funktions-/Prozedur-Konzept dargestellt.

Einfache Sprachkonzepte


Variablentypen

Folgende grundlegende Datentypen gibt es in Visual Basic.
Datentyp Bedeutung Bereich Größe
Byte vorzeichenlose Ganzzahl 1 bis 255 1 Byte
Boolean Boolescher Datentyp TRUE oder FALSE 2 Bytes
Integer Vorzeichenbehaftete Ganzzahlen (16-Bit) -32,768 bis 32,767 2 Bytes
Long Vorzeichenbehaftete Ganzzahlen (32-Bit) -2,147,483,648 bis 2,147,483,647. 4 Bytes
Single Gleitpunktzahlen (einfache Genauigkeit) -3.402823E38 bis -1.401298E-45; 1.401298E-45 bis 3.402823E38 4 Bytes
Double Gleitpunktzahlen (doppelte Genauigkeit) -1.79769313486232E308 bis -4.94065645841247E-324; 4.94065645841247E-324 bis 1.79769313486232E308 8 Bytes
Currency Währung (geeignet für Berechnungen mit hoher Genauigkeit) -922,337,203,685,477.5808 bis 922,337,203,685,477.5807 8 Bytes
String Zeichenfolge 0 bis ca. 2 Milliarden (ca. 65,400 für Microsoft Windows 3.1 und früher) 10 Bytes + Stringlänge
Date Datum 01.01.100 bis 31.12.9999 8 Bytes

Neben diesen Datentypen gibt es noch Strings fester Länge, sowie die Datentypen Object und Variant. Man kann ferner eigene zusammengesetzte Datentypen und Arrays definieren. Einen Record kann man mit Hilfe der TYPE-Anweisung vereinbaren.

Syntax der TYPE-Anweisung:

[PRIVATE | PUBLIC] TYPE Datentypname
  Elementname [([Indizes])] AS Typ
[ Elementname [([Indizes])] AS Typ]
. . .
END TYPE
Mit dieser Anweisung wird ein Record (Datenverbund) definiert. 
Datentypname und Elementname müssen gültige Bezeichner sein. 
Die angegebenen Typen müssen entweder Standard-Datentypen oder bereits definierte eigene Typen sein. 
Die Indizes werden zur Definition von Arrays verwendet. (Darauf werden wir im nächsten Abschnitt noch kommen.)
Mit den Prädikaten PRIVATE und PUBLIC wird festgelegt, ob der Typ auch in anderen Modulen benutzbar ist 
oder nur in dem aktuellen Modul.

Beispiel: TYPE-Anweisung
In diesem Beispiel vereinbaren wir einen neuen Typ KomplexeZahl, der als Daten den Real- und Imaginärteil enthält.

TYPE KomplexeZahl
     Realteil AS Single
     Imaginärteil AS Single
END TYPE

Beispiel: Zugriff auf Elemente eines Records

Der Zugriff auf einzelne Elemente einer Variable dieses Datentyps erfolgt durch den Selektor '.' Variablenname.Elementname. So wird unten der Real- und Imaginärteil einer Variablen z vom Typ KomplexeZahl gesetzt.

z.Realteil = 120.3
z.Imaginärteil = 454.1

Variablenvereinbarung

Die Variablendeklaration hat die Aufgabe, dem Compiler/Interpreter mitzuteilen, dass man eine Variable mit dem angegebenen Namen und dem festgelegten Typ ab sofort im kommenden Code-Abschnit benutzen will. Dieser kann nun entsprechend viel Platz im Speicher, d.h. im Allgemeinen auf dem Stack, anfordern.
In welchem Programmbereich die Variable nun gilt, ist verschieden. Theoretisch kann sie nur in der aktuellen Prozedur oder aktuellen Funktion, innerhalb des Moduls, der Klasse oder im gesamten Programm gelten. Aber dazu mehr im Abschnitt 1.1.5 Gültigkeitsbereich.

Eigentlich muss man in Standard-Basic keine Variablen vereinbaren. Man sollte sich aber angewöhnen, alle Variablen zu vereinbaren. Mit OPTION EXPLICIT im Deklarationsabschnitt kann man die Variablendeklaration erzwingen, d.h. nicht vereinbarte Variablen erzeugen einen Fehler. Der Vorteil bei der erzwungenen Deklaration ist, dass man bei einem Tippfehler in einem Variablennamen eine Fehlermeldung bekommt, und diese nicht - wie sonst - als neue Variable aufgefasst wird.

Die Variablendeklaration hat die folgende Syntax:

DIM Variablenname[([Indizes])][AS [New] Typ]
[, Variablenname[([Indizes])][AS [New] Typ]] 

Der Variablenname muss wieder ein gültiger Bezeichner, Typ ein gütiger Datentyp sein. Die Indizes werden zur Deklaration von Arrays verwendet (s.unten).

Beispiel: Variablenvereinbarung mit DIM
Um eine Variable x vom Typ Integer und s vom Typ String zu deklarieren nimmt man folgenden Code:

DIM x AS INTEGER
DIM s AS STRING

Records, die zusammengesetzten Datentypen, können auf gleiche Weise vereinbart werden.

Neben den Records gibt es noch die Möglichkeit Arrays zu vereinbaren. Arrays sind ein- oder mehrdimensionale Felder (Vektoren oder Matrizen) bestehend aus einer festen Zahl von Elementen gleichen Datentyps. Sie enthalten also homogene Daten, während Records ja aus vollkommen unterschiedlichen Datentypen zusammengesetzt sein können.
Zur Vereinbarung von Arrays wird zwischen dem Variablennamen und der AS Klausel in Klammern ein- oder mehrdimensionale Arraygrenzen festgelegt. Die Anzahl der Dimensionen eines Arrays kann theoretisch 60 betragen.

Die Syntax für die Arraygrenzen ist:

[Untergrenze TO] Obergrenze [,[Untergrenze TO] Obergrenze] . . .

Die Angabe Untergrenze kann entfallen. Dann wird standardmäßig 0 als Untergrenze genommen. Mit der OPTION BASE Anweisung kann man diesen Standardwert auch auf 1 setzen.

Beispiel: Deklaration eines Arrays
Im folgenden Beispiel definieren wir einen Vektor mit drei Komponenten (0 bis 2), eine 11x11 Matrix und ein 64x64 Felder großes Schachbrett.

DIM Vektor (2) AS SINGLE
DIM Matrix (0 TO 10, 0 TO 10) AS SINGLE
DIM Schachbrett (1 TO 64, 1 TO 64) AS INTEGER

Zur Laufzeit kann man die Unter- und Obergrenze eines Arrays beliebiger Dimension durch die Funtkionen LBOUND und UBOUND bestimmen.

Syntax von LBOUND und UBOUND

LBOUND (Array[, Dimension])
UBOUND (Array[, Dimension])

Dabei ist Array ein Variablename eines deklarierten Arrays und Dimension gibt die Nummer der fraglichen Dimension an. Für die erste Dimension muss 1, für die zweite 2, usw. angegeben werden. Wird die Dimension weggelassen, so wird standardmäßig die erste Dimension angenommen.

Beispiel: Unter- und Obergrenze eines Arrays bestimmen
Es sei der folgende Array vereinbart:

DIM a (3 TO 7, 0 TO 4, 1 TO 10) AS INTEGER

Die Funktionen ergeben dann:

Dimension Untergrenze LBOUND Obergrenze UBOUND
1

LBOUND (a, 1) = 3

UBOUND (a, 1) = 7

2

LBOUND (a, 2) = 0

UBOUND (a, 2) = 4

3

LBOUND (a, 3) = 1

UBOUND (a, 3) = 10



Variablenzuweisung

Im Gegensatz zu Variablendaklaration ist die Variablenzuweisung oder auch Variablendefinition dafür zuständig, Werte an bereits vereinbarte Variablen zuzuweisen. Der Zuweisungsoperator ist dabei das Istgleich-Zeichen '='. Wie schon erwähnt werden Elemente eines Records über den Selektor '.' angesprochen, einzelne Elemente eines Arrays werden durch Angabe eines ein- oder mehrdimensionalen Index angesprochen.
Die Syntax der Zuweisung ist:

[Variablenname] = [Wert]

Beispiel: Variablenzuweisung

DIM x AS INTEGER, s AS STRING, a (10,20) AS SINGLE
x = 25
s = "HALLO, WORLD!"
a(0,0) = 2.0

Strings werden also auch mit Hilfe des Zuweisungsoperators definiert! 
Zu beachten ist, dass der Zuweisungsoperator identisch mit dem Vergleichsoperator ist! 
Vgl. dazu den nächsten Abschnitt.

Beispiel: Zugriff auf ein Array
In diesem Beispiel wird für einen Array v (mit den Grenzen 0 bis 2), der einen Vektor darstellt, die Länge berechnet. Sqr(x) ist dabei die Quadratwurzel der Zahl x und ^ ist der Operator für die Potenzierung (vgl. nächster Abschnitt). Auf die einzelnen Komponenten wird mit v(i) zugegriffen.

DIM v(2) AS SINGLE
DIM length AS SINGLE

length = sqr(v(0)^2 + v(1)^2 + v(2)^2)

Operatoren

Visual Basic bietet eine Reihe von Operatoren, die sich folgendermaßen einteilen lassen:

Arithmetische Operatoren
- Addition
- Subtraktion
* Multiplikation
/ Division
\ Ganzzahldivision
MOD Modulo-Operator (Rest bei Ganzzahldivision)
^ Exponentiation (Potenzierung)
AND Bitweises Und
OR Bitweises Oder
XOR Bitweises exklusives Oder


Bemerkung:
Für Ganzzahldivision und Modulo gilt : Ist x = a \ b, so ist a = x * b + a mod b. Bei den Verknüpfungen AND, OR, XOR werden die gleichnamigen logischen Operatoren bitweise auf die Operanden durchgeführt.

Beispiel: Modulo-Arithmetik
Folgendes Beispiel diene zur Veranschaulichung der Modulo-Arithmetik.

23 / 5 = 4 und 23 mod 5 = 3, also 23 = 4 * 5 + 23 mod 5.

Vergleichs-Operatoren

  Istgleich
< echt kleiner
> echt größer
<= kleiner gleich
>= größer gleich

Syntax
ergebnis = Ausdruck1 Vergleichsoperator Ausdruck2
ergebnis = objekt1 Is objekt2
ergebnis = string Like muster

wobei gilt:
ergebnis  Eine numerische Variable. Sinnvollerweise eine boolesche Variable.
Ausdruck  Zwei beliebige Audruck gleichen Datentyps
object    Ein Objektname
string    Eine beliebige Zeichenfolge
Muster    Eine beliebige Zeichenfolge

Werden zwei Ausdrücke verschiedenen Typs verwendet, so wird - falls möglich - eine implizite Datentyp-Umwandlung vorgenommen.

String-Operatoren
  Zuweisung
= Vergleich
< kleiner
> größer
<= kleiner gleich
>= größer gleich
+ oder & Verkettung von Zeichenketten


Bei der Verkettung (Konkatenation) von Zeichenketten sollte der Operator '&' bevorzugt werden, da dieser nicht mit dem Additionsoperator verwechselt werden kann.

Logische Operatoren
Operator Bedeutung In Zeichen Ist TRUE genau dann, wenn
AND Und A AND B sowohl A und B TRUE sind.
OR Oder A OR B A oder B oder beide TRUE sind.
XOR Exklusives Oder A XOR B entweder A oder B, aber nicht beide TRUE sind.
NOT Logische Nicht NOT A A FALSE ist
IMP Implikation A IMP B A gilt, so ist auch B TRUE.
EQV Äquivalenz A EQV B A genau dann gilt, wenn B gilt.


Zuweisungs-Operatoren

Den Zuweisungsoperator hatten wir bereits:
= Zuweisung


Man beachte, dass Zuweisungs- und Vergleichsoperator identisch sind (!). Das hat zur Folge, dass beispielsweise die Anweisung A = B = C für boolesche Variablen A, B, C nicht A und B auf den Wert der Variablen C setzt, sondern dass A genau dann TRUE ist, wenn B und C identische Werte enthalten. D.h. das erste Istgleich ist der Zuweisungsoperator, das zweite der Vergleichsoperator. Siehe auch das Beispiel unten.

Beispiel: Zuweisung und Vergleich

b = (y = 3)
Dies wird folgendermaßen interpretiert : (y = 3) wird als Vergleich aufgefasst, 
so dass dem x ein boolescher Wert zugewiesen wird.

z = 9 / 2 
Der Variablen z wird die Zahl 4.5 zugewiesen.

x = 9 \ 2 
Der Variablen x wird die Zahl 4 zugewiesen (Ganzzahl-Division).

Werden mehrere Operatoren in einem Ausdruck ohne Klammerung verwendet werden, werden zuerst arithmetische, dann Vergleichs- und schließlich logische Operationen ausgeführt. Innerhalb der Kategorien werden die Operationen in der folgenden Reihenfolge ausgeführt:

Arithmetische Operatoren:
Potenzierung (^), Negation (-), Multiplikation und Division (* und /), Ganzzahl-Division (\), Modulo-Artihmetik (Mod), Addition (+ und -)
Vergleichs-Operatoren:
Gleichheit (=), Ungleich (< >), Kleiner (<), Größer (>), Kleiner gleich (=<), Größer gleich (>=)
Logische Operatoren:
Negation (NOT), Konjunktion (AND), Disjunktion (OR), Exklusives Oder (XOR), Äquivalenz (EQV), Implikation (IMP)

Gültigkeitsbereich

Der Gültigkeitsbereich einer Variablen ist davon abhängig, wo sie deklariert ist und ob sich 
irgendwelche Prädikate vor der Vereinbarung befinden.
Eine Variable, die in einer Prozedur oder einer Funktion deklariert sind, sind grundsätzlich lokal, 
also auch nur in dieser Funktion/Prozedur verwendbar. Deklarationen im Bereich 'declarations' 
eines Moduls sind modulspezifisch. 
Steht vor einer modulspezifischen Deklaration das Schlüsselwort GLOBAL kann die Variable 
überall im Programm angesprochen werden.

Zu Klassen und deren Deklarationen kommen wir im Kapitel für Klassen und Objekte.

Beispiel: Globale und lokale Variablen
In einer Prozedur oder Funktion würde eine lokale Variable vereinbart, im Bereich "declarations" eines Moduls würde eine modulspezifische Variable vereinbart.

DIM x AS INTEGER

Folgende Anweisung (im Bereich "declarations" eines Moduls) vereinbart eine globale Variable.

GLOBAL x AS INTEGER

Mathematische Funktionen

Visual Basic besitzt eine Reihe von mathematischen Funktionen. Die Syntax ist dabei stets die gleiche. 
Im Folgenden stehe F für den Funktionsnamen. x ist eine numerische Variable. 
Bei besonderen Voraussetzungen an x (z.B. x > 0) wird dies in der Einzelbesprechung separat behandelt.

F(x)

Beispiele sind zu jeder Funktion separat aufgeführt.
Bei den trigonometrischen Funktionen ATN, COS, SIN und TAN werden Winkel stets im Bogenmaß angegeben. 
Dieser liegt dann im Bereich -2*PI und +2*PI, während ein Winkel in Grad zwischen 0° und 360° liegt.
Zur Umwandlung eines Winkels ALPHA im Gradmaß in einen Winkel X im Bogenmaß und umgekehrt 
gelten die folgenden Formeln, wobei PI die Kreiszahl ist (PI ist ungefähr 3.1415926535897932):
X = ALPHA * PI /180
ALPHA = X * 180 / PI

Absolutbetrag: ABS

ABS liefert den Absolutbetrag einer Zahl. Für positive x ist ABS(x) = x, für negative x ist ABS(x) = -x
Beispielsweise wird durch
x = ABS(-123.66)
x = ABS(123.66)
in beiden Fällen x auf 123.66 gesetzt.

Arcus Tangens: ATN
ATN berechnet den Arcus Tangens von x. Der Arcus Tangens ist die Umkehrfunktion zum Tangens. Das Ergebnis ist dabei ein Winkel im Bogenmaß.
PI = 4*ATN(1)
Mit Hilfe von ATN wurde hier PI ausgerechnet, denn ATN(1) liefert PI/4 zurück. Siehe dazu auch das Beispiel zu TAN.

Cosinus: COS
COS liefert den Cosinus von x, wobei x im Bogenmaß gegeben sein muss. Der Cosinus berechnet dabei das Verhältnis zwischen Ankathete und Hypothenuse in einem rechtwinkligen Dreieck. Das Ergebnis liegt stets zwischen -1 und 1.
PI = 3.1415926535897932 
a = COS(0)
b = COS(PI/4)

In diesem Beispiel ist a = 1 und b = 0. Vgl. dazu auch den Sinus.

Exponentialfunktion: EXP
Die Exponentialfunktion EXP berechnet ex, wobei e die Eulersche Zahl ist (e ist ungefähr 2.718282). Das Ergebnis ist stets positiv. Die Umkehrfunktion zu EXP ist der Logarithmus LOG
a = EXP(0)
e = EXP(1)
In diesem Beispiel ist a = 1 und e ist die Eulersche Zahl.

Floor-Funktion: FIX
Die FIX Funktion liefert die größte ganze Zahl z mit z < x. In der Mathematik ist das die sogenannte Floor-Funktion oder auch manchmal Gaußsche Klammer.
z1 = FIX(12.5)
z2 = FIX(-12.5)
In diesem Beispiel setzt z1 = 12 und z2 = -13. Man beachte den Unterschied zur INT Funktion!

Ganzzahlanteil: INT
Die INT Funktion schneidet von einer reellen Zahl die Nachkommastellen ab und liefert diese Zahl zurück.
z1 = INT(12.5)
z2 = INT(-12.5)
In diesem Beispiel setzt z1 = 12 und z2 = -12. Zu beachten ist der Unterschied zur FIX Funktion!

Natürlicher Logarithmus: LOG
LOG berechnet den Logaritmus zur Basis e (die Eulersche Zahl, e ist ungefähr 2.718282). Dies ist der sogenannte natürliche Logarithmus. Es sind nur positive Argumente erlaubt.
a = LOG(EXP(x))
Durch diese Anweisung ist a = x gesetzt worden, da LOG die Umkehrfunktion von EXP ist. Wird ein Logarithmus zu einer anderen Basis n benötigt, so wird dieser durch folgende Funktion berechnet:

FUNCTION Logn(x)
   logn = LOG(x) / LOG(n)
EXIT FUNCTION

Zufallszahl: RND

RND liefert eine (Pseudo-)Zufallszahl zurück, die größer oder gleich 0 und echt kleiner als 1 ist. Das Argument x hat dabei eine besondere Bedeutung.
Ist x < 0, so liefert RND stets die gleiche Zufallszahl.
Ist x = 0, so liefert RND die letzte Zufallszahl.
Ist x > 0 oder wird x weggelassen, so wird die nächste Zufallszahl in der Folge von Zahlen zurückgegeben.
Um "zufällige" Werte zu erhalten, sollte man den Zufallszahlengenerator zu Beginn mit RANDOMIZE TIMER mit einem zufälligen Startwert (nämlich mit Hilfe der aktuellen Zeit) initialisieren.
Int((Obergrenze - Untergrenze + 1) * RND + Untergrenze)
Diese Anweisung liefert eine Ganzzahl zwischen den angegebenen Grenzen.

Vorzeichenfunktion (Signum): SGN
SGN liefert je nach Vorzeichen des Arguments x die Werte -1 (für x < 0), 0 (für x = 0) oder +1 (für x > 0).
a = x * SGN(x)
Diese Anweisung hat die gleiche Wirkung wie a = ABS(x).

Sinus: SIN
SIN liefert den Sinus von x, wobei x im Bogenmaß gegeben sein muss. Der Sinus berechnet dabei das Verhältnis zwischen Gegenkathete und Hypothenuse in einem rechtwinkligen Dreieck. Das Ergebnis liegt stets zwischen -1 und +1.
PI = 3.1415926535897932 
a = SIN(0)
b = SIN(PI/4)
In diesem Beispiel ist a = 0 und b = 1. Vgl. dazu auch den Cosinus

Quadratwurzel: SQR
Die Funktion SQR berechnet die positive Quadratwurzel einer nicht-negativen Zahl x. Für negative Argumente wird ein Fehler ausgelöst. Es gilt: SQR(x)^2 = x.
a = SQR(x)
b = a ^ 2
Die Variable b enthält den gleichen Wert wie x.

Tangens: TAN
Diese Funktion liefert den Tangens des Winkels x. Dabei muss x im Bogenmaß angegeben werden. Das Ergebnis ist das Verhältnis Gegenkathete durch Ankathete in einem rechtwinkligen Dreieck, wobei der von Hypothenuse und Ankathete eingeschlossene Winkel x ist.
PI = 3.1415926535897932 
result = TAN(PI/4)
In diesem Beispiel wird 1 zurückgegeben, da die beiden Katheten bei x = PI/4 gleich lang sind.


String-Operationen

Viusal Basic bietet eine Reihe von Funktionen auf Strings an, die im Folgenden besprochen werden. 
Abschließend werden dazu noch ein paar Beispiele gegeben.
In diesem Abschnitt sei s stets eine Variable vom Typ String, a, p und l seien vom Typ Integer oder Long.

Länge eines Strings: LEN
Um die Länge eines Strings zu ermitteln, verwendet man die Funktion LEN. Die Syntax lautet folgendermaßen:
LEN(s)

ASCII-Code eines Zeichens: ASC

Um den ASCII-Code eines Zeichens zu erhalten, verwendet man die ASC Funktion. 
(ASCII ist eine Abkürzung für American Standard Code for Information Interchange).
ASC(s)
Dabei wird stets der ASCII-Code des ersten Zeichens zurückgegeben. Ist s leer, so wird ein Fehler ausgelöst. Der Rückgabewert liegt zwischen 0 und 255. (Eigentlich ist der ASCII-Code nur 7 Bit lang, liegt also zwischen 0 und 127. Von der Funktion wird der in Windows übliche ANSI-Code zurückgegeben. ASCII und ANSI stimmen zwischen 0 und 127 überein. ANSI ist also eine Erweiterung von ASCII.)

Zeichen mit bestimmten ASCII-Code: CHR
Ist a eine Zahl zwischen 0 und 255 kann mit Hilfe der CHR Funktion ein Zeichen mit dem ASCII-Code a erzeugt werden.
CHR(a)

Anfang eines Strings: LEFT

Die Funktion LEFT gibt das Anfangsstück eines Strings s zurück, wobei das Resultat die Länge l hat.
LEFT(s, l)
Ist l größer als die Länge von s, wird ganz s zurückgegeben.

Mittelteil eines Strings: MID
Die Funktion MID gibt das Mittelstück eines Strings s, das an Position p beginnt und die Länge l hat, zurück.
MID(s, p, l)
Ist p größer als die Länge von s, so ist das Ergebnis leer, überschreitet p+l die Stringlänge, so ist das Ergebnis ein entsprechend kürzeres Stück.

Ende eines String: RIGHT
Mit der Funktion RIGHT wird das Endstück eines Strings s zurückgegeben, das die Länge l hat.
RIGHT(s, l)
Ist p größer als die Länge von s, so ist das Ergebnis ein entsprechend kürzeres Stück.

Erzeugen von Leerstrings: SPACE
Mit Hilfe der SPACE Funktion kann man einen String der Länge l erzeugen, der nur aus Leerzeichen besteht.
SPACE(l)
Eine Verallgemeinerung dieser Funktion ist die nun folgende STRING Funktion.

Erzeugen eines Strings eines festen Zeichens: STRING
Um einen String der Länge l, der nur aus einem festen Zeichen besteht (das nicht notwendigerweise das Leerzeichen ist), benutzt man die STRING Funktion.
STRING(l, a)
STRING(l, s)
Im ersten Fall wird der ASCII-Code des Zeichens übergeben. Im zweiten Fall ist das letzte Argument ein String. Das Ergebnis ist dann ein String der Länge l, der nur aus dem ersten Zeichen des Strings s besteht.

Trimmen eines Strings: TRIM, LTRIM, RTRIM
Das Entfernen von führenden und/oder abschließenden Leerzeichen und Tabulatoren nennt man (links-, rechts-, beidseitiges) Trimmen. Für das Trimmen von Strings verwendet man die Funktionen TRIM (beidseitig), LTRIM (linksseitig) und RTRIM (rechtsseitig).
TRIM(s),  LTRIM(s),  RTRIM(s)

Beispiele: String-Operationen
Die folgenden Beispiele demonstrieren den Umgang mit den String-Operationen LEN, LEFT, MID und RIGHT.

DIM s1 AS STRING, s2 AS STRING, s3 AS STRING, s4 AS STING
DIM l AS INTEGER
s1 = "1234567890"
' Die Länge l ist 10    l = LEN(s1)
' s2 wird zu "123"    s2 = LEFT(s1, 3)
' s3 wird zu "456"    s3 = MID(s1, 4, 3)
' s4 wird zu "890"    s4 = RIGHT(s1, 3)