17. Variablen
17.1 Deklarieren von Variablen und Argumenten vor ihrer
Verwendung
Variablen und Argumente müssen
Sie im Visual Basic-Code vor ihrer Verwendung nicht explizit
kennzeichnen. Die folgende Funktion verwendet das Argument zahl,
die Variable Tmpwert und sicherewurzel (Rückgabewert). Visual
Basic erkennt diese Elemente automatisch, verarbeitet sie und
vereinfacht dadurch das Erstellen von Prozeduren und Funktionen
in Visual Basic.
Function SichereWurzel(Zahl) TmpWert = Abs(Zahl)
SichereWurzel = Sqr(TmpWert)
End Function
Das Deklarieren von Variablen und Argumenten kann jedoch
vorteilhaft sein, da sich Visual Basic auf ihre Verwendung
einstellen kann.
17.2. Gründe für das Deklarieren von
Variablen oder Argumenten vor ihrer Verwendung
Explizite Deklarationen und Datentypen führen zu:
schneller ausführendem Code
geringeren Speicheranforderungen
und helfen , Programmfehler zu vermeiden.
Die Variable Tmpwert
im vorhergehenden Beispiel wird von Visual Basic automatisch
erkannt und kann genauso verwendet werden wie nach einer
expliziten Deklaration. Dies kann aber zu Fehlern im Code führen.
Wenn Sie z.B. die Variable in der vorletzten Zeile versehentlich
als TmpQert (Tippfehler) eingeben, wird sie von Visual Basic als
neue Variable interpretiert. Da TmpQert zu Beginn gleich Null ist
und auch die Quadratwurzel von Null den Wert Null ergibt, liefert
die Funktion immer Null (ohne Fehlermeldung).
Probleme mit falsch benannten Variablen lassen sich vermeiden.
Sie können Visual Basic anweisen, bei jedem Namen, der nicht
vorher explizit als Variable deklariert wurde, eine Fehlermeldung
anzuzeigen. Fügen Sie dazu die folgende Anweisung am Anfang
Ihres Visual Basic-Moduls ein:
Option Explicit
Jetzt müssen Variablen explizit deklariert
werden. Innerhalb einer Prozedur führen Sie solche Deklarationen
mit der Dim-Anweisung und einem Variablennamen durch.
Dim Variablenname
Die überarbeitete
Version der Funktion sicherewurzel enthält eine deklarierte
Variable.
Option
Explicit
Function SichereWurzel(Zahl)
Dim TmpWert
TmpWert = Abs(Zahl)
SichereWurzel = Sqr(TmpWert)
End Function
Wird die Variable Tmpwert versehentlich falsch eingegeben, zeigt
Visual Basic beim Ausführen des Codes oder beim Eingeben der
Funktion in eine Zelle eine Fehlermeldung an. Wenn Sie Option
Explicit nicht am Anfang des Moduls angeben, können Sie trotzdem
Variablen explizit deklarieren, die anderen werden automatisch
implizit deklariert.
17.3
. Globales Erzwingen expliziter Variablendeklarationen
Die Option Explicit-Anweisung unterstützt die Fehlersuche, und
sie kann von Visual Basic erzwungen werden.
So fügen Sie Option Explizit automatisch in alle neuen Module
ein:
Wählen Sie aus dem Menü Extras den Befehl Optionen.
Wählen Sie das Register Editor.
Aktivieren Sie das Kontrollkästchen "Variablendeklaration erforderlich".
Wählen Sie "OK".
17.4. Speichern unterschiedlicher
Informationen mit dem Datentyp Variant
Jede Variable besitzt einen Datentyp. Der Datentyp legt die Art
der zulässigen Daten, z.B. ganze Zahlen, Zeichenfolgen oder
Datumsangaben, für eine Variable oder ein anderes Element fest.
Ohne explizite Angabe eines Datentyps erhält eine Variable den
Datentyp Variant (Standarddatentyp). Dieser
Datentyp kann verschiedene Arten von Daten (Zahlen, Zeichenfolgen
oder Datums- und Zeitangaben) speichern. Das Verwenden des
Datentyps Variant ermöglicht Ihnen, auf die Deklaration von
Variablen zu verzichten oder Variablen einzusetzen, die während
der Ausführung verschiedenartige Werte enthalten.
Variant -Variablen verhalten sich im folgenden Fall wie Zellen in
einem Tabellenblatt: Die Art der gespeicherten Daten hängt von
dem zuletzt eingegebenen Wert ab.
In der folgenden Funktion-Prozedur enthält x verschiedene Arten
von Daten.
Function Rückgabetyp(EinWert)
X = EinWert 'X
ist ein Variant mit einem beliebigem Wert.
X = "Hallo Welt" 'X ist ein Variant mit einer Zeichenfolge.
X = 24-12-1994 'X
ist ein Variant mit einem Datum.
X = 10 'X ist
ein Variant mit einer Zahl.
Rückgabetyp = TypeName(X) 'Der Rückgabetyp ist "Integer", aber die
Variable noch immer ein Variant.
End Function
Visual Basic nimmt bei der Verarbeitung von Variant-Variablen
automatisch mathematische Anpassungen vor.
Dim EinWert ' Variant ist die Voreinstellung.
EinWert = "17" ' EinWert enthält "17" (Zeichenfolge mit
2 Zeichen)
EinWert = EinWert - 15 ' EinWert soll die Zahl 2 enthalten.
EinWert = "U" & EinWert ' EinWert soll "U2"
(Zeichenfolge mit 2 Zeichen) enthalten.
17.5. Festlegen des Datentyps für
eine Variable
Variant-Variablen erleichtern zwar das Schreiben von Code, in
manchen Situationen ist es jedoch sinnvoll, Variablen eines
bestimmten Typs zu deklarieren, wenn eine Variable z.B. immer
eine ganze Zahl enthalten soll. Sie legen für eine Variable
einen bestimmten Datentyp fest, indem Sie die Dim- Anweisung mit
dem Namen der Variablen und dem Namen des gewünschten Datentyps
angeben.
Dim Variablenname As Type
In dieser Syntax ist As Type optional (d.h. Variablen lassen sich
auch ohne einen Typ deklarieren und sind dann vom Typ Variant).
Die überarbeitete Version der Funktion sicherewurze1 wandelt das
Argument zahl in eine ganze Zahl um und setzt für das Argument
Tmpwert ebenfalls eine ganze Zahl voraus.
Function SicherWurzel(Zahl)
'Explizite
Deklaration von TmpWert als ganze Zahl
Dim TmpWert As Integer
TmpWert = Abs(Int(Zahl))
SichereWurzel = Sqr(TmpWert)
End Function
Im
vorhergehenden Beispiel wird einer der Grunddatentypen, der
Datentyp Integer verwendet. In der folgenden Tabelle sind alle
Visual Basic unterstützten Grunddatentypen mit ihrem
Speicherbedarf und dem zulässigen Wertebereich aufgeführt.
Datentyp |
Speicherbedarf |
Wertebereich |
Byte | 1 Byte | 0 bis 255 |
Boolean | 2 Bytes | True oder False |
Integer | 2 Bytes | -32.768 bis 32.767 |
Long (lange Ganzzahl) | 4 Bytes | -2.147.483.648 bis 2.147.483.647 |
Single(Gleitkommazahl mit einfacher Genauigkeit) |
4 Bytes | -3,402823E38 bis -1,401298E-45
für negative Werte; 1,401298E-45 bis 3,402823E38 für positive Werte. |
Double(Gleitkommazahl mit doppelter Genauigkeit) |
8 Bytes | -1,79769313486232E308 bis
-4,94065645841247E-324 für negative Werte; 4,94065645841247E-324 bis 1,79769313486232E308 für positive Werte |
Currency (skalierte Ganzzahl) | 8 Bytes | -922.337.203.685.477,5808
bis 922.337.203.685.477,5807 |
Decimal | 14 Bytes | +/-79.228.162.514.264.337.593.543.950.335
ohne Dezimalzeichen; +/-7,9228162514264337593543950335 mit 28 Nachkommastellen; die kleinste Zahl ungleich Null ist +/-0,0000000000000000000000000001. |
Date | 8 Bytes | 1. Januar 100 bis 31. Dezember 9999. |
Object | 4 Bytes | Beliebiger Verweis auf ein Objekt vom Typ Object. |
String(variable Länge) | 10 Bytes | plus Zeichenfolgenlänge 0 bis ca. 2 Milliarden |
String(feste Länge) | Zeichenfolgenlänge | 1 bis ca. 65.400 |
Variant(mit Zahlen) | 16 Bytes | Numerische Werte im Bereich des Datentyps Double. |
Variant (mit Zeichen) | 22 Bytes plus Zeichenfolgenlänge | Wie bei String mit variabler Länge. |
Benutzerdefiniert (mit Type) | Zahl ist von Elementen abhängig | Der Bereich für jedes Element entspricht dem Bereich des zugehörigen Datentyps. |
Beispiele:
Dim Kosten As Currency
Dim FehlerAufgetreten As Boolean
Dim Kundenname As String
Dim Lieferdatum As Date
Dim Gästeanzahl As Integer
Dim NeuePostleitzahlen As Long
Dim Probengewicht As Single
Dim MasseDesUniversums As Double
Mit der Dim-Anweisung können mehrere Deklarationen in einer Zeile kombiniert werden.
Dim I As Integer, Menge
As Double
Dim TestName As String,
BezahlteRechnungen As Currency
Dim Test, J As Integer, Menge2
Anmerkung: Im vorhergehenden Beispiel haben die
Variablen Test und Menge2 den Datentyp Variant.
17.6. Überprüfen des Datentyps
einer Variablen
Sie können
Fehler vermeiden, indem Sie den Datentyp einer Variablen überprüfen.
Mit der TypeName-Funktion stellen Sie fest,
ob eine Variable einen bestimmten Datentyp hat.
If TypeName(Einheiten)
<> "Double" Then MsgBox
"Nur Zahlen eingeben"
End If
Wenn Sie mathematische Operationen oder Funktionen an einer
Variablen des Typs Variant durchführen, und die Variable weder
eine Zahl noch einen als Zahl interpretierbaren Wert (z.B. Datums-
und Zeitangaben oder Zeichenfolgen, die Zahlen enthalten) enthält,
tritt ein Fehler auf. Mit der IsNumeric-Funktion können Sie
feststellen, ob Sie den Wert einer Variant-Variablen als Zahl
verwenden können. Isnumeric gibt
den Wert Wahr zurück, wenn das Argument einem beliebigen
Zahlentyp (Integer, Long, Single oder Double) entspricht und als
Zahl ausgewertet werden kann.
Sub typ()
Dim einezahl
Do
einezahl = InputBox("Geben Sie eine Zahl ein:")
Loop Until
IsNumeric(einezahl)
MsgBox "Die Quadratwurzel beträgt: "
& Sqr(einezahl)
End Sub
17.7. Festlegen des Datentyps für
ein Argument und Rückgabewert
Beispiel: In der Funktion wird für das erste
Argument der Typ String und für das zweite der Typ Integer
erwartet.
Function KehreUm(S As String,
n As Integer) as String ' Kehrt die ersten n Zeichen in S um.
Dim Temp As String, i As Integer
If n > Len(S) Then n = Len(S)
For i = n To 1 Step -1
Temp = Temp + Mid$(S, i, 1)
Next i
KehreUm = Temp + Right$(S, Len(S)
- n)
End Function
Erläuterung: Die Reihenfolge der ersten n
Zeichen in der übergebenen Zeichenfolge wird umgekehrt.
Aufruf: =kehreum ( "nur ein Test ; 3 ) in eine Zelle eines
Tabellenblattes eingeben.
Das Ergebnis ist "run ein Test".
17.8. Deklaration und Gültigkeitsbereich
von Variablen
Lokal - Wenn Sie eine Variable in einer Prozedur
erzeugen ist sie nur dort sichtbar. Variable=Wertzuweisung
oder gleich unterhalb des Prozedur- oder Funktionskopfes ausdrücklich
einrichten:
Sub EineProzedur()
Dim Variable
End Sub
dann ist diese Variable "lokal",
das heißt, Sie ist nur in dieser Prozedur "sichtbar".
Verlässt Ihr Programm die Prozedur, wird die Variable im
Computerspeicher gelöscht.
Privat - In allen Prozeduren und Funktionen
eines Modulblattes sichtbar wird eine Variable dann, wenn Sie sie
am Beginn des Modulblattes - noch vor dem Beginn der ersten
Prozedur - mit einer "Private"-Anweisung deklarieren:
Private Variable as Integer
Sub Hauptprozedur()
Variable=Wertzuweisung
End Sub
Wird das Modul verlassen, wird
die Variable im Computerspeicher gelöscht. Wird in einer
Prozedur/Funktion eine Variable deklariert, die denselben Namen
hat wie eine private Variable im selben Modulblatt, dann "verbirgt"
diese Variable den Blick auf die modulweit gültige.
Private TagesDatum as Integer
Sub Hauptprozedur()
Dim TagesDatum as Date
Variable=Wertzuweisung
End Sub
Public
- In allen Prozeduren und Funktionen eines Projekts sichtbar,
solange das zugehörige VBA-Programm läuft ist eine Variable
dann, wenn Sie sie am Beginn eines Modulblattes - noch vor dem
Beginn der ersten Prozedur-mit einer "Public"-Anweisung
deklarieren:
Public Variable As Integer
Sub Hauptprozedur()
Variable=Wertzuweisung
End Sub
Wird auf Modulebene oder in
einer Prozedur oder Funktion eine gleichnamige Variable definiert,
dann "verbirgt" diese Variable im ganzen Modulblatt den
Blick auf die projektweit gültige. Ein "Projekt" umfasst
sämtlichen Code in sämtlichen Modulblättern, die für ein VBA-Programm
angelegt worden sind.
Static - Mit der Anweisung Static in einer
Funktion oder Prozedur deklarierte Variablen behalten ihren Wert,
solange das VBA-Programm läuft.
Syntax: Static Username as String
17.9. Beispiele
Function SicherWurzel(zahl)
'Explizite
Deklaration von TmpWert
Dim TempWert As Integer
TempWert = Abs(Int(zahl))
SicherWurzel = Sqr(TempWert)
End Function
Function Rückgabetyp(einwert)
X = einwert 'X
ist ein Variant mit einem beliebigem Wert.
X = "Hallo Welt" 'X ist ein Variant mit einer Zeichenfolge.
X = 24 - 12 - 1994 'X ist ein Variant mit einem Datum.
X = 10 'X ist
ein Variant mit einer Zahl.
Rückgabetyp = TypeName(X) 'Der Rückgabetyp ist "Ganz". aber die
Variable ist noch immer ein Variant.
End Function
Function Anpassung()
Dim einwert ' Variant ist die Voreinstellung.
einwert = "17" ' EinWert enthält "17" (Zeichenfolge mit
2 Zeichen)
einwert = einwert - 15 ' EinWert soll die Zahl 2 enthalten.
einwert = "U" & einwert ' EinWert soll "U2"
(Zeichenfolge mit 2 Zeichen) enthalten.
Anpassung = einwert
End Function
Option
Explicit
Dim i As Integer, menge As Double
Dim TestName As String,
BezahlteRechnungen As Currency
Dim test, J As Integer, menge2
Sub tester()
Debug.Print TypeName(TestName)
End Sub
Sub typ()
Dim einezahl
Do
einezahl = InputBox("Geben Sie eine Zahl ein:")
Loop Until
IsNumeric(einezahl)
MsgBox "Die Quadratwurzel beträgt: "
& Sqr(einezahl)
End Sub
Function KehreUm(S As String, n As Integer) As String '
Kehrt die ersten n Zeichen in S um.
Dim Temp As String, i As Integer
If n > Len(S) Then n = Len(S)
For i = n To 1 Step -1
Temp = Temp + Mid$(S, i, 1)
Next i
KehreUm = Temp + Right$(S, Len(S)
- n)
End Function
5 | 3 | 4 |