Vermeiden von Namenskonflikten

Ein Namenskonflikt tritt auf, wenn Sie einen Bezeichner erstellen oder verwenden möchten, der von Visual Basic als bereits definiert erkannt wurde. In einigen Fällen können Namenskonflikte zu Fehlermeldungen wie "Mehrdeutiger Name" oder "Mehrfachdeklaration im aktuellen Gültigkeitsbereich" führen. Namenskonflikte können aber auch unbemerkt bleiben und zu Fehlern im Code sowie zu falschen Programmergebnissen führen, insbesondere, wenn Sie nicht alle Variablen vor der ersten Verwendung explizit deklarieren.

Die meisten Namenskonflikte können beseitigt werden, wenn Sie das Konzept der Gültigkeitsbereiche von Bezeichnern für Daten, Objekte und Prozeduren verstanden haben. In Visual Basic gibt es drei Ebenen für Gültigkeitsbereiche: Prozedurebene, private Modulebene und öffentliche Modulebene.

Namenskonflikten können in den folgenden Situationen auftreten:

•	Wenn auf einen Bezeichner aus mehreren Gültigkeitsbereichen zugegriffen werden kann.

•	Wenn ein Bezeichner zwei verschiedene Bedeutungen in demselben Gültigkeitsbereich hat.

Prozeduren können z.B. in verschiedenen Modulen denselben Namen haben. Eine Prozedur mit dem Namen Sub1 kann daher in den Modulen Mod1 und Mod2 definiert werden. Wenn die Prozeduren aus den jeweils zugehörigen Modulen aufgerufen werden, treten keine Konflikte auf. Es kann jedoch zu einem Fehler kommen, wenn Sub1 aus einem dritten Modul aufgerufen wird und eine explizite Kennzeichnung zur Unterscheidung der beiden Sub1-Prozeduren fehlt.

0	Die meisten Namenskonflikte können behoben werden, indem Sie dem Namen eine genaue Kennzeichnung voranstellen, die den Modulnamen und, falls benötigt, einen Projektnamen enthält. Beispiel:

EinProjekt.EinModul.EineSub Projekt1.Modul1.Var1

Im diesem Code wird die Sub-Prozedur EineSub aufgerufen, wobei Var1 als Argument übergeben wird. Sie können die Kennzeichner beliebig kombinieren, solange die Unterscheidung gleicher Bezeichner gewährleistet ist.

0	Visual Basic ordnet jedem Verweis auf einen Bezeichner die "nächstliegende" Deklaration eines übereinstimmenden Bezeichners zu. Wenn MeineID z.B. in zwei Modulen eines Projekts (Mod1 und Mod2) als Public deklariert ist, können Sie auf die in Mod2 deklarierte Variable mit dem Namen MeineID ohne explizite Kennzeichnung aus Mod2 zugreifen, müssen die Variable aber explizit (als Mod2.MeineID) kennzeichnen, um darauf aus Mod1 zuzugreifen. Das gilt auch, wenn sich Mod2 in einem anderen, direkt referenzierten Projekt befindet. Befindet sich Mod2 allerdings in einem indirekt referenzierten Projekt, so muß die darin enthaltene Variable MeineID in Referenzen stets explizit mit dem Projektnamen gekennzeichnet werden. Wenn Sie auf MeineID aus einem dritten, direkt referenzierten Modul zugreifen, wird die erste Deklaration verwendet, die bei der Suche in folgenden Bereichen gefunden wird:

•	Direkt referenzierte Projekte in der Reihenfolge, in der sie im Menü Extras im Dialogfeld Verweise angezeigt werden.

•	Die Module der einzelnen Projekte. (Dabei gibt es keine festgelegte Reihenfolge der Module innerhalb des Projekts.)

Namen von Objekten der Host-Anwendung (z.B. R1C1 in Microsoft Excel) können nicht in verschiedenen Gültigkeitsbereichen mehrmals verwendet werden.

Tip   Typische Fehler, die aufgrund von Namenskonflikten auftreten, sind mehrdeutige Namen, doppelte Deklarationen, nichtdeklarierte Bezeichner und nichtgefundene Prozeduren. Sie können Namenskonflikte und Fehler im Zusammenhang mit Bezeichnern vermeiden, indem Sie jedes Modul mit der Anweisung Option Explicit beginnen. Damit erzwingen Sie die explizite Deklaration von Variablen, bevor sie verwendet werden.


Aufrufen von Prozeduren mit dem gleichen Namen

Sie können eine Prozedur in einem beliebigen Modul, das sich in demselben Projekt befindet wie das aktive Modul, genauso aufrufen wie eine Prozedur im aktiven Modul. Sie müssen jedoch einen Modulnamen in der aufrufenden Anweisung angeben, wenn zwei oder mehr Module eine Prozedur mit demselben Namen enthalten. Beispiel:

Sub Main()

0	Modul1.MeineProzedur

1	End Sub

Wenn Sie den gleichen Namen an zwei unterschiedliche Prozeduren in zwei unterschiedlichen Projekten vergeben, müssen Sie beim Aufruf dieser Prozedur einen Projektnamen angeben. Die folgende Prozedur ruft z.B. die Prozedur Main im Modul Modul1 des Projekts Projekt1.vbp auf.

Sub Main()

0	[Projekt1.vbp].[Modul1].Main

1	End Sub

Anmerkung   Verschiedene Anwendungen verwenden unterschiedliche Namen für ein Projekt. Ein Projekt wird z.B. in Microsoft Access Datenbank (.MDB), in Microsoft Excel Arbeitsmappe (.XLS) genannt.

Tips zum Aufrufen von Prozeduren

•	Wenn Sie ein Modul oder ein Projekt umbenennen, achten Sie darauf, daß der Name des Moduls oder Projekts in allen aufrufenden Anweisungen geändert wird. Andernfalls kann Visual Basic die aufgerufene Prozedur nicht finden. Sie können im Menü Bearbeiten den Befehl Ersetzen verwenden, um Text in einem Modul zu suchen und zu ersetzen.

•	Um Namenskonflikte in referenzierten Projekten zu vermeiden, geben Sie Ihren Prozeduren eindeutige Namen, so daß Sie eine Prozedur ohne Angabe eines Projekts oder Moduls aufrufen können.


Aufrufen von Property-Prozeduren

Die folgende Tabelle zeigt die Syntax für den Aufruf von Property-Prozeduren:

Property Prozedur	Syntax
Property Let	[Objekt.]EigName(Argumente)] = Argument
Property Get	VarName = [Objekt.]EigName(Argumente)]
Property Set	Set [Objekt.]EigName[.(Argumente)] = VarName
Wenn Sie eine Property Let- oder Property Set-Prozedur aufrufen, muß sich immer ein Argument auf der rechten Seite des Gleichheitszeichens (=) befinden.

0	Wenn Sie eine Property Let- oder Property Set-Prozedur mit mehreren Argumenten deklarieren, übergibt Visual Basic das Argument der rechten Seite des Aufrufs an das letzte Argument in der Property Let- oder Property Set-Deklaration. Das folgende Diagramm z.B. zeigt, wie Argumente in der Property-Prozedur zu Argumenten in der Property Let-Deklaration in Beziehung stehen:

In der Praxis besteht die einzige Verwendung von Property-Prozeduren mit mehreren Argumenten in der Erstellung von Datenfeldern von Eigenschaften.


Aufrufen von Sub- und Function-Prozeduren

Damit Sie eine Sub-Prozedur aus einer anderen Prozedur aufrufen können, geben Sie den Namen der Prozedur sowie Werte für alle benötigten Argumente an. Die Call-Anweisung wird nicht benötigt. Wenn Sie sie jedoch verwenden, müssen Sie alle Argumente in Klammern angeben.

0	Sie können eine Sub-Prozedur verwenden, um andere Prozeduren anzuordnen, damit der Code verständlicher wird und einfacher zu überprüfen ist. Im folgenden Beispiel ruft die Sub-Prozedur Main die Sub-Prozedur MultiBeep auf und übergibt den Wert 56 für deren Argument. Nach Ausführung von MultiBeep wird die Steuerung wieder an Main zurückgegeben. Main ruft die Sub-Prozedur Meldung auf. Meldung zeigt ein Meldungsfeld, wenn der Benutzer auf OK klickt. Die Steuerung wird wieder an die Prozedur Main zurückgegeben, die daraufhin beendet wird.

Sub Main()

0	MultiBeep 56

1	Meldung

2	End Sub

3	Sub MultiBeep(Anzahl)

4	For Zähler = 1 To Anzahl

5	Beep

6	Next Zähler

7	End Sub

8	Sub Meldung()

9	MsgBox "Zeit für eine Pause!"

10	End Sub

Aufruf von Sub-Prozeduren mit mehr als einem Argument

Das folgende Beispiel zeigt zwei Möglichkeiten, eine Sub-Prozedur mit mehr als einem Argument aufzurufen. Beim zweiten Aufruf von Mietkosten müssen die Argumente in Klammern eingeschlossen werden, da die Call-Anweisung verwendet wird.

Sub Main()

0	Mietkosten 99800, 43100

1	Call Mietkosten (380950, 49500)

2	End Sub

3	Sub Mietkosten (Preis As Single, Einkommen As Single)

4	If 2.5 * Einkommen <= 0.8 * Preis Then

5	MsgBox "Dieses Haus ist viel zu teuer."

6	Else

7	MsgBox "Dieses Haus ist finanzierbar."

8	End If

9	End Sub

Verwenden von Klammern beim Aufruf von Function-Prozeduren

Damit Sie den Rückgabewert einer Funktion verwenden können, weisen Sie die Funktion einer Variablen zu, und schließen Sie die Argumente in Klammern ein. Beispiel:

Antwort3 = MsgBox("Sind Sie mit Ihrem Gehalt zufrieden?", 4, "Frage 3")

Wenn der Rückgabewert einer Funktion für Sie bedeutungslos ist, können Sie eine Funktion auf die gleiche Weise aufrufen, wie Sie eine Sub-Prozedur aufrufen. Lassen Sie die Klammern weg, listen Sie die Argumente auf, und weisen Sie die Funktion keiner Variablen zu. Beispiel:

MsgBox "Aufgabe erledigt!", 0, "Aufgabe-Dialogfeld"

Vorsicht   Wenn Sie im vorhergehenden Beispiel Klammern angeben, verursacht die Anweisung einen Syntax-Fehler.

Übergeben von benannten Argumenten

Eine Anweisung in einer Sub- oder Function-Prozedur kann Werte an aufgerufene Prozeduren unter Verwendung von benannten Argumenten übergeben. Sie können die benannten Argumente in beliebiger Reihenfolge auflisten. Ein benanntes Argument besteht aus dem Namen des Arguments gefolgt von einem Doppelpunkt und einem Gleichheitszeichen (:=) sowie einem dem Argumente zugewiesenen Wert.

0	In dem folgenden Beispiel wird die MsgBox-Funktion unter Verwendung von benannten Argumenten ohne Rückgabewert aufgerufen.

MsgBox Title:="Aufgabe-Dialogfeld", Prompt:="Aufgabe erledigt!"

In dem folgenden Beispiel wird die MsgBox-Funktion unter Verwendung von benannten Argumenten aufgerufen. Der Rückgabewert wird der Variablen Antwort3 zugewiesen.

Antwort3 = MsgBox(Title:="Frage 3", _

0	Prompt:="Sind Sie mit Ihrem Gehalt zufrieden?", Buttons:=4)


Erstellen von Objektvariablen

Sie können eine Objektvariable genauso behandeln wie das Objekt, auf das sie verweist. Sie können die Eigenschaften des Objekts festlegen oder zurückgeben oder eine seiner Methoden aufrufen.

0	So erstellen Sie eine Objektvariable:

1.	Deklarieren Sie die Objektvariable.

0	2.	Weisen Sie die Objektvariable einem Objekt zu.

Deklarieren einer Objektvariablen

Deklarieren Sie eine Objektvariable mit der Dim-Anweisung oder mit einer der anderen Deklarationsanweisungen (Public, Private oder Static). Eine Variable, die auf ein Objekt verweist, muß den Typ Variant, Object oder einen spezifischen Objekttyp haben. Die folgenden Deklarationen sind z.B. zulässig:

' Objekt1 als Variant deklarieren.

0	Dim Objekt1

1	' Objekt1 als allgemeines Objekt deklarieren.

2	Dim Objekt1 As Object

3	' Objekt1 als Font-Objekt deklarieren.

4	Dim Objekt1 As Font

Anmerkung   Wenn Sie eine Objektvariable verwenden, ohne sie vorher zu deklarieren, erhält sie standardmäßig den Datentyp Variant.

Die Deklaration einer Objektvariablen mit dem Datentyp Object bietet sich in Situationen an, in denen der spezifische Objekttyp vor dem Ausführen der Prozedur nicht bekannt ist. Mit dem Datentyp Object können Sie einen allgemeinen Verweis auf ein beliebiges Objekt erstellen.

0	Ist Ihnen der spezifische Objekttyp bekannt, auf den eine Objektvariable verweisen wird, dann sollten Sie die Objektvariable mit diesem Typ deklarieren. Wenn die von Ihnen verwendete Anwendung z.B. den Objekttyp "Sample" verwendet, können Sie eine Objektvariable für dieses Objekt mit einer der folgenden Anweisungen deklarieren:

Dim Objekt1 As Object	 	 ' Objekt1 als allgemeines

0	 ' Objekt deklarieren.

1	Dim Objekt1 As Sample	 	 ' Objekt1 lediglich als

2	 ' Sample deklarieren.

Die Deklaration spezifischer Objekttypen ermöglicht automatische Typüberprüfungen, der Code kann schneller ausgeführt werden und ist verständlicher.

Zuweisen einer Objektvariablen zu einem Objekt

Mit der Set-Anweisung weisen Sie einer Objektvariablen ein Objekt zu. Einer Objektvariablen kann ein Objektausdruck oder Nothing zugewiesen werden. Die folgenden Zuweisungen zu Objektvariablen sind z.B. zulässig:

Set Objekt1 = Objekt2	 	' Objektverweis zuweisen.

0	Set Objekt1 = Nothing	' Zuordnung beenden.

Sie können die Deklaration einer Objektvariablen mit der Zuweisung eines Objekts kombinieren, indem Sie das Schlüsselwort New mit der Set-Anweisung verwenden. Beispiel:

Set Objekt1 = Neues Objekt	' Erzeugen und zuweisen

Durch Festlegen einer Objektvariablen auf den Wert Nothing wird die Zuordnung eines bestimmten Objekts zu einer Objektvariablen beendet. Dadurch vermeiden Sie ein versehentliches Ändern des Objekts bei einer Veränderung der Variablen. Eine Objektvariable wird nach dem Schließen des Objekts, dem sie zugeordnet ist, immer auf Nothing festgelegt. Sie können daher leicht überprüfen, ob die Objektvariable auf ein gültiges Objekt verweist oder nicht. Beispiel:

If Not Objekt1 Is Nothing Then	' Variable verweist

0	' auf ein gültiges

1	' Objekt.

2	. . .

3	End If

Natürlich kann dieser Test niemals mit absoluter Sicherheit bestimmen, ob ein Benutzer die Anwendung geschlossen hat, die das Objekt enthält, auf das die Objektvariable verweist.

Verweisen auf die aktuelle Instanz eines Objekts

Mit dem Schlüsselwort Me verweisen Sie auf die aktuelle Instanz des Objekts, dessen Code momentan ausgeführt wird. Alle mit dem aktuellen Objekt verbundenen Prozeduren haben Zugriff auf das Objekt, auf das mit Me verwiesen wird. Die Verwendung von Me eignet sich besonders gut, um Informationen über die aktuelle Instanz eines Objekts an eine Prozedur in einem anderen Modul zu übergeben. Nehmen Sie z.B. an, daß die folgende Prozedur Teil eines Moduls ist:

Sub ÄndereObjektFarbe(Objekt1Name As Object)

0	Objekt1Name.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)

1	End Sub

Sie können dann die Prozedur aufrufen und die aktuelle Instanz des Objekts als Argument mit der folgenden Anweisung übergeben:

ÄndereObjektFarbe Me


Schreiben rekursiver Prozeduren

Prozeduren steht nur ein begrenzter Speicherplatz für Variablen zur Verfügung. Wenn eine Prozedur sich selbst aufruft, wird weiterer Speicherplatz verbraucht. Sich selbst aufrufende Prozeduren werden als rekursive Prozeduren bezeichnet. Eine rekursive Prozedur, die sich ständig selbst aufruft, löst schließlich einen Fehler aus. Beispiel:

Function EndlosFehler(Maximum)

0	EndlosFehler = EndlosFehler(Maximum)

1	End Function

Dieser Fehler kann auch versteckt in Erscheinung treten, wenn sich zwei Prozeduren permanent gegenseitig aufrufen oder wenn eine Abbruchbedingung für eine Rekursion niemals erfüllt ist. In manchen Situationen sind Rekursionen aber durchaus sinnvoll. Die folgende Prozedur ruft sich z.B. selbst auf, um Fakultäten zu berechnen:

Function Fakultät (N)

0	If N <= 1 Then	' Rekursionsende ist erreicht.

1	Fakultät = 1	' (N = 0) Keine weiteren Aufrufe.

2	Else ' Fakultät wird erneut aufgerufen

3	  ' wenn N > 0.

4	Fakultät = Fakultät(N - 1) * N

5	End If

6	End Function

Sie müssen eine rekursive Prozedur testen, um sicherzustellen, daß sie sich nicht zu oft aufruft und so einen Überlauffehler auslöst. Wenn es zu einem Fehler kommt, überprüfen Sie die Abbruchbedingung der Rekursion. Versuchen Sie dann, durch die folgenden Maßnahmen Speicher einzusparen:

•	Entfernen Sie überflüssige Variablen.

•	Vermeiden Sie, sofern möglich, die Verwendung des Datentyps Variant.

•	Überprüfen Sie die Logik der Prozedur erneut. Häufig können Sie anstelle einer Rekursion verschachtelte Schleifen verwenden.


Deklarieren von Datenfeldern

Datenfelder werden genauso wie andere Variablen mit Hilfe der Dim-, Static-, Private- oder Public-Anweisungen deklariert. Der Unterschied zwischen skalaren Variablen (Variablen, die keine Datenfelder sind) und Datenfeldvariablen besteht darin, daß Sie generell die Größe des Datenfelds angeben müssen. Ein Datenfeld, dessen Größe angegeben ist, ist ein Datenfeld fester Größe. Ein Datenfeld, dessen Größe bei Ausführung eines Programms geändert werden kann, ist ein dynamisches Datenfeld.

0	Ob ein Datenfeld mit 0 oder 1 beginnend indiziert ist, hängt von der Einstellung der Option Base-Anweisung ab. Wenn Option Base 1 nicht angegeben ist, beginnen alle Datenfelder mit dem Index Null.

Deklarieren eines festen Datenfelds

In der folgenden Code-Zeile wird ein Datenfeld fester Größe als Integer-Datenfeld mit 11 Zeilen und 11 Spalten deklariert:

Dim MeinDatenfeld(10, 10) As Integer

Das erste Argument stellt die Zeilen, das zweite Argument die Spalten dar.

0	Wie bei jeder anderen Variablendeklaration entspricht der Datentyp der Elemente in einem deklarierten Datenfeld dem Typ Variant, solange Sie keinen Datentyp für das Datenfeld angegeben haben. Jedes Variant-Element des Datenfelds verwendet 16 Bytes. Deklarieren Sie Ihre Datenfelder explizit mit einem Datentyp, der nicht Variant ist, um den Code so kompakt wie möglich zu machen. Die folgenden Code-Zeilen vergleichen die Größe verschiedener Datenfelder:

' Nachstehendes Datenfeld aus Elementen des Datentyps

0	' Integer beansprucht 22 Bytes (11 Elemente * 2 Bytes).

1	ReDim MeinIntegerDatenfeld(10) As Integer

2	' Nachstehendes Datenfeld aus Elementen des Datentyps

3	' Double beansprucht 88 Bytes (11 Elemente * 8 Bytes).

4	ReDim MeinDoubleDatenfeld(10) As Double

5	' Nachstehendes Datenfeld aus Elementen des Datentyps

6	' Variant beansprucht mindestens 176 Bytes (11 Elemente * 16 Bytes).

7	ReDim MeinVariantDatenfeld(10)

8	' Nachstehendes Datenfeld aus Elementen des Datentyps

9	' Integer beansprucht 100 * 100 * 2 Bytes (20.000 Bytes).

10	ReDim MeinIntegerDatenfeld (99, 99) As Integer

11	' Nachstehendes Datenfeld aus Elementen des Datentyps

12	' Double beansprucht 100 * 100 * 8 Bytes (80.000 Bytes).

13	ReDim MeinDoubleDatenfeld (99, 99) As Double

14	' Nachstehendes Datenfeld aus Elementen des Datentyps

15	' Variant beansprucht mindestens 160.000 Bytes (100 * 100 * 16 Bytes).

16	ReDim MeinVariantDatenfeld(99, 99)

Die maximale Größe eines Datenfelds hängt von Ihrem Betriebssystem sowie von dem verfügbaren Speicher ab. Durch die Verwendung eines Datenfeldes, das den für Ihr System verfügbaren RAM-Speicher überschreitet, wird Ihre Anwendung langsamer, da die Daten von der Festplatte gelesen und auf diese geschrieben werden müssen.

Deklarieren eines dynamischen Datenfeldes

Bei der Deklaration eines dynamischen Datenfelds können Sie die Größe des Datenfelds verändern, während der Code ausgeführt wird. Verwenden Sie zur Deklaration eines Datenfelds eine der Static-, Dim-, Private- oder Public-Anweisungen, und belassen Sie die Klammern leer. Beispiel:

Dim sngDatenfeld () As Single

Anmerkung   Sie können die ReDim-Anweisung dazu verwenden, ein Datenfeld implizit innerhalb einer Prozedur zu deklarieren. Achten Sie darauf, bei Verwendung der ReDim-Anweisung den Namen des Datenfelds richtig zu schreiben. Auch wenn sich die Option Explicit-Anweisung im Modul befindet, wird ein zweites Datenfeld erstellt.

Verwenden Sie in einer Prozedur innerhalb des Gültigkeitsbereichs des Datenfeldes die ReDim-Anweisung zur Änderung der Anzahl von Dimensionen, zur Definition der Anzahl der Elemente und zur Definition der oberen und unteren Grenzen jeder Dimension. Sie können die ReDim-Anweisung beliebig oft verwenden, um das dynamische Datenfeld zu ändern. Dies hat jedoch zur Folge, daß die bestehenden Werte des Datenfeldes verloren gehen. Verwenden Sie ReDim Preserve, um ein Datenfeld zu erweitern, ohne daß die vorhandenen Werte im Datenfeld gelöscht werden. Die folgende Anweisung vergrößert z.B. das Datenfeld varDatenfeld um 10 Elemente, ohne die aktuellen Werte der ursprünglichen Elemente zu löschen.

ReDim Preserve varDatenfeld (UBound(varDatenfeld) + 10)

Anmerkung   Wenn Sie das Schlüsselwort Preserve mit einem dynamischen Datenfeld verwenden, können Sie nur die obere Grenze der letzten Dimension, aber nicht die Anzahl der Dimensionen ändern.


Deklarieren von Konstanten

Durch die Deklaration einer Konstanten können Sie einem Wert einen aussagefähigen Namen zuweisen. Verwenden Sie die Const-Anweisung, um eine Konstante zu deklarieren und deren Wert festzulegen. Nachdem eine Konstante deklariert wurde, kann sie nicht mehr geändert werden, und es kann ihr kein neuer Wert zugewiesen werden.

0	Sie können eine Konstante innerhalb einer Prozedur oder zu Beginn eines Moduls im Deklarationsabschnitt deklarieren. Konstanten auf Modulebene sind standardmäßig privat. Stellen Sie der Const-Anweisung das Schlüsselwort Public voran, um eine öffentliche Konstante auf Modulebene zu deklarieren. Sie deklarieren eine private Konstante explizit, indem Sie der Const-Anweisung das Schlüsselwort Private voranstellen, womit Ihr Code einfacher zu lesen und zu interpretieren ist. Weitere Informationen finden Sie in der Visual Basic-Hilfe unter dem Thema "Gültigkeitsbereich".

1	In dem folgenden Beispiel wird die Public-Konstante conAlter als Integer deklariert und ihr der Wert 34 zugewiesen.

Public Const conAlter As Integer = 34

Konstanten können als einer der folgenden Datentypen deklariert werden: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String oder Variant. Da Sie den Wert einer Konstanten bereits kennen, können Sie den Datentyp in einer Const-Anweisung angeben. Weitere Information finden Sie in der Visual Basic-Hilfe unter dem Thema "Datentypen - Zusammenfassung".

0	Sie können mehrere Konstanten in einer Anweisung deklarieren. Wenn Sie einen Datentyp angeben, müssen Sie ihn für jede Konstante angeben. In der folgenden Anweisung werden die Konstanten conAlter und conEinkommen als Integer bzw. Currency deklariert.

Const conAlter As Integer = 34, conEinkommen As Currency = 35000


Deklarieren von Variablen

Zur Deklaration von Variablen verwenden Sie normalerweise eine Dim-Anweisung. Eine Deklarationsanweisung kann innerhalb einer Prozedur zur Erstellung einer Variablen auf Prozedurebene oder zu Beginn eines Moduls im Deklarationsabschnitt zur Erstellung einer Variablen auf Modulebene plaziert werden.

0	In dem folgenden Beispiel wird die Variable strName erstellt und der Datentyp String angegeben.

Dim strName As String

Ist diese Anweisung Teil einer Prozedur, so kann die Variable strName nur in dieser Prozedur verwendet werden. Befindet sich diese Anweisung im Deklarationsabschnitt des Moduls, so ist die Variable strName für alle Prozeduren innerhalb des Moduls, aber nicht für Prozeduren in anderen Modulen des Projekts verfügbar. Damit diese Variable für alle Prozeduren des Projekts verfügbar ist, stellen Sie ihr die Public-Anweisung voran. Beispiel:

Public strName As String

Weitere Informationen zur Benennung Ihrer Variablen finden Sie in der Visual Basic-Hilfe unter dem Thema "Namenskonventionen in Visual Basic".

0	Variablen können als einer der folgenden Datentypen deklariert werden: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String (für Zeichenfolgen variabler Länge), String * Länge (für Zeichenfolgen fester Länge), Object oder Variant. Wenn Sie keinen Datentyp angeben, wird der Datentyp Variant standardmäßig zugewiesen. Sie können auch einen benutzerdefinierten Typ über die Type-Anweisung erstellen. Weitere Informationen finden Sie in der Visual Basic-Hilfe unter dem Thema "Datentypen - Zusammenfassung".

1	Sie können mehrere Variablen in einer Anweisung deklarieren. Wenn Sie einen Datentyp angeben möchten, müssen Sie den Datentyp für jede Variable angeben. In der folgenden Anweisung werden die Variablen intX, intY und intZ als Integer deklariert.

Dim intX As Integer, intY As Integer, intZ As Integer

In der folgenden Anweisung werden intX und intY als Variant, und nur intZ als Integer deklariert.

Dim intX, intY, intZ As Integer

Sie müssen die Datentypen der Variablen in der Deklarationsanweisung nicht angeben. Wenn Sie den Datentyp nicht angeben, so wird die Variable auf den Typ Variant festgelegt.

Verwenden der Public-Anweisung

Sie können die Public-Anweisung zur Deklaration öffentlicher Variablen auf Modulebene verwenden.

Public strName As String

Öffentliche Variablen können in allen Prozeduren des Projekts verwendet werden. Wenn eine öffentliche Variable in einem Standardmodul oder einem Klassenmodul deklariert wird, kann diese auch in allen Projekten verwendet werden, die auf das Projekt verweisen, in dem die öffentliche Variable deklariert wurde.

Verwenden der Private-Anweisung

Sie können die Private-Anweisung zur Deklaration privater Variablen auf Modulebene verwenden.

Private MeinName As String

Private Variablen können nur von Prozeduren des gleichen Moduls verwendet werden.

Anmerkung   Wird die Dim-Anweisung auf Modulebene verwendet, gleicht sie der Private-Anweisung. Möglicherweise möchten Sie die Private-Anweisung verwenden, um die Lesbarkeit des Codes zu erhöhen und die Interpretation zu vereinfachen.

Verwenden der Static-Anweisung

Wenn Sie die Static-Anweisung anstelle einer Dim-Anweisung verwenden, so behält die deklarierte Variable ihren Wert zwischen Aufrufen.

Verwenden der Option Explicit-Anweisung

Sie können implizit eine Variable in Visual Basic deklarieren, indem Sie diese in einer Zuweisungsanweisung verwenden. Alle implizit deklarierten Variablen sind vom Typ Variant. Variablen des Typs Variant erfordern mehr Speicherressourcen als die meisten anderen Variablen. Ihre Anwendung ist effizienter, wenn Sie Variablen explizit und mit einem bestimmten Datentyp deklarieren. Das explizite Deklarieren aller Variablen verringert das Auftreten von Fehlern aufgrund von Namenskonflikten oder Schreibfehlern.

0	Wenn Sie in Visual Basic keine impliziten Deklarationen verwenden möchten, setzen Sie die Option Explicit-Anweisung in einem Modul vor alle anderen Prozeduren. Diese Anweisung erzwingt die explizite Deklaration aller Variablen innerhalb des Moduls. Enthält ein Modul die Option Explicit-Anweisung, so tritt ein Fehler zur Kompilierungszeit auf, wenn Visual Basic auf einen Variablennamen trifft, der noch nicht deklariert oder falsch geschrieben wurde.

1	Sie können eine Option in Ihrer Visual Basic-Programmierumgebung dahingehend einstellen, daß die Option Explicit-Anweisung in allen neuen Modulen automatisch verwendet wird. Weitere Informationen zur Änderung von Visual Basic-Umgebungsoptionen finden Sie in der Dokumentation Ihrer Anwendung. Beachten Sie, daß diese Option bereits geschriebenen Code nicht verändert.

Anmerkung   Sie müssen feste und dynamische Datenfelder explizit deklarieren.

Deklarieren einer Objektvariablen für die Automatisierung

Wenn Sie eine Anwendung verwenden, um die Objekte einer anderen Anwendung zu steuern, sollten Sie einen Verweis auf die Klassenbibliothek der anderen Anwendung festlegen. Wenn Sie den Verweis festgelegt haben, können Sie die Objektvariablen entsprechend ihres spezifischen Typs deklarieren. Wenn Sie z.B. in Microsoft Access einen Verweis auf die Microsoft Excel-Klassenbibliothek festlegen, können Sie eine Variable des Typs Worksheet in Microsoft Access deklarieren, um ein Worksheet-Objekt von Microsoft Excel darzustellen.

0	Wenn Sie eine andere Anwendung verwenden, um Microsoft Access-Objekte zu steuern, können Sie in den meisten Fällen die Objektvariablen mit ihrem spezifischen Typ deklarieren. Sie können auch das Schlüsselwort New verwenden, um eine neue Instanz eines Objekts automatisch zu erstellen. Sie müssen jedoch angeben, daß es sich um ein Microsoft Access-Objekt handelt. Wenn Sie z.B. eine Objektvariable deklarieren, um ein Microsoft Access-Formular innerhalb von Microsoft Visual Basic darzustellen, müssen Sie das Form-Objekt aus Microsoft Access von einem Form-Objekt aus Visual Basic unterscheiden. Geben Sie den Namen der Klassenbibliothek in der Variablendeklaration an. Beispiel:

Dim frmBestellungen As New Access.Form

Einige Anwendungen erkennen einzelne Microsoft Access-Objekttypen nicht. Auch dann, wenn Sie aus diesen Anwendungen einen Verweis auf die Microsoft Access-Klassenbibliothek festgelegt haben, müssen Sie alle Microsoft Access-Objektvariablen als Typ Object deklarieren. Sie können auch nicht das Schlüsselwort New verwenden, um eine neue Instanz des Objekts zu erstellen. Das folgende Beispiel zeigt, wie eine Variable deklariert werden muß, die eine Instanz des Microsoft Access-Application-Objekts darstellen soll, wenn einer Anwendung die Microsoft Access-Objekttypen nicht erkennt. Die Anwendung erstellt dann eine Instanz des Application-Objekts.

Dim appAccess As Object

0	Set appAccess = CreateObject("Access.Application")

Weitere Informationen dazu, welche Syntax von der Anwendung unterstützt wird, finden Sie in der Dokumentation der Anwendung.


Festlegen von Eigenschaften durch das Ausführen von Code

Sie können Property Let-, Property Set- und Property Get-Prozeduren erstellen, die den gleichen Namen verwenden. Auf diese Weise können Sie eine Gruppe zusammengehöriger Prozeduren erstellen, die miteinander verbunden sind. Sobald ein Name für eine Property-Prozedur verwendet wurde, kann dieser Name nicht mehr für eine Sub- oder Function-Prozedur, eine Variable oder einen benutzerdefinierten Typ verwendet werden.

0	Mit der Property Let-Anweisung können Sie eine Prozedur erstellen, die den Wert der Eigenschaft festlegt. Ein Beispiel könnte eine Property-Prozedur sein, die die Eigenschaft Invertiert für eine Bitmap in einem Formular erstellt. Folgende Syntax wird verwendet, um die Property Let-Prozedur aufzurufen:

Formular1.Invertiert = True

Die eigentliche Invertierung der Bitmap in dem Formular erfolgt innerhalb der Property Let-Prozedur:

Private IstInvers As Boolean

0	Property Let Invertiert(X As Boolean)

1	IstInvers = X

2	If IstInvers Then

3	…

4	(Anweisungen)

5	Else

6	(Anweisungen)

7	End If

8	End Property

Die Variable IstInvers auf Formularebene speichert die Einstellung Ihrer Eigenschaft. Durch die Deklaration als Private kann der Benutzer sie nur über Ihre Property Let-Prozedur ändern. Verwenden Sie einen Namen, der leicht erkennen läßt, daß die Variable für die Eigenschaft verwendet wird.

0	Diese Property Get-Prozedur wird zur Rückgabe des aktuellen Status der Eigenschaft Invertiert verwendet:

Property Get Invertiert() As Boolean

0	Invertiert = IstInvers

1	End Property

Mit Hilfe von Property-Prozeduren kann Code leicht zu dem Zeitpunkt ausgeführt werden, zu dem der Wert einer Eigenschaft festgelegt wird. Sie können Property-Prozeduren für folgende Operationen verwenden:

•	Um den Wert einer Eigenschaft zu ermitteln, bevor ein Eigenschaftswert festgelegt wird.

•	Nachdem der Eigenschaftswert festgelegt wurde, um den neuen Wert zu verarbeiten.


Verwenden von Schleifen in Code

Mit Hilfe bedingter Anweisungen und Schleifenanweisungen (auch Kontrollstrukturen genannt) können Sie Visual Basic-Code erstellen, der Entscheidungen trifft und bestimmte Aktionen wiederholt. Eine weitere nützliche Kontrollstruktur, die With-Anweisung, führt eine Reihe von Anweisungen aus, ohne daß ein Objekt erneut angegeben werden muß.

Verwenden von bedingten Anweisungen, um Entscheidungen zu treffen

Bedingte Anweisungen überprüfen, ob eine Bedingung True oder False ist, und legen dann eine oder mehrere Anweisungen fest, die in Abhängigkeit vom Ergebnis der Überprüfung ausgeführt werden sollen. Normalerweise ist eine Bedingung ein Ausdruck, der einen Vergleichsoperator für den Vergleich eines Wertes oder einer Variablen mit einem anderen Wert oder einer anderen Variablen verwendet.

Wählen der zu verwendenden bedingten Anweisung

•	If...Then...Else: Verzweigen, wenn eine Bedingung True oder False ist.

•	Select Case: Auswählen einer Verzweigung aus einer Gruppe von Bedingungen.

Verwenden von Schleifen zur Wiederholung von Code

Schleifen ermöglichen die wiederholte Ausführung einer Gruppe von Anweisungen. Einige Schleifen wiederholen Anweisungen, bis eine Bedingung dem Wert False entspricht, andere, bis eine Bedingung dem Wert True entspricht. Es gibt weiterhin Schleifen, die Anweisungen für jedes Objekt in einer Auflistung oder mit einer festgelegten Anzahl an Wiederholungen ausführen.

Wählen der zu verwendenden Schleife

•	Do...Loop: Ausführen der Schleife, wenn (oder solange bis) eine Bedingung dem Wert True entspricht.

•	For...Next: Verwenden eines Zählers, um Anweisungen mit einer festgelegten Anzahl an Wiederholungen auszuführen.

•	For Each...Next: Wiederholen einer Gruppe von Anweisungen für jedes Objekt in einer Auflistung.

Ausführen verschiedener Anweisungen für das gleiche Objekt

In Visual Basic müssen Sie normalerweise ein Objekt angeben, bevor Sie eine seiner Methoden ausführen oder eine seiner Eigenschaften ändern können. Sie können die With-Anweisung verwenden, um ein Objekt für eine ganze Folge von Anweisungen anzugeben.

•	With: Ausführen einer Folge von Anweisungen für das gleiche Objekt.


Optimieren von For...Next-Schleifen

Der Datentyp Integer benötigt nicht nur weniger Speicher als der Datentyp Variant, sondern Variablen dieses Typs lassen sich auch etwas schneller aktualisieren. Da Computer in der Regel mit einer sehr hohen Geschwindigkeit arbeiten, können Sie einen Unterschied normalerweise erst nach mehreren tausend Operationen feststellen. Beispiel:

Dim Hase As Integer	' Zähler vom Typ Integer.

0	For Hase = 0 to 32766

1	Next Hase

2	Dim Igel As Variant	' Zähler vom Typ Variant.

3	For Igel = 0 to 32766

4	Next Igel

Im ersten Fall wird etwas weniger Zeit für die Ausführung benötigt. Wenn Hase jedoch den Wert 32.767 übersteigt, tritt ein Fehler auf. Sie können den Fehler beheben, indem Sie Hase auf den Datentyp Long festlegen und so den Wertebereich für ganze Zahlen deutlich vergrößern. Allgemein gilt: Je kleiner der Datentyp, desto schneller kann er aktualisiert werden. Werte vom Typ Variant sind immer etwas langsamer als die ihnen entsprechenden Datentypen.


Effizientes Übergeben von Argumenten

Alle Argumente werden an Prozeduren als Referenz übergeben, sofern Sie nichts anderes festlegen. Dies ist effizient, weil Argumente, die als Referenz übergeben werden, unabhängig vom Datentyp des Arguments immer in derselben Zeit übergeben werden und immer die gleiche Menge Speicherplatz (4 Bytes) innerhalb einer Prozedur benötigen.

0	Sie können ein Argument als Wert übergeben, wenn Sie das Schlüsselwort ByVal in die Deklaration der Prozedur aufnehmen. Als Wert übergebene Argumente benötigen, abhängig vom Datentyp des Arguments, 2 - 16 Bytes innerhalb der Prozedur. Größere Datentypen benötigen im Vergleich zu kleineren Datentypen etwas länger, um als Wert übergeben zu werden. Aus diesem Grund sollten String- und Variant-Datentypen im allgemeinen nicht als Wert übergeben werden.

1	Bei der Übergabe eines Arguments als Wert wird die ursprüngliche Variable kopiert. Änderungen an dem Argument innerhalb der Prozedur haben keine Auswirkung auf die Originalvariable. Beispiel:

' Funktionsdeklaration.

0	Function Fakultät (ByVal Var1 As Integer)

1	Var1 = Var1 - 1

2	If Var1 = 0 Then

3	Fakultät = 1

4	Exit Function

5	End If

6	Fakultät = Fakultät(Var1) * (Var1 + 1)

7	End Function

8	' Aufrufen von Fakultät mit der Variable S.

9	S = 5

10	Print Fakultät(S)	' 120 anzeigen (= 5!)

11	Print S	' 5 anzeigen.

Ohne ByVal in der Funktionsdeklaration würden die vorangehenden Print-Anweisungen 1 und 0 anzeigen, da Var1 sich dann auf die Variable S beziehen würde, die um 1 reduziert wird, bis sie den Wert 0 hat.

0	Da ByVal eine Kopie des Arguments erstellt, kann ein Variant an die zuvor beschriebene Funktion Fakultät übergeben werden. Sie können einen Variant-Wert nicht als Referenz übergeben, wenn die Prozedur, die das Argument deklariert, einem anderen Datentyp entspricht.


Zurückgeben von Zeichenfolgen aus Funktionen

Einige Funktionen existieren in zwei Versionen: eine Version, die den Datentyp Variant zurückgibt, und eine andere Version, die den Datentyp String zurückgibt. In der Regel kann die Variant-Version einfacher eingesetzt werden, weil sie Umwandlungen zwischen verschiedenen Datentypen automatisch vornimmt. Weiterhin ermöglicht die Variant-Version die Weitergabe von Null durch einen Ausdruck. Die String-Version ist effizienter, da sie weniger Speicher benötigt.

0	Die Version, die den Typ String zurückgibt, bietet sich in folgenden Situationen an:

•	Wenn das Programm sehr umfangreich ist und viele Variablen verwendet.

•	Wenn Daten direkt in Dateien mit wahlfreiem Zugriff geschrieben werden sollen.

Die folgenden Funktionen geben Werte in einer Variablen vom Typ String zurück, wenn Sie ein Dollarzeichen ($) an die Funktionsnamen anfügen. Die Funktionen entsprechen hinsichtlich ihrer Verwendung und Syntax den Funktionen ohne Dollarzeichen mit dem Typ Variant.

Chr$	ChrB$	*Command$
CurDir$	Date$	Dir$
Error$	Format$	Hex$
Input$	InputB$	LCase$
Left$	LeftB$	LTrim$
Mid$	MidB$	Oct$
Right$	RightB$	RTrim$
Space$	Str$	String$
Time$	Trim$	UCase$
* Eventuell nicht in allen Anwendungen verfügbar.


Bedingte Kompilierung

Sie können die bedingte Kompilierung dazu verwenden, Code-Blöcke selektiv ausführen zu lassen, um beispielsweise mit Hilfe von Testanweisungen die Ausführungsgeschwindigkeit unterschiedlicher Lösungsansätze eines Programmiervorhabens zu vergleichen oder eine Anwendung in verschiedene Sprachen zu lokalisieren.

0	Sie deklarieren eine Konstante für die bedingte Kompilierung im Code mit der #Const-Anweisung, und Sie kennzeichnen Code-Blöcke für die bedingte Kompilierung mit der #If...Then...#Else-Anweisung. Das folgende Beispiel führt Test- oder Produktions-Code aus, basierend auf dem Wert der Variablen conTest.

' Öffentliche Konstante für die Kompilierung im

0	' Deklarationsabschnitt deklarieren.

1	#Const conTest = 1

2	Sub SelektiveAusführung()

3	#If conTest = 1 Then

4	.	' Ausführen von Code mit

5	' Testanweisungen.

6	.

7	.

8	#Else

9	.	' Ausführen von normalem Code.

10	.

11	.

12	#End If

13	End Sub


Lebensdauer von Variablen

Die Zeit, in der eine Variable ihren Wert behält, wird Lebensdauer genannt. Der Wert einer Variablen kann sich während ihrer Lebensdauer ändern, sie behält aber irgendeinen Wert. Verläßt eine Variable ihren Gültigkeitsbereich, so verfügt sie über keinen Wert mehr.

0	Wenn eine Prozedur ausgeführt wird, werden alle Variablen initialisiert. Eine numerische Variable wird mit Null initialisiert, eine Zeichenfolge variabler Länge wird mit einer Null-Zeichenfolge ("") initialisiert und eine Zeichenfolge fester Länge wird mit dem ASCII-Zeichen 0 oder Chr(0) gefüllt. Variant-Variablen werden mit Empty initialisiert. Jedes Element einer Variablen eines benutzerdefinierten Typs wird so initialisiert, als wäre es eine separate Variable.

1	Wenn Sie eine Objektvariable deklarieren, wird Platz im Speicher reserviert, der Wert der Objektvariablen wird aber auf Nothing gesetzt, bis Sie ihr mit der Set-Anweisung einen Objektverweis zuweisen.

2	Wenn der Wert der Variablen während der Ausführung Ihres Codes nicht verändert wird, behält sie ihren initialisierten Wert, bis sie ihren Gültigkeitsbereich verläßt.

3	Eine auf Prozedurebene mit der Dim-Anweisung deklarierte Variable behält einen Wert, bis die Ausführung der Prozedur beendet wird. Ruft die Prozedur andere Prozeduren auf, behält die Variable während der Ausführung dieser Prozeduren ihren Wert.

4	Wird eine Variable auf Prozedurebene mit dem Schlüsselwort Static deklariert, behält die Variable ihren Wert so lange, wie Code in einem beliebigen Modul ausgeführt wird. Wenn die Ausführung des gesamten Codes beendet wird, verliert die Variable ihren Gültigkeitsbereich und ihren Wert. Ihre Lebensdauer entspricht der Lebensdauer einer Variablen auf Modulebene.

5	Eine Variable auf Modulebene unterscheidet sich von einer statischen Variablen. In einem Standardmodul oder einem Klassenmodul behält sie ihren Wert, bis die Ausführung des Codes angehalten wird. In einem Klassenmodul behält sie ihren Wert, solange eine Instanz der Klasse existiert. Variablen auf Modulebene benötigen Speicherressourcen, bis Sie deren Werte zurücksetzen; darum sollten Sie diese nur dann verwenden, wenn es unbedingt notwendig ist.

Wenn Sie das Schlüsselwort Static vor einer Sub- oder Function-Anweisung verwenden, werden die Werte aller Variablen auf Prozedurebene in der Prozedur zwischen Aufrufen beibehalten.


Benannte und optionale Argumente

Beim Aufruf von Sub- oder Function-Prozeduren können Sie Argumente in der Reihenfolge, in der sie in der Prozedurdefinition auftreten, oder über den Namen und ungeachtet der Position bereitstellen.

0	Die folgende Sub-Prozedur benötigt z.B. drei Argumente:

Sub PassArg(strName As String, intAlter As Integer, gebDatum As Date)

0	Debug.Print strName, intAlter, gebDatum

1	End Sub

Sie können diese Prozedur aufrufen, indem Sie ihre Argumente an der korrekten Position, jeweils getrennt durch ein Komma, angeben. Beispiel:

PassArg "Maria", 26, #2-21-69#

Sie können diese Prozedur auch über die Angabe von benannten Argumenten, jeweils getrennt durch ein Komma, aufrufen.

PassArg intAlter:=26, gebDatum:=#2/21/69#, strName:="Maria"

Ein benanntes Argument enthält einen Argumentnamen, gefolgt von einem Doppelpunkt, einem Gleichheitszeichen (:=) und dem Argumentwert.

0	Benannte Argumente sind besonders dann nützlich, wenn Sie eine Prozedur aufrufen, die über optionale Argumente verfügt. Wenn Sie benannte Argumente verwenden, müssen Sie keine Kommas für fehlende Argumente angeben. Mit benannten Argumenten können Sie leichter nachvollziehen, welche Argumente Sie übergeben und welche Sie nicht angegeben haben.

1	Optionalen Argumenten geht das Schlüsselwort Optional in der Prozedurdefinition voraus. Sie können ebenso einen Standardwert für das optionale Argument in der Prozedurdefinition angeben. Beispiel:

Sub OptionaleArg(strPLBereich As String, Optional strLand As String = "Deutschland")

0	. . .

1	End Sub

Wenn Sie eine Prozedur mit einem optionalen Argument aufrufen, können Sie wählen, ob Sie das optionale Argument angeben möchten oder nicht. Geben Sie das optionale Argument nicht an, so wird der Standardwert, falls vorhanden, verwendet. Ist kein Standardwert angegeben, entspricht das Argument einer Variablen des angegebenen Typs.

0	Die folgende Prozedur schließt ein optionales Argument, die Variable varLand, ein. Die IsMissing-Funktion bestimmt, ob ein optionales Argument an die Prozedur übergeben wurde.

Sub OptionaleArg(strLand As String, Optional intZBezirk As Integer, _

0	Optional strLand As String = "Deutschland")

1	If IsMissing(intZBezirk) And IsMissing(strLand) Then

2	Debug.Print strPLBereich

3	ElseIf IsMissing(strLand) Then

4	Debug.Print strPLBereich, intZBezirk

5	ElseIf IsMissing(intZBezirk) Then

6	Debug.Print strPLBereich, strLand

7	Else

8	Debug.Print strPLBereich, intZBezirk, strLand

9	End If

10	End Sub

Sie können diese Prozedur mit benannten Argumenten aufrufen. Beispiele:

OptionaleArg strLand:="Deutschland", strPLBereich:="BAY"

0	OptionaleArg strPLBereich:= "BAY", intZBezirk:=68


Objekte, Eigenschaften, Methoden und Ereignisse

Ein Objekt stellt ein Element einer Anwendung dar, beispielsweise eine Tabelle, eine Zelle, ein Diagramm, ein Formular oder einen Bericht. In Visual Basic-Code müssen Sie ein Objekt kennzeichnen, bevor Sie eine der Methoden des Objekts anwenden oder den Wert einer der Eigenschaften ändern können.

0	Eine Auflistung ist ein Objekt, das verschiedene andere Objekte enthält, normalerweise, aber nicht immer, vom gleichen Typ. In Microsoft Excel beispielsweise enthält die Workbooks-Auflistung alle geöffneten Workbook-Objekte. In Visual Basic enthält die Forms-Auflistung alle Form-Objekte einer Anwendung.

1	Elemente einer Auflistung können über eine Nummer oder einen Namen gekennzeichnet werden. In der folgenden Prozedur beispielsweise kennzeichnet Workbooks(1) das erste geöffnete Workbook-Objekt.

Sub AlsErstesSchließen()

0	Workbooks(1).Close

1	End Sub

Die folgende Prozedur verwendet einen Namen, der als Zeichenfolge angegeben wurde, um ein Form-Objekt zu identifizieren.

Sub SchließeForm()

0	Forms("MeineForm.frm").Close

1	End Sub

Sie können ebenso die gesamte Auflistung von Objekten bearbeiten, wenn die Objekte über gemeinsame Methoden verfügen. Die folgende Prozedur schließt z.B. alle geöffneten Formulare.

Sub AllesSchließen()

0	Forms.Close

1	End Sub

Eine Methode ist eine Aktion, die ein Objekt ausführen kann. Add ist z.B. eine Methode des ComboBox-Objekts, da es einem Kombinationsfeld einen neuen Eintrag hinzufügt.

0	Die folgende Prozedur verwendet die Add-Methode, um einem Kombinationsfeld ein neues Element hinzuzufügen.

Sub EintragHinzufügen(neuerEintrag as String)

0	Combo1.Add neuerEintrag

1	End Sub

Eine Eigenschaft ist ein Attribut eines Objekts, das eines der Merkmale des Objekts definiert, beispielsweise die Größe, Farbe, die Position auf dem Bildschirm oder das Verhalten des Objekts (z.B. ob es aktiviert oder sichtbar ist). Sie ändern die Werte der Eigenschaften eines Objekts, um die Merkmale dieses Objekts zu verändern.

0	Geben Sie nach dem Verweis auf ein Objekt einen Punkt, den Eigenschaftsnamen, ein Gleichheitszeichen (=) und den neuen Eigenschaftswert an, um den Wert einer Eigenschaft festzulegen. Die folgende Prozedur beispielsweise ändert den Titel eines Visual Basic-Formulars durch Festlegen der Caption-Eigenschaft.

Sub NamenÄndern(neuerTitel)

0	meineForm.Caption = neuerTitel

1	End Sub

Einige Eigenschaften können Sie nicht festlegen. Das Hilfethema zu einer Eigenschaft enthält Informationen darüber, ob Sie diese Eigenschaft festlegen (lesen-schreiben), die Eigenschaft nur lesen (schreibgeschützt), oder die Eigenschaft nur schreiben (nur schreiben) können.

0	Sie können Informationen über ein Objekt erhalten, indem Sie den Wert einer seiner Eigenschaften zurückgeben. Die folgende Prozedur verwendet ein Meldungsfeld zur Anzeige des Titels, der im oberen Bereich des derzeit aktiven Formulars angezeigt wird.

Sub FormNamenAbrufen()

0	formNamen = Screen.ActiveForm.Caption

1	MsgBox formNamen

2	End Sub

Ein Ereignis ist eine Aktion, die von einem Objekt erkannt wird, beispielsweise das Klicken mit der Maus oder das Drücken einer Taste, und für die Sie Code schreiben können, so daß das Objekt auf das Ereignis reagiert. Ereignisse können durch eine Benutzeraktion oder durch Programm-Code hervorgerufen werden oder durch das System ausgelöst werden.

Zurückgeben von Objekten

Jede Anwendung verfügt über eine Möglichkeit, die Objekte zurückzugeben, die sie enthält. Da sich die Art und Weise der Rückgabe jedoch von Anwendung zu Anwendung unterscheidet, sollten Sie in dem Hilfethema des verwendeten Objekts oder der verwendeten Auflistung nachlesen, wie das Objekt zurückgegeben wird.


Automatisierung

Automatisierung (früher OLE-Automatisierung) ist ein Funktionsmerkmal des COM (Component Object Model), eine als Industriestandard anerkannte Technologie, mit dem Anwendungen ihre Objekte für Entwicklungsprogramme, Makrosprachen und andere Anwendungen, die Automatisierung unterstützen, offenlegen. Ein Tabellenkalkulationsprogramm kann z.B. eine Tabelle, ein Diagramm, eine Zelle oder einen Zellbereich offenlegen, wobei alle Objekte einen jeweils anderen Objekttyp haben. Ein Textverarbeitungsprogramm kann Objekte wie eine Anwendung, ein Dokument, einen Absatz, einen Satz, ein Lesezeichen oder eine Auswahl offenlegen.

0	Wenn eine Anwendung Automatisierung unterstützt, kann Visual Basic auf die offengelegten Objekte zugreifen. Mit Visual Basic können Sie diese Objekte ändern, indem Sie Methoden für das Objekt aufrufen oder dessen Eigenschaften abrufen und festlegen. Wenn Sie z.B. ein Automatisierungsobjekt mit dem Namen MeinObj erstellt haben, können Sie das Objekt mit dem folgenden Code verändern:

MeinObj.Insert "Hallo !"	' Text einfügen.

0	MeinObj.Bold = True	' Text formatieren.

1	MeinObj.SaveAs  "C:\TEXTVER\DOKU\TESTOBJ.DOC"	' Objekt speichern.

Mit den folgenden Funktionen erhalten Sie Zugriff auf ein Automatisierungsobjekt:

Funktion	Beschreibung
CreateObject	Erstellt ein neues Objekt des angegebenen Typs.
GetObject	Lädt ein Objekt aus einer Datei.
Weitere Information zu den unterstützten Eigenschaften und Methoden finden Sie in der Dokumentation der Anwendung. Die von einer Anwendung unterstützten Objekte, Funktionen, Eigenschaften und Methoden sind normalerweise in der Objektbibliothek der Anwendung definiert.


Parameter-Datenfelder

Ein Parameter-Datenfeld kann dazu verwendet werden, ein Datenfeld mit Argumenten an eine Prozedur zu übergeben. Sie müssen die Anzahl der Elemente im Datenfeld bei der Definition der Prozedur nicht kennen.

0	Sie verwenden das Schlüsselwort ParamArray zur Kennzeichnung eines Parameter-Datenfeldes. Das Datenfeld muß als ein Datenfeld vom Typ Variant deklariert und das letzte Argument in der Prozedurdefinition sein.

1	Das folgende Beispiel zeigt, wie Sie eine Prozedur mit einem Parameter-Datenfeld definieren könnten.

Sub BeliebigeAnzArg (strName As String, ParamArray intPunkte() As Variant)

0	Dim intI As Integer

1	Debug.Print strName; "  Punkte"

2	' Verwenden Sie zum Bestimmen der oberen Grenze

3	' des Datenfeldes die Funktion Ubound.

4	For intI = 0 To UBound(intPunkte())

5	Debug.Print "    "; intPunkte(intI)

6	Next intI

7	End Sub

In dem folgenden Beispiel wird gezeigt, wie Sie diese Prozedur aufrufen können.

BeliebigeAnzArg "Mona", 10, 26, 32, 15, 22, 24, 16

0	BeliebigeAnzArg "Lisa", "Höchste", "Niedrigste", "Mittlere", "Höchste"


Gültigkeitsbereich

Mit Gültigkeitsbereich wird die Verfügbarkeit von Variablen, Konstanten oder Prozeduren zur Verwendung durch eine andere Prozedur bezeichnet. Es gibt drei Gültigkeitsbereichebenen: Prozedurebene, private Modulebene und öffentliche Modulebene.

0	Sie bestimmen den Gültigkeitsbereich einer Variablen bei deren Deklaration. Durch die explizite Deklaration aller Variablen können Fehler aufgrund von Namenskonflikten zwischen Variablen mit unterschiedlichen Gültigkeitsbereichen vermieden werden.

Definieren von Gültigkeitsbereichen auf Prozedurebene

Eine innerhalb einer Prozedur definierte Variable oder Konstante ist außerhalb dieser Prozedur nicht verfügbar. Nur die Prozedur, die die Variablendeklaration enthält, kann diese Variable verwenden. Im folgenden Beispiel zeigt die erste Prozedur ein Meldungsfeld mit einer Zeichenfolge an. Die zweite Prozedur zeigt ein leeres Meldungsfeld an, da die Variable strMldg für die erste Prozedur lokal ist.

Sub LokaleVariable()

0	Dim strMldg As String

1	strMldg = "Diese Variable kann nur innerhalb " & _

2	 "dieser Prozedur verwendet werden."

3	MsgBox strMldg

4	End Sub

5	Sub AußerhalbGültigkeitsbereich()

6	MsgBox strMldg

7	End Sub

Definieren von Gültigkeitsbereichen auf privater Modulebene

Sie können Variablen und Konstanten auf Modulebene im Deklarationsabschnitt eines Moduls definieren. Variablen auf Modulebene können entweder öffentlich oder privat sein. Öffentliche Variablen sind für alle Prozeduren in allen Modulen eines Projekts verfügbar, private Variablen sind nur für die Prozeduren in diesem Modul verfügbar. Standardmäßig werden Variablen mit der Dim-Anweisung im Deklarationsabschnitt im privaten Gültigkeitsbereich deklariert. Durch Voranstellen des Schlüsselworts Private jedoch wird der Gültigkeitsbereich der Variablen in Ihrem Code erkennbar.

0	Im folgenden Beispiel ist die Zeichenfolgenvariable strMldg für alle in dem Modul definierten Prozeduren verfügbar. Bei Aufruf der zweiten Prozedur werden die Inhalte der Zeichenfolgenvariablen strMldg in einem Dialogfeld angezeigt.

' Fügen Sie zum Deklarationsabschnitt des

0	' Moduls folgenden Code hinzu.

1	Private strMldg sAs String

2	Sub InitialisierePrivateVariable()

3	strMldg = "Diese Variable kann nur innerhalb " & _

4	 "dieses Moduls verwendet werden."

5	End Sub

6	Sub VerwendePrivateVariable()

7	MsgBox strMldg

8	End Sub

Anmerkung   Öffentliche Prozeduren in einem Standardmodul oder Klassenmodul sind für jedes referenzierende Projekt verfügbar. Damit der Gültigkeitsbereich aller Prozeduren in einem Modul auf das aktuelle Projekt begrenzt wird, fügen Sie dem Deklarationsabschnitt des Moduls eine Option Private Module-Anweisung hinzu. Öffentliche Variablen und Prozeduren sind für andere Prozeduren im aktuellen Projekt weiterhin verfügbar, jedoch nicht für referenzierende Projekte.

Definieren von Gültigkeitsbereichen auf öffentlicher Modulebene

Wenn Sie eine Variable auf Modulebene als öffentlich deklarieren, ist sie für alle Prozeduren in diesem Projekt verfügbar. Im folgenden Beispiel kann die Zeichenfolgenvariable strMldg von jeder Prozedur in jedem Modul dieses Projekts verwendet werden.

' Fügen Sie diesen Code in den Deklarationsabschnitt

0	' des Moduls ein.

1	Public strMldg As String

Alle Prozeduren (ausgenommen Ereignisprodezuren) sind standardmäßig öffentlich. Wenn Visual Basic eine Ereignisprozedur erstellt, wird das Schlüsselwort Private automatisch vor der Prozedurdeklaration eingefügt. Für alle anderen Prozeduren müssen Sie die Prozedur explizit mit dem Schlüsselwort Private deklarieren, wenn die Prozedur nicht öffentlich sein soll.

0	Sie können öffentliche Prozeduren, Variablen und Konstanten verwenden, die in Standardmodulen oder Klassenmodulen von referenzierenden Projekten definiert worden sind. Dennoch müssen Sie zuerst einen Verweis zu dem Projekt herstellen, in dem sie definiert worden sind.

1	Öffentliche Prozeduren, Variablen und Konstanten, die in Modulen als Standard- oder Klassenmodulen definiert worden sind, wie z.B. Formularmodule oder Berichtsmodule, sind nicht für referenzierende Projekte verfügbar, da diese Module für das Projekt, in dem sie sich befinden, privat sind.


Daten vom Typ Variant

Der Datentyp Variant wird automatisch festgelegt, wenn Sie bei der Deklaration einer Konstanten, einer Variablen oder eines Arguments keinen Datentyp angegeben haben. Variablen vom Datentyp Variant können Zeichenfolgen, Datums-, Zeit-, boolesche oder numerische Werte enthalten und diese Werte automatisch umwandeln. Variant-Werte benötigen 16 Bytes Speicherplatz (was nur für große Prozeduren oder komplexe Module von Bedeutung ist), und der Zugriff auf diese Werte erfolgt langsamer, als wenn explizit Variablen eines anderen Datentyps angegeben worden wären. Der Datentyp Variant wird nur selten für eine Konstante verwendet. Zeichenfolgen des Typs Variant benötigen 22 Bytes Speicherplatz.

0	Die folgenden Anweisungen erstellen Variant-Variablen:

Dim meineVar

0	Dim deineVar As Variant

1	dieVar = "Bitte lesen Sie diesen Text."

Die letzte Anweisung deklariert die Variable dieVar nicht explizit, sondern implizit oder automatisch. Variablen, die implizit deklariert werden, haben den Datentyp Variant.

Tip   Wenn Sie einen Datentyp für eine Variable oder ein Argument festlegen und dann den falschen Datentyp verwenden, tritt ein Datentyp-Fehler auf. Um dies zu verhindern, sollten Sie entweder implizite Variablen (Datentyp Variant) verwenden oder alle Ihre Variablen explizit deklarieren und einen Datentyp festlegen. Die zweite Methode wird empfohlen.


Visual Basic-Syntax

Die Syntax in einem Visual Basic-Hilfethema für eine Methode, Anweisung oder Funktion zeigt alle Elemente, die für die korrekte Verwendung der Methode, Anweisung oder Funktion benötigt werden. In den Beispielen dieses Abschnitts wird erklärt, wie die am häufigsten verwendeten Syntaxelemente interpretiert werden müssen.

Syntax der Activate-Methode

Objekt.Activate

0	In der Syntax der Activate-Methode entspricht das kursive Wort "Objekt" einem Platzhalter für von Ihnen bereitgestellte Informationen - in diesem Fall Code, der ein Objekt zurückgibt. Fettformatierte Wörter sollten genau so eingegeben werden, wie sie in der Syntax vorgegeben werden. Die folgende Prozedur z.B. aktiviert das zweite Fenster im aktiven Dokument.

Sub Aktiviere()

0	Windows(2).Activate

1	End Sub

Syntax der MsgBox-Funktion

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

0	In der Syntax der MsgBox-Funktion entsprechen die fettformatierten kursiven Wörter benannten Argumenten der Funktion. Argumente, die in Klammern eingeschlossen sind, sind optional. (Geben Sie die Klammern in Ihrem Visual Basic-Code nicht an.) Das einzige Argument, das Sie für die MsgBox-Funktion bereitstellen müssen, ist der Text für die Anzeige.

1	Argumente für Funktionen und Methoden können im Code entweder mit Hilfe ihrer Position oder ihres Namens angegeben werden. Um die Argumente mit Hilfe ihrer Position anzugeben, sollten Sie der in der Syntax angegebenen Reihenfolge folgen, und trennen Sie jedes Argument durch ein Komma. Beispiel:

MsgBox "Die Antwort ist falsch!",0,"Antwortfenster"

Wenn Sie ein Argument mit Hilfe des Namens angeben möchten, verwenden Sie den Argumentnamen, gefolgt von einem Doppelpunkt und einem Gleichheitszeichen (:=) sowie dem Argumentwert. Sie können benannte Argumente in jeder Reihenfolge angeben. Beispiel:

MsgBox Title:="Antwortfenster", Prompt:="Die Antwort ist falsch!"

In der Syntax von Funktionen und von einigen Methoden werden die Argumente in Klammern eingeschlossen. Diese Funktionen und Methoden geben Werte zurück, so daß Sie die Argumente in Klammern angeben müssen, um den Wert einer Variablen zuzuweisen. Geben Sie keine Klammern an, wenn Sie den Rückgabewert ignorieren oder keine Argumente übergeben. Argumente von Methoden, die keine Werte zurückgeben, müssen nicht in Klammern eingeschlossen werden. Diese Richtlinien gelten unabhängig davon, ob Sie Argumente verwenden, die durch ihre Position, oder Argumente, die durch ihren Namen angegeben sind.

0	Im folgenden Beispiel ist der Rückgabewert der MsgBox-Funktion eine Zahl, gespeichert in der Variablen meineVar, die die ausgewählte Schaltfläche kennzeichnet. Da der Rückgabewert verwendet wird, sind Klammern erforderlich. Ein anderes Meldungsfeld zeigt dann den Wert der Variablen an.

Sub Frage()

0	meineVar = MsgBox(Prompt:="Ich liebe meinen Beruf.", _

1	Title:="Antwortfenster", Buttons:="4")

2	MsgBox meineVar

3	End Sub

Syntax der Option-Anweisung

Option Compare {Binary | Text | Database}

0	In der Syntax der Option Compare-Anweisung kennzeichnen die Klammern und die vertikalen Linien eine vorgeschriebene Wahl zwischen drei Elementen. (Geben Sie die Klammern nicht in der Visual Basic-Anweisung an). Die folgende Anweisung gibt z.B. an, daß innerhalb des Moduls Zeichenfolgen in einer Sortierreihenfolge verglichen werden, die nicht auf die Groß-/Kleinschreibung achtet.

Option Compare Text

Syntax der Dim-Anweisung

Dim VarName[([Indizes])] [As Typ] [, VarName[([Indizes])] [As Typ]] . . .

0	In der Syntax der Dim-Anweisung entspricht das Wort Dim einem erforderlichen Schlüsselwort. Das einzige erforderliche Element ist VarName (der Variablenname). Die folgende Anweisung z.B. erstellt drei Variablen: meineVar, naechsteVar und dritteVar. Diese werden automatisch als Variant-Variablen deklariert.

Dim meineVar, nächsteVar, dritteVar

Das folgende Beispiel deklariert eine Variable als String. Das Angeben eines Datentyps spart Speicherplatz und kann dazu beitragen, Fehler im Code zu entdecken.

Dim meineAntwort As String

Geben Sie den Datentyp für jede Variable an, um mehrere Variablen in einer Anweisung zu deklarieren. Variablen, die ohne einen Datentyp deklariert werden, werden automatisch als Variant deklariert.

Dim x As Integer, y As Integer, z As Integer

In der folgenden Anweisung wird x und y der Datentyp Variant zugewiesen. Nur z wird der Datentyp Integer zugewiesen.

Dim x, y, z As Integer

Sie müssen Klammern hinzufügen, wenn Sie eine Datenfeldvariable deklarieren. Die Indizes sind optional. Die folgende Anweisung dimensioniert ein dynamisches Datenfeld, meinDatenfeld.

Dim meinDatenfeld()


Verwenden von Datenfeldern

Sie können ein Datenfeld deklarieren, das mit einer Gruppe von Werten des gleichen Datentyps arbeitet. Ein Datenfeld ist eine einzelne Variable mit mehreren Feldern, in denen Werte gespeichert werden, während eine typische Variable nur über ein Speicherfeld verfügt, in dem nur ein Wert gespeichert werden kann. Sie können auf das Datenfeld als Ganzes verweisen, wenn Sie auf alle darin befindlichen Werte verweisen möchten, oder auf die einzelnen Elemente.

0	Damit Sie z.B. die täglichen Kosten für jeden Tag des Jahres speichern können, deklarieren Sie eine Datenfeldvariable mit 365 Elementen anstelle von 365 Variablen. Jedes Element in einem Datenfeld enthält einen Wert. Die folgende Anweisung deklariert die Datenfeldvariable curKosten mit 365 Elementen. Standardmäßig wird ein Datenfeld beginnend mit Null (0) indiziert, so daß die obere Grenze des Datenfeldes statt 365 nur 364 entspricht.

Dim curKosten (364) As Currency

Damit Sie den Wert eines einzelnen Elements festlegen können, geben Sie den Index des Elements an. Das folgende Beispiel weist jedem Element im Datenfeld den Anfangswert 20 zu.

Sub FülleDatenfeld ()

0	Dim curKosten (364) As Currency

1	Dim intI As Integer

2	For intI = 0 to 364

3	curKosten (intI) = 20

4	Next

5	End Sub

Ändern der unteren Grenze

Sie können die Option Base-Anweisung am Anfang eines Moduls dazu verwenden, den Standardindex des ersten Elements von 0 auf 1 zu ändern. Im folgenden Beispiel ändert die Option Base-Anweisung den Index für das erste Element und die Dim-Anweisung deklariert die Datenfeldvariable curKosten mit 365 Elementen.

Option Base 1

0	Dim curKosten(365) As Currency

Sie können auch explizit die untere Grenze eines Datenfelds über den To-Abschnitt festlegen. Beispiel:

Dim curKosten(1 To 365) As Currency

0	Dim strWochentag(7 To 13) As String

Speichern von Variant-Werten in Datenfeldern

Es gibt zwei Möglichkeiten, Datenfelder für Werte des Typs Variant zu erstellen. Sie können ein Datenfeld als Datentyp Variant deklarieren. Beispiel:

Dim varDaten(3) As Variant

0	varDaten(0) = "Christine Müller"

1	varDaten(1) = "44137 Dortmund"

2	varDaten(2) = 38

3	varDaten(3) = Format("06-09-1952", "General Date")

Sie können aber auch das von der Array-Funktion zurückgegebene Datenfeld einer Variant-Variablen zuweisen. Beispiel:

Dim varDaten As Variant

0	varDaten = Array("Christine Müller", "44137 Dortmund", 38, _

1	Format("06-09-1952", "Allgemeines Datum"))

Sie kennzeichnen die Elemente in einem Datenfeld von Variant-Werten über den Index, unabhängig von der bei der Erstellung des Datenfeldes verwendeten Methode. Die folgende Anweisung kann z.B. zu jedem der vorhergehenden Beispiele hinzugefügt werden.

MsgBox "Daten für " & varDaten(0) & " wurden aufgezeichnet."

Verwenden mehrdimensionaler Datenfelder

In Visual Basic können Sie Datenfelder mit bis zu 60 Dimensionen deklarieren. Die folgende Anweisung deklariert z.B. ein zweidimensionales, 5-zu-10-Datenfeld.

Dim sngMulti(1 To 5, 1 To 10) As Single

Wenn Sie sich das Datenfeld als Matrix vorstellen, so stellt das erste Argument die Zeilen und das zweite Argument die Spalten dar.

0	Verwenden Sie verschachtelte For...Next-Anweisungen für die Verarbeitung mehrdimensionaler Datenfelder. Die folgende Prozedur füllt ein zweidimensionales Datenfeld mit Single-Werten.

Sub FülleDatenfeldMulti ()

0	Dim intI As Integer, intJ As Integer

1	Dim sngMulti(1 To 5, 1 To 10) As Single

2	' Aufüllen des Datenfeldes mit Werten.

3	For intI = 1 To 5

4	For intJ = 1 To 10

5	sngMulti(intI, intJ) = intI * intJ

6	Debug.Print sngMulti(intI, intJ)

7	Next intJ

8	Next intI

9	End Sub


Verwenden von Konstanten

Ihr Code könnte häufig auftretende Konstantenwerte enthalten oder von bestimmten Zahlen abhängen, an die man sich schlecht erinnern kann und die keine unmittelbar erkennbare Bedeutung haben. Ihr Code kann leichter gelesen und auch überarbeitet werden, wenn Sie Konstanten verwenden. Eine Konstante ist ein hinsichtlich der Funktion der Konstanten im Programm-Code aussagefähiger Name, der den Platz einer Zahl oder Zeichenfolge übernimmt, die sich nicht verändert. Sie können eine Konstante nicht ändern oder ihr einen neuen Wert zuweisen, wie dies bei einer Variablen möglich ist.

0	Es gibt drei Arten von Konstanten:

1	Integrierte Konstanten oder systemdefinierte Konstanten werden von Anwendungen und Steuerelementen bereitgestellt. Andere Anwendungen, die Objektbibliotheken bereitstellen, wie z.B. Microsoft Access, Microsoft Excel, Microsoft Project und Microsoft Word, stellen zudem eine Liste der Konstanten zur Verfügung, die mit ihren Objekten, Methoden und Eigenschaften verwendet werden können. Sie können eine Liste der Konstanten, die für die jeweilige Objektbibliothek verfügbar sind, im Objektkatalog anzeigen.

2	Visual Basic-Konstanten werden in der Visual Basic-Bibliothek (VB), Visual Basic für Applikationen-Bibliothek (VBA) und Data Access Object-Bibliothek (DAO) aufgelistet.

Anmerkung   Visual Basic erkennt Konstanten in Anwendungen, die mit früheren Versionen von Visual Basic oder Visual Basic für Applikationen erstellt worden sind. Sie können Ihre Konstanten zu den Konstanten aktualisieren, die im Objektkatalog aufgelistet sind. Die hier aufgelisteten Konstanten müssen nicht in Ihrer Anwendung deklariert werden.

•	Symbolische oder benutzerdefinierte Konstanten werden mit der Const-Anweisung deklariert.

•	Konstanten für die bedingte Kompilierung werden mit der #Const-Anweisung deklariert.

In früheren Versionen von Visual Basic wurden Konstantennamen normalerweise großgeschrieben und mit Unterstrichen versehen. Beispiel:

TILE_HORIZONTAL

Integrierte Konstanten sind nun gekennzeichnet, um Verwechslungen zu vermeiden, wenn Konstanten mit dem gleichen Namen in mehr als einer Objektbibliothek existieren, da diesen eventuell unterschiedliche Werte zugewiesen worden sind. Es gibt zwei Möglichkeiten, Konstantennamen zu kennzeichnen:

•	Mit einem Präfix

•	Mit einem Bibliotheksverweis

Kennzeichnen von Konstanten mit einem Präfix

Die von allen Objekten bereitgestellten integrierten Konstanten werden in gemischter Schreibweise aus Groß- und Kleinbuchstaben mit einem Präfix aus zwei Zeichen angezeigt, das die Objektbibliothek kennzeichnet, in der die Konstante definiert ist. Konstanten aus den Objektbibliotheken von Visual Basic und Visual Basic für Applikationen wird "vb" vorangestellt; Konstanten aus der Data Access-Objektbibliothek wird "db" vorangestellt und Konstanten aus der Microsoft Excel-Objektbibliothek wird "xl" vorangestellt. In den folgenden Beispielen wird dargestellt, wie Präfixe für benutzerdefinierte Steuerelemente in Abhängigkeit von der Klassenbibliothek variieren können.

•	vbTileHorizontal

•	dbAppendOnly

•	xlDialogBorder

•	grdAlignCenter

Kennzeichnen von Konstanten mit einem Bibliotheksverweis

Sie können auch den Verweis auf eine Konstante mit folgender Syntax kennzeichnen:

[BibName.] [Modulname.]KonstName

Die Syntax für zu qualifizierende Konstanten besteht aus diesen Teilen:

Teil	Beschreibung
BibName	Optional. Der Name der Klassenbibliothek, die die Konstante definiert. Für die meisten benutzerdefinierten Steuerelemente (nicht verfügbar beim Macintosh) ist dies auch der Klassenname des Steuerelements. Wenn Sie sich nicht mehr an den Klassennamen des Steuerelements erinnern, führen Sie den Mauszeiger über das Steuerelement in der Werkzeugsammlung. Der Klassenname wird in der QuickInfo angezeigt.
Modulname	Optional. Der Name des Moduls innerhalb der Klassenbibliothek, die die Konstante definiert hat. Sie können den Namen des Moduls im Objektkatalog finden.
KonstName	Der für die Konstante definierte Name in der Klassenbibliothek.
Beispiel:

Threed.LeftJustify


Effizienter Einsatz von Datentypen

Variablen, die nicht deklariert werden, erhalten den Datentyp Variant, wenn nicht anders angegeben. Dieser Datentyp erleichtert das Schreiben von Programmen, seine Verwendung ist aber nicht immer effizient.

0	Andere Datentypen bieten sich in den folgenden Situationen an:

•	Wenn das Programm sehr umfangreich ist und viele Variablen verwendet.

•	Wenn das Programm mit der maximal möglichen Geschwindigkeit ausgeführt werden muß.

•	Wenn Daten direkt in Dateien mit wahlfreiem Zugriff geschrieben werden sollen.

Zusätzlich zum Typ Variant werden die folgenden Datentypen unterstützt: Byte, Boolean, Integer, Long, Single, Decimal, Double, Currency, Date, Object und String. Mit der Dim-Anweisung deklarieren Sie eine Variable eines bestimmten Typs. Beispiel:

Dim X As Integer

Diese Anweisung deklariert X als ganze Zahl im Bereich von -32.768 bis 32.767. Jeder Versuch, X eine Zahl außerhalb dieses Bereichs zuzuweisen, führt zu einem Fehler. Wird X eine Dezimalzahl zugewiesen, so wird die Zahl gerundet. Beispiel:

X = 32768	' Verursacht einen Fehler.

0	X = 5.9	' Weist x den Wert 6 zu.


Verwenden von Do...Loop-Anweisungen

Sie können Do...Loop-Anweisungen verwenden, um einen Block von Anweisungen eine unbestimmte Anzahl von Wiederholungen ausführen zu lassen. Die Anweisungen werden wiederholt, solange eine Bedingung dem Wert True entspricht oder bis eine Bedingung dem Wert True entspricht.

Wiederholen von Anweisungen, wenn eine Bedingung dem Wert True entspricht

Es gibt zwei Möglichkeiten zur Verwendung des Schlüsselworts While, um eine Bedingung in einer Do...Loop-Anweisung zu überprüfen. Sie können die Bedingung überprüfen, bevor die Ausführung der Schleife begonnen wird oder nachdem die Schleife mindestens einmal ausgeführt wurde.

0	In der folgenden Prozedur PruefWhileVor überprüfen Sie die Bedingung, bevor die Ausführung der Schleife begonnen wird. Wenn meineZahl auf 9 anstatt auf 20 festgelegt wird, werden die Anweisungen innerhalb der Schleife niemals ausgeführt. In der Prozedur PruefWhileNach werden die Anweisungen innerhalb der Schleife nur einmal ausgeführt, bevor die Bedingung dem Wert False entspricht.

Sub PrüfWhileVor()

0	Zähler = 0

1	meineZahl = 20

2	Do While meineZahl > 10

3	meineZahl = meineZahl - 1

4	Zähler = Zähler + 1

5	Loop

6	MsgBox "Die Schleife wurde " & Zähler & " mal durchlaufen."

7	End Sub

8	Sub PrüfWhileNach ()

9	Zähler = 0

10	meineZahl = 9

11	Do

12	meineZahl = meineZahl - 1

13	Zähler = Zähler + 1

14	Loop While meineZahl > 10

15	MsgBox " Die Schleife wurde " & Zähler & " mal durchlaufen."

16	End Sub

Wiederholen von Anweisungen, bis eine Bedingung dem Wert True entspricht

Es gibt zwei Möglichkeiten der Verwendung des Schlüsselworts Until, um eine Bedingung in einer Do...Loop-Anweisung zu überprüfen. Sie können die Bedingung vor dem Eintreten in eine Schleife prüfen (dargestellt in der PruefUntilVor-Prozedur), oder Sie prüfen die Bedingung, nachdem die Schleife mindestens einmal durchlaufen wurde (dargestellt in der PruefUntilNach-Prozedur). Die Schleife wird fortgeführt, während die Bedingung dem Wert False entspricht.

Sub PrüfUntilVor()

0	Zähler = 0

1	meineZahl = 20

2	Do Until meineZahl = 10

3	meineZahl = meineZahl - 1

4	Zähler = Zähler + 1

5	Loop

6	MsgBox " Die Schleife wurde " & Zähler & " mal durchlaufen."

7	End Sub

8	Sub PrüfUntilNach()

9	Zähler = 0

10	meineZahl = 1

11	Do

12	meineZahl = meineZahl + 1

13	Zähler = Zähler + 1

14	Loop Until meineZahl = 10

15	" Die Schleife wurde " & Zähler & " mal durchlaufen."

16	End Sub

Verlassen einer Do...Loop-Anweisung aus der Schleife heraus

Sie können eine Do...Loop-Anweisung unter Verwendung der Exit Do-Anweisung verlassen. Verwenden Sie z.B. die Exit Do-Anweisung im Do-Anweisungsblock einer If...Then...Else-Anweisung oder einer Select Case-Anweisung, wenn Sie eine Endlosschleife verlassen möchten. Entspricht die Bedingung dem Wert False, so wird die Schleife wie üblich ausgeführt.

0	In folgenden Beispiel wird meineZahl ein Wert zugewiesen, der eine Endlosschleife erzeugt. Die If...Then...Else-Anweisung prüft diese Bedingung und verläßt die Schleife, um eine Endlosschleife zu verhindern.

Sub ExitExample()

0	Zähler = 0

1	meineZahl = 9

2	Do Until meineZahl = 10

3	meineZahl = meineZahl - 1

4	Zähler = Zähler + 1

5	If meineZahl < 10 Then Exit Do

6	Loop

7	MsgBox " Die Schleife wurde " & Zähler & " mal durchlaufen."

8	End Sub

Anmerkung   Drücken Sie ESC oder STRG+PAUSE, um eine Endlosschleife zu beenden.


Verwenden von For...Next-Anweisungen

Sie können For...Next-Anweisungen verwenden, um einen Block von Anweisungen eine unbestimmte Anzahl von Wiederholungen ausführen zu lassen. For-Schleifen verwenden eine Zählervariable, deren Wert mit jedem Schleifendurchlauf erhöht oder verringert wird.

0	Die folgende Prozedur läßt das akustische Signal des Computers 50 Mal ertönen. Die For-Anweisung legt die Zählervariable x und dessen Anfangs- und Endwerte fest. Die Next-Anweisung erhöht die Zählervariable um 1.

Sub Beeps()

0	For x = 1 To 50

1	Beep

2	Next x

3	End Sub

Über das Schlüsselwort Step können Sie die Zählervariable um den angegebenen Wert erhöhen oder verringern. Im folgenden Beispiel wird die Zählervariable j bei jedem Schleifendurchlauf um 2 erhöht. Wenn die Schleife beendet wird, entspricht Summe der Summe von 2, 4, 6, 8 und 10.

Sub ZweierSumme()

0	For j = 2 To 10 Step 2

1	Summe = Summe + j

2	Next j

3	MsgBox "Die Summe beträgt " & Summe

4	End Sub

Verwenden Sie einen negativen Step-Wert, um die Zählervariable zu verringern. Geben Sie einen Endwert an, der geringer als der Anfangswert ist, um die Zählervariable zu verringern. Im folgenden Beispiel wird die Zählervariable meineZahl bei jedem Schleifendurchlauf um 2 verringert. Wenn die Schleife beendet wird, entspricht summe der Summe von 16, 14, 12, 10, 8, 6, 4 und 2.

Sub NeueZweierSumme()

0	For meineZahl = 16 To 2 Step -2

1	Summe = Summe + meineZahl

2	Next meineZahl

3	MsgBox "Die Summe beträgt " & Summe

4	End Sub

Anmerkung   Es ist nicht nötig, den Namen der Zählervariablen nach der Next-Anweisung anzugeben. In den vorhergehenden Beispielen wurde der Name der Zählervariablen nur zum besseren Verständnis eingefügt.

Verwenden Sie die Exit For-Anweisung, um eine For...Next-Anweisung zu verlassen, bevor der Zähler seinen Endwert erreicht. Wenn z.B. ein Fehler auftritt, verwenden Sie die Exit For-Anweisung im True-Anweisungsblock einer If...Then...Else-Anweisung oder einer Select Case-Anweisung, die den Fehler überprüfen. Tritt der Fehler nicht auf, entspricht die If…Then…Else-Anweisung dem Wert False, und die Schleife wird wie erwartet ausgeführt.


Verwenden von For Each...Next-Anweisungen

For Each...Next-Anweisungen wiederholen einen Block von Anweisungen für jedes Objekt in einer Auflistung oder jedes Element in einem Datenfeld. Visual Basic stellt automatisch bei jedem Schleifendurchlauf eine Variable ein. Die folgende Prozedur z.B. schließt alle Formulare mit Ausnahme des Formulars, das die auszuführende Prozedur enthält.

Sub SchließeFormulare()

0	For Each frm In Application.Forms

1	If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close

2	Next

3	End Sub

Der folgende Code durchläuft jedes Element eines Datenfeldes und stellt den Wert jeden Elements auf den Wert der Indexvariablen I ein.

Dim TestDatenfeld(10) As Integer, I As Variant

0	For Each I In TestDatenfeld

1	TestDatenfeld(I) = I

2	Next I

Schleifendurchlauf für einen Zellbereich

Verwenden eine For Each...Next-Schleife, um einen Schleifendurchlauf durch einen Zellbereich durchzuführen. Die folgende Prozedur durchläuft den Bereich A1:D10 in Tabelle1 und stellt jede Zahl, deren absoluter Wert kleiner als 0.01 ist auf 0 (Null) ein.

Sub AufNullRunden ()

0	For Each meinObjekt in meineAuflistung

1	If Abs(meinObjekt.Value) < 0.01 Then meinObjekt.Value = 0

2	Next

3	End Sub

Verlassen einer For Each...Next-Schleife, bevor sie beendet wurde

Verwenden Sie die Exit For-Anweisung, um eine For Each...Next-Anweisung zu verlassen, bevor der Zähler seinen Endwert erreicht. Wenn z.B. ein Fehler auftritt, verwenden Sie die Exit For-Anweisung im True-Anweisungsblock einer If...Then...Else-Anweisung oder einer Select Case-Anweisung, die den Fehler überprüfen. Tritt der Fehler nicht auf, entspricht die If…Then…Else-Anweisung dem Wert False  und die Schleife wird wie erwartet ausgeführt.

0	In dem folgenden Beispiel wird nach der ersten Zelle im Bereich A1:B5 gesucht, die keine Zahl enthält. Wird eine solche Zelle gefunden, so wird eine Meldung angezeigt und Exit For beendet die Schleife.

Sub ZahlenPrüfen ()

0	For Each meinObjekt In meineAuflistung

1	If IsNumeric(meinObjekt.Value) = False Then

2	MsgBox "Objekt enthält keinen numerischen Wert."

3	Exit For

4	End If

5	Next c

6	End Sub


Verwenden von If…Then…Else-Anweisungen

Sie können die If...Then...Else-Anweisung verwenden, um eine bestimmte Anweisung oder einen Block von Anweisungen in Abhängigkeit vom Wert einer Bedingung auszuführen. If...Then...Else-Anweisungen können beliebig oft verschachtelt werden. Der Code ist jedoch leichter zu verstehen, wenn Sie die Select Case-Anweisung anstelle mehrerer Ebenen verschachtelter If...Then...Else-Anweisungen verwenden.

Ausführen von Anweisungen, wenn eine Bedingung dem Wert True entspricht

Verwenden Sie die einzeilige Syntax der If...Then...Else-Anweisung, wenn Sie nur eine Anweisung ausführen möchten, wenn eine Bedingung dem Wert True entspricht. In dem folgenden Beispiel wird die einzeilige Syntax gezeigt, bei der das Schlüsselwort Else nicht angegeben wird:

Sub KorrigiereDatum()

0	meinDatum = #2/13/95#

1	If meinDatum < Now Then meinDatum = Now

2	End Sub

Sie müssen die mehrzeilige Syntax verwenden, wenn Sie mehr als eine Code-Zeile ausführen möchten. Das folgende Beispiel zeigt die Syntax mit End If-Anweisung:

Sub WarnmeldungAnBenutzer(Wert as Long)

0	If Wert = 0 Then

1	AlertLabel.ForeColor = vbRed

2	AlertLabel.Font.Bold = True

3	AlertLabel.Font.Italic = True

4	End If

5	End Sub

Ausführen bestimmter Anweisungen, wenn eine Bedingung dem Wert True entspricht, und Ausführen anderer Anweisungen, wenn die Bedingung dem Wert False entspricht

Verwenden Sie eine If...Then...Else-Anweisung, um zwei Blöcke ausführbarer Anweisungen zu definieren: Ein Block wird ausgeführt, wenn die Bedingung dem Wert True entspricht, der andere Block wird ausgeführt, wenn die Bedingung dem Wert False entspricht.

Sub WarnmeldungAnBenutzer(Wert as Long)

0	If Wert = 0 Then

1	AlertLabel.ForeColor = vbRed

2	AlertLabel.Font.Bold = True

3	AlertLabel.Font.Italic = True

4	Else

5	AlertLabel.Forecolor = vbBlack

6	AlertLabel.Font.Bold = False

7	AlertLabel.Font.Italic = False

8	End If

9	End Sub

Testen einer zweiten Bedingung, falls die erste Bedingung dem Wert False entspricht

Sie können ElseIf-Anweisungen einer If...Then...Else-Anweisung hinzufügen, um eine zweite Bedingung zu überprüfen, wenn die erste Bedingung False entspricht. Die folgende Function-Prozedur berechnet z.B. einen Bonus basierend auf der Arbeitsbewertung. Die der Else-Anweisung folgende Anweisung wird ausgeführt, wenn die Bedingungen in allen If- und ElseIf-Anweisungen dem Wert False entsprechen.

Function Bonus(Leistung, Einkommen)

0	If Leistung = 1 Then

1	Bonus = Einkommen * 0.1

2	ElseIf Leistung = 2 Then

3	Bonus = Einkommen * 0.09

4	ElseIf Leistung = 3 Then

5	Bonus = Einkommen * 0.07

6	Else

7	Bonus = 0

8	End If

9	End Function


Verwenden von Klammern in Code

Sub-Prozeduren, integrierte Anweisungen und einige Methoden geben keinen Wert zurück, so daß deren Argumente nicht in Klammern eingeschlossen werden müssen. Beispiel:

TestSub "StringArgument", IntegerArgument

Function-Prozeduren, integrierte Funktionen und einige Methoden geben einen Wert zurück, den Sie jedoch ignorieren können. Wenn Sie den Rückgabewert ignorieren, geben Sie keine Klammern an. Rufen Sie die Funktion wie eine Sub-Prozedur auf. Geben Sie keine Klammern an, listen Sie alle Argumente auf, und weisen Sie die Funktion keiner Variablen zu. Beispiel:

MsgBox "Aufgabe erledigt!", 0, "Aufgabenfenster"

Schließen Sie die Argumente in Klammern ein, wenn Sie den Rückgabewert einer Funktion verwenden möchten. Beispiel:

Antwort3 = MsgBox("Sind Sie mit Ihrem Einkommen zufrieden? ", 4, "Frage 3")

Eine Anweisung in einer Sub- oder Function-Prozedur kann Werte an eine aufgerufene Prozedur mit Hilfe von benannten Argumenten übergeben. Die Richtlinien für die Verwendung von Klammern gelten, unabhängig davon, ob benannte Argumente angegeben wurden oder nicht. Wenn Sie benannte Argumente verwenden, können Sie diese in beliebiger Reihenfolge angeben und optionale Argumente auslassen. Benannten Argumenten folgt immer ein Doppelpunkt und ein Gleichheitszeichen (:=) sowie der Argumentwert.

0	In dem folgenden Beispiel wird die MsgBox-Funktion mittels benannter Argumente aufgerufen, der Rückgabewert wird jedoch ignoriert:

MsgBox Title:="Aufgabenfenster", Prompt:="Aufgabe erledigt!"

In dem folgenden Beispiel wird die MsgBox-Funktion mittels benannter Argumente aufgerufen und der Rückgabewert der Variablen Antwort3 zugewiesen:

Antwort3 = MsgBox(Title:="Frage 3", _

0	Prompt:=" Sind Sie mit Ihrem Einkommen zufrieden?", Buttons:=4)


Verwenden von Select Case-Anweisungen

Verwenden Sie die Select Case-Anweisung als Alternative zu ElseIf in If...Then...Else-Anweisungen, wenn Sie einen Ausdruck mit mehreren unterschiedlichen Werten vergleichen. Während If...Then...Else-Anweisungen einen anderen Ausdruck für jede ElseIf-Anweisung überprüfen können, überprüft die Select Case-Anweisung einen Ausdruck nur einmal zu Beginn der Kontrollstruktur.

0	Im folgenden Beispiel überprüft die Select Case-Anweisung das Argument Leistung, das der Prozedur übergeben wurde. Beachten Sie, daß jede Case-Anweisung mehrere Werte, einen Bereich von Werten oder eine Kombination von Werten und Vergleichsoperatoren enthalten kann. Die optionale Case Else-Anweisung wird ausgeführt, wenn die Select Case-Anweisung keinen übereinstimmenden Wert in den Case-Anweisungen gefunden hat.

Function Bonus(Leistung, Einkommen)

0	Select Case Leistung

1	Case 1

2	Bonus = Einkommen * 0.1

3	Case 2, 3

4	Bonus = Einkommen * 0.09

5	Case 4 To 6

6	Bonus = Einkommen * 0.07

7	Case Is > 8

8	Bonus = 100

9	Case Else

10	Bonus = 0

11	End Select

12	End Function


Verwenden von With-Anweisungen

Mit der With-Anweisung können Sie ein Objekt oder einen benutzerdefinierten Typ einmal für eine ganze Folge von Anweisungen festlegen. With-Anweisungen beschleunigen die Ausführung von Prozeduren und reduzieren wiederholte Eingaben.

0	In dem folgenden Beispiel wird ein Zellbereich mit der Zahl 30 gefüllt, die Zelle fett formatiert und die Innenfarbe der Zellen auf Gelb eingestellt.

Sub FormatiereBereich ()

0	With Worksheets("Tabelle1").Range("A1:C10")

1	.Value = 30

2	.Font.Bold = True

3	.Interior.Color = RGB(255, 255, 0)

4	End With

5	End Sub

Sie können With-Anweisungen auch verschachteln. Das folgende Beispiel fügt eine Formel in Zelle A1 ein und formatiert dann die Schriftart.

Sub MeineEingabe ()

0	With Workbooks("Buch1").Worksheets("Tabelle1").Cells(1, 1)

1	.Formula = "=SQRT(50)"

2	With .Font

3	.Name = "Arial"

4	.Bold = True

5	.Size = 8

6	End With

7	End With

8	End Sub


Namenskonventionen in Visual Basic

Befolgen Sie die folgenden Regeln, wenn Sie Prozeduren, Konstanten, Variablen und Argumente in einem Visual Basic-Modul benennen:

•	Verwenden Sie einen Buchstaben als erstes Zeichen.

•	Verwenden Sie kein Leerzeichen, keinen Punkt (.), Ausrufezeichen (!) oder die Zeichen @, &, $, # im Namen.

•	Der Name darf die Länge von 255 Zeichen nicht überschreiten.

•	Im allgemeinen sollten Sie keine Namen verwenden, die bereits durch Funktionen, Anweisungen und Methoden in Visual Basic verwendet werden, da auf diese Weise die Funktionalität des entsprechenden Schlüsselworts in der Sprache beeinträchtigt wird. Wenn Sie Funktionen, Anweisungen oder Methoden verwenden möchten, die in die Sprache integriert sind und mit einem zugewiesenen Namen in Konflikt stehen, müssen Sie die Funktion, Anweisung oder Methode explizit kennzeichnen. Stellen Sie dem Namen der integrierten Funktion, Anweisung oder Methode den Namen der zugehörigen Klassenbibliothek voran. Wenn Sie z.B. eine Variable mit dem Namen Left verwenden, können Sie die Left-Funktion nur mit VBA.Left aufrufen.

•	Sie können Namen innerhalb des gleichen Gültigkeitsbereichs nicht wiederholen. Sie können z.B. nicht zwei Variablen mit dem Namen Alter innerhalb der gleichen Prozedur deklarieren. Sie können aber eine private Variable mit dem Namen Alter und eine Variable auf Prozedurebene mit dem Namen Alter innerhalb des gleichen Moduls deklarieren.

Anmerkung   Visual Basic berücksichtigt die Groß-/Kleinschreibung nicht, behält jedoch die Schreibweise der Anweisung bei, mit der der Name deklariert wurde.


Anwendungsübergreifendes Arbeiten

Visual Basic kann neue Objekte erstellen und vorhandene Objekte aus vielen Microsoft-Anwendungen laden. Außerdem können auch andere Anwendungen Objekte bereitstellen, die Sie mit Visual Basic erstellen können. Weitere Informationen finden Sie in der Dokumentation zur jeweiligen Anwendung.

0	Mit den Funktionen CreateObject oder GetObject können Sie ein neues Objekt erstellen bzw. ein vorhandenes Objekt aus einer anderen Anwendung laden:

' Microsoft Excel starten und ein neues Worksheet-

0	' Objekt erstellen.

1	Set ExcelWorksheet = CreateObject("Excel.Sheet")

2	' Microsoft Excel starten und ein bestehendes

3	' Worksheet-Objekt öffnen.

4	Set ExcelWorksheet = GetObject("TABELLE1.XLS")

5	' Microsoft Word starten.

6	Set WordBasic = CreateObject("Word.Basic")

Die meisten Anwendungen können auch mit der Exit- oder Quit-Methode geschlossen werden, unabhängig davon, ob sie sichtbar sind oder nicht. Weitere Informationen zu den Objekten, Methoden und Eigenschaften einer Anwendung finden Sie in der Dokumentation zur jeweiligen Anwendung.

0	Bei einigen Anwendungen können Sie das Schlüsselwort New verwenden, um ein Objekt einer beliebigen Klasse, die in der zugehörigen Klassenbibliothek vorhanden ist, zu erstellen. Beispiel:

Dim X As New Field

In diesem Fall ist Field ein Beispiel für eine Klasse in der Datenzugriff-Klassenbibliothek. Mit dieser Syntax wird eine neue Instanz eines Field-Objekts erzeugt. Weitere Informationen dazu, welche Objektklassen in dieser Form erstellt werden können, finden Sie in der Dokumentation zu Ihrer Anwendung.


Schreiben einer Function-Prozedur

Eine Function-Prozedur ist eine Folge von Visual Basic-Anweisungen, die durch die Anweisungen Function und End Function eingeschlossen sind. Eine Function-Prozedur ähnelt einer Sub-Prozedur, kann aber auch einen Wert zurückgeben. Eine Function-Prozedur kann Argumente, wie z.B. Konstanten, Variablen oder Ausdrücke verwenden, die über die aufgerufene Prozedur übergeben werden. Wenn eine Function-Prozedur über keine Argumente verfügt, muß deren Function-Anweisung ein leeres Klammernpaar enthalten. Eine Funktion gibt einen Wert zurück, indem ihrem Namen ein Wert in einer oder mehreren Anweisungen der Prozedur zugewiesen wird.

0	Im folgenden Beispiel berechnet die Celsius-Funktion Celsius-Grade aus Fahrenheit-Graden. Wenn die Funktion aus der Main-Prozedur aufgerufen wird, wird eine den Argumentwert enthaltende Variable der Funktion übergeben. Das Ergebnis der Berechnung wird an die aufrufende Prozedur zurückgegeben und in einem Meldungsfeld angezeigt.

Sub Main()

0	temp = InputBox(Prompt:= _

1	"Geben Sie die Temperatur in Fahrenheit ein.")

2	MsgBox "Die Temperatur entspricht " & Celsius(temp) & " Grad Celsius."

3	End Sub

4	Function Celsius(fGrad)

5	Celsius = (fGrad - 32) * 5 / 9

6	End Function


Schreiben einer Property-Prozedur

Eine Property-Prozedur ist eine Folge von Visual Basic-Anweisungen, die es einem Programmierer ermöglicht, benutzerdefinierte Eigenschaften zu erstellen und zu bearbeiten.

•	Property-Prozeduren können zur Erstellung schreibgeschützter Eigenschaften für Formulare, Standardmodule und Klassenmodule verwendet werden.

•	Property-Prozeduren sollten anstelle von Public-Variablen in Code verwendet werden, der ausgeführt werden muß, wenn der Wert der Eigenschaft festgelegt wird.

•	Im Gegensatz zu Public-Variablen können Property-Prozeduren im Objektkatalog beschreibende Texte zugeordnet sein.

Wenn Sie eine Property-Prozedur erstellen, so wird sie zu einer Eigenschaft des Moduls, das die Prozedur enthält. Visual Basic stellt die folgenden drei Arten von Property-Prozeduren bereit:

Prozedur	Beschreibung
Property Let	Eine Prozedur, die den Wert einer Eigenschaft festlegt.
Property Get	Eine Prozedur, die den Wert einer Eigenschaft zurückgibt.
Property Set	Eine Prozedur, die einen Verweis zu einem Objekt herstellt.
Die Syntax für die Deklaration einer Property-Prozedur ist:

[Public | Private] [Static] Property {Get | Let | Set} Eigenschaftsname_ [(Argumente)] [As Typ]

0	Anweisungen

1	End Property

Property-Prozeduren treten normalerweise in Paaren auf: Property Let mit Property Get und Property Set mit Property Get. Die Deklaration einer Property Get-Prozedur allein entspricht der Deklaration einer schreibgeschützten Eigenschaft. Die Verwendung aller drei Property-Prozedurarten gemeinsam ist nur für Variant-Variablen nützlich, da nur der Datentyp Variant entweder ein Objekt oder andere Datentypinformationen enthalten kann. Property Set ist für die Verwendung mit Objekten bestimmt; für Property Let trifft dies nicht zu.

0	Die erforderlichen Argumente in Deklarationen von Property-Prozeduren sind:

Prozedur	Syntax für die Deklaration
Property Get	Property Get Eigenschaftsname(1, …, n) As Type
Property Let	Property Let Eigenschaftsname(1, …,,,, n, n+1)
Property Set	Property Set Eigenschaftsname(1, …, n, n+1)
Vom ersten bis zum letzten Argument (1, …, n) müssen alle Argumente den gleichen Namen und Datentyp in allen Property-Prozeduren mit dem gleichen Namen aufweisen.

0	Die Deklaration einer Property Get-Prozedur benötigt ein Argument weniger als die Deklaration der verwandten Property Let- und Property Set-Prozedur. Der Datentyp der Property Get-Prozedur muß dem Datentyp des letzten Arguments (n+1) in der verwandten Property Let- und Property Set-Prozedur entsprechen. Wenn Sie z.B. die folgende Property Let-Prozedur deklarieren, muß die Deklaration von Property Get Argumente mit Namen und Datentypen enthalten, die den Namen und Datentypen der Argumente in der Property Let-Prozedur entsprechen.

Property Let Names(intX As Integer, intY As Integer, varZ As Variant)

0	' Anweisung hier.

1	End Property

2	Property Get Names(intX As Integer, intY As Integer) As Variant

3	' Anweisung hier.

4	End Property

Der Datentyp des letzten Arguments in der Deklaration von Property Set muß entweder ein Objekttyp oder vom Typ Variant sein.


Schreiben einer Sub-Prozedur

Eine Sub-Prozedur ist eine Folge von Visual Basic-Anweisungen, die in den Anweisungen Sub und End Sub eingeschlossen sind und Aktionen ausführen, aber keinen Wert zurückgeben. Eine Sub-Prozedur kann Argumente, z.B. Konstanten, Variablen oder Ausdrücke verwenden, die über eine aufrufende Prozedur übergeben werden. Wenn eine Sub-Prozedur über keine Argumente verfügt, muß die Sub-Anweisung ein leeres Klammernpaar enthalten.

0	Die folgende Sub-Prozedur verfügt über Kommentare, die jede Zeile erklären.

' Prozedur namens HoleInfo deklarieren

0	' Diese Sub-Prozedur besitzt keine Argumente

1	Sub HoleInfo()

2	' Zeichenfolge namens Antwort deklarieren

3	Dim Antwort As String

4	' Antwort dem Rückgabewert der InputBox-Funktion zuweisen

5	Antwort = InputBox(Prompt:="Wie heißen Sie?")

6	' Bedingte If...Then...Else-Anweisung

7	If Antwort = Empty Then

8	' Ruft die MsgBox-Funktion auf

9	MsgBox Prompt:="Sie haben keinen Namen eingegeben."

10	Else

11	' MsgBox-Funktion gibt Text aus, der mit dem

12	' Inhalt der Variablen "Antwort" verkettet ist

13	MsgBox Prompt:="Ihr Name lautet " & Antwort

14	' If...Then...Else-Anweisung abschließen

15	End If

16	' Sub-Prozedur abschließen

17	End Sub


Schreiben von Zuweisungsanweisungen

Zuweisungsanweisungen weisen einen Wert oder einen Ausdruck einer Variablen oder Konstanten zu. Zuweisungsanweisungen enthalten immer ein Gleichheitszeichen (=). Das folgende Beispiel weist den Rückgabewert der InputBox-Funktion der Variablen IhrName zu.

Sub Frage()

0	Dim IhrName As String

1	IhrName = InputBox("Wie heißen Sie?")

2	MsgBox "Ihr Name lautet " & IhrName

3	End Sub

Die Let-Anweisung ist optional und wird normalerweise nicht angegeben. Die oben aufgeführte Zuweisungsanweisung kann z.B. folgendermaßen geschrieben werden

Let IhrName = InputBox("Wie heißen Sie?").

Die Set-Anweisung wird verwendet, um ein Objekt einer Variablen zuzuweisen, die als Objekt deklariert wurde. Das Schlüsselwort Set ist erforderlich. Im folgenden Beispiel weist die Set-Anweisung der Objektvariablen Zelle1 einen Bereich in Tabelle1 zu.

Sub Formatieren()

0	Dim Zelle1 As Range

1	Set Zelle1 = Worksheets("Tabelle1").Range("A1")

2	With Zelle1.Font

3	.Bold = True

4	.Italic = True

5	End With

6	End Sub

Anweisungen, die Werte von Eigenschaften festlegen, sind ebenfalls Zuweisungsanweisungen. Das folgende Beispiel legt die Bold-Eigenschaft des Font-Objekts für die aktive Zelle fest:

ActiveCell.Font.Bold = True


Schreiben von Deklarationsanweisungen

Sie verwenden Deklarationsanweisungen zur Benennung und Definition von Prozeduren, Variablen, Datenfeldern und Konstanten. Wenn Sie eine Prozedur, Variable oder Konstante deklarieren, definieren Sie auch deren Gültigkeitsbereich, der davon abhängt, an welcher Stelle Sie die Deklaration plaziert haben und welche Schlüsselwörter Sie zur Deklaration verwendet haben.

0	Das folgende Beispiel enthält drei Deklarationen.

Sub Formatieren()

0	Const Grenze As Integer = 33

1	Dim Zelle1 As Range

2	' Weitere Anweisungen

3	End Sub

Die Sub-Anweisung (mit der entsprechenden End Sub-Anweisung) deklariert eine Prozedur mit dem Namen Formatieren. Alle von den Sub- und End Sub-Anweisungen eingeschlossenen Anweisungen werden immer dann ausgeführt, wenn die Formatieren-Prozedur aufgerufen oder ausgeführt wird.

•	Schreiben einer Sub-Prozedur

Die Const-Anweisung deklariert die Konstante Grenze und gibt den Datentyp Integer und einen Wert von 33 an.

•	Deklarieren von Konstanten

Die Dim-Anweisung deklariert die Variable Zelle1. Der Datentyp ist ein Objekt, in diesem Fall ein Range-Objekt von Microsoft Excel. Sie können eine Variable als jedes der Objekte deklarieren, die in der verwendeten Anwendung offengelegt werden. Dim-Anweisungen stellen eine Art von Anweisung zur Deklaration von Variablen dar. Andere in Deklarationen verwendete Schlüsselwörter sind ReDim, Static, Public, Private und Const.

•	Deklarieren von Variablen


Schreiben von ausführbaren Anweisungen

Eine ausführbare Anweisung hat Aktionen zur Folge. Sie kann eine Methode oder Funktion ausführen, eine Schleife durchlaufen oder in verschiedene Code-Blöcke verzweigen. Ausführbare Anweisungen enthalten oftmals mathematische oder bedingte Operatoren.

0	Das folgende Beispiel verwendet eine For Each...Next-Anweisung, um jede Zelle in einem Bereich mit Namen Bereich1 in Tabelle1 einer aktiven Microsoft Excel-Arbeitsmappe zu durchlaufen. Die Variable c ist eine Zelle in der Auflistung von Zellen, die in Bereich1 enthalten sind.

Sub Formatieren()

0	Const Grenze As Integer = 33

1	For Each c In Worksheets("Tabelle1").Range("Bereich1").Cells

2	If c.Value > Grenze Then

3	With c.Font

4	.Bold = True

5	.Italic = True

6	End With

7	End If

8	Next c

9	MsgBox "Fertig!"

10	End Sub

Die If...Then...Else-Anweisung im Beispiel überprüft den Wert der Zelle. Ist der Wert größer als 33, legt die With-Anweisung die Bold- und Italic-Eigenschaften des Font-Objekts für diese Zelle fest. If...Then...Else-Anweisungen enden mit End If.

0	Durch die With-Anweisung können wiederholte Eingaben vermieden werden, da die enthaltenen Anweisungen automatisch für das dem Schlüsselwort With folgende Objekt ausgeführt werden.

1	Die Next-Anweisung ruft die nächste Zelle in der Auflistung von Zellen auf, die in Bereich1 enthalten sind.

2	Die MsgBox-Funktion, die ein in Visual Basic integriertes Dialogfeld anzeigt, zeigt eine Meldung zur Beendigung der Sub-Prozedur an.


Schreiben von Daten in Dateien

Beim Arbeiten mit großen Datenmengen werden Daten oft in Dateien geschrieben oder daraus gelesen. Mit der Open-Anweisung können Sie Dateien erstellen und direkt darauf zugreifen. Open stellt drei verschiedene Zugriffsarten zur Verfügung:

•	Sequentieller Zugriff (Modi Input, Output und Append) wird häufig zum Schreiben einfacher Textdateien verwendet, z.B. für Fehlerprotokolle und Berichte.

•	Wahlfreier Zugriff (Modus Random) wird zum Lesen und Schreiben in einer Datei verwendet, ohne die Datei zu schließen. In Dateien mit wahlfreiem Zugriff werden die Daten in Datensätzen gespeichert, was das schnelle Auffinden von Informationen erleichtert.

•	Binärer Zugriff (Modus Binary) wird in einigen Spezialfällen verwendet, um an einer beliebigen Byteposition in einer Datei zu schreiben oder zu lesen, z.B. beim Speichern oder Anzeigen eines Bildes im Bitmap-Format.

Anmerkung   Die Open-Anweisung sollte nicht dazu verwendet werden, um Dateien zu öffnen, die spezifisch für eine bestimmte Anwendung sind. Verwenden Sie Open z.B. nicht, um ein Word-Dokument, eine Microsoft Access-Datenbank oder eine Microsoft Excel-Tabelle zu öffnen. Dies würde den Verlust von Datenintegrität und eine Beschädigung der Datei bedeuten.

In der folgenden Tabelle sind die Anweisungen aufgeführt, die normalerweise beim Lesen und Schreiben in Dateien verwendet werden.

Zugriffstyp	Schreiben von Daten	Lesen von Daten
Sequentiell	Print #, Write #	Input #
Wahlfrei	Put	Get
Binär	Put	Get


Schreiben von Anweisungen in Visual Basic

Eine Anweisung in Visual Basic gibt eine vollständige Aktion an. Sie kann Schlüsselwörter, Operatoren, Variablen, Konstanten und Ausdrücke enthalten. Jede Anweisung gehört zu einer der folgenden drei Kategorien:

•	Deklarationsanweisungen, die eine Variable, Konstante oder Prozedur benennen und auch einen Datentyp angeben.

Schreiben von Deklarationsanweisungen

•	Zuweisungsanweisungen, die einen Wert oder Ausdruck einer Variablen oder Konstanten zuweisen.

Schreiben von Zuweisungen

•	Ausführbare Anweisungen, die Aktionen bewirken. Diese Anweisungen können eine Methode oder Funktion und eine Schleife oder eine Verzweigung zu Code-Blöcken ausführen. Ausführbare Anweisungen enthalten oftmals mathematische oder bedingte Operatoren.

Schreiben von ausführbaren Anweisungen

Fortsetzen einer Anweisung über mehrere Zeilen

Eine Anweisung paßt normalerweise in eine Zeile. Sie können aber auch eine Anweisung in der nächsten Zeile fortsetzen, indem Sie ein Zeilenfortsetzungszeichen verwenden. Im folgenden Beispiel wird die ausführbare Anweisung MsgBox über drei Zeilen fortgesetzt:

Sub DemoFeld()  ' Diese Prozedur deklariert eine

 ' Zeichenfolgenvariable, weist ihr den

 ' Wert Christine zu und zeigt dann

 ' die zusammengesetzte Meldung an.

Dim meineVar As String

meineVar = "Christine"

MsgBox Prompt:="Hallo " & meineVar, _

Title:="Begrüßungsfeld", _

Buttons:=vbExclamation

End Sub

Hinzufügen von Kommentaren

Kommentare können eine Prozedur oder eine bestimmte Anweisung erklären. Visual Basic ignoriert Kommentare beim Ausführen der Prozeduren. Kommentarzeilen beginnen mit einem Apostroph (') oder mit Rem gefolgt von einem Leerzeichen und können überall in einer Prozedur eingefügt werden. Geben Sie einen Apostroph gefolgt von einem Kommentar nach der Anweisung an, um diesen Kommentar auf die gleiche Zeile zu setzen wie die Anweisung. Standardmäßig werden Kommentare als grüner Text angezeigt.

Überprüfen von Syntax-Fehlern

Wenn Sie die EINGABETASTE nach Eingabe einer Code-Zeile drücken und die Zeile in rot angezeigt wird (oder eine Fehlermeldung angezeigt wird), müssen Sie den Fehler in Ihrer Anweisung ermitteln und korrigieren.


Verwenden des Add-In Managers

Verwenden Sie das Dialogfeld Add-In Manager, um ein Add-In zu laden oder zu entladen. Wenn Sie nur den sichtbaren Teil eines Add-Ins schließen, indem Sie beispielsweise auf das Systemmenü doppelklicken oder auf die Schaltfläche Schließen klicken, werden die Formulare zwar nicht mehr angezeigt, aber das Add-In befindet sich immer noch im Speicher. Das Add-In-Objekt selbst wird solange im Speicher bleiben, bis das Add-In im Dialogfeld Add-In-Manager entfernt wurde.