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:

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:

  1. Wählen Sie aus dem Menü Extras den Befehl Optionen.

  2. Wählen Sie das Register Editor.

  3. Aktivieren Sie das Kontrollkästchen "Variablendeklaration erforderlich".

  4. 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