Allgemeines
über Limitationen in VBA und VB
Limitationen
bei der Verwendung von VBA-Anweisungen
Sprunganweisungen
Schleifenstrukturen
Entscheidungsstrukturen
Bedingte Verzweigungen
Spezifikationen/Wertebereiche
von Datentypen
Übersicht der Datentypen
Objekt-Variablen
Variant-Variablen
Datenfeld/Array-Variablen
Spezielle Limitationen
Choose- und Switch-Funktion
Erase-Anweisung
Allgemeines über Limitationen in VBA und VB
Auf dieser Seite werden die Limitationen und Spezifikationen der Programmiersprache VBA/VB vorgestellt.
Informationen über verwandte Themen wie Excel-VBA (Objektmodell), VBA-Editor, VBA-/VB-Projekte usw. finden Sie hier:
Weitere Informationen Alle
Limitationen in Excel-VBA und im Excel-Objektmodell finden Sie hier: Alle
Limitationen im VBA-Editor von Microsoft Excel finden Sie hier: Alle
Limitationen in Projekten sind hier vorgestellt: Die
Limitationen von Benutzerformularen und Steuerelementen sind hier beschrieben: |
Limitationen bei der Verwendung von VBA-Anweisungen
Nachfolgend werden die Limitationen vorgestellt, die Sie bei der Verwendung von bestimmten VBA-/VB-Anweisungen beachten müssen. Alle Angaben stammen aus der Microsoft Excel 97 Visual Basic-Referenz.
Beachten Sie, dass es bei den beschriebenen Fehlermeldungen nicht um so genannte auffangbare Fehler handelt (Laufzeitfehler).
Sprunganweisungen (GoTo, GoSub)
Die Zielmarke kann nicht angesprungen werden; Schleife, Select Case oder If-Block ist zu gross
Prozeduren dürfen von Anfang bis Ende maximal 64 KB umfassen, aber da Sprünge innerhalb einer Prozedur vorwärts oder rückwärts erfolgen können, sind derartige Sprünge auf 32'767 Bytes in beiden Richtungen beschränkt. Für diesen Fehler gibt es die folgenden Ursachen und Lösungen:
Sie haben eine Sprunganweisung (GoTo, GoSub) verwendet, deren Zielmarke weiter als 32'767 Bytes von der Sprunganweisung entfernt ist.
Verschieben Sie die Zielmarke näher an die Sprunganweisung, oder verkleinern Sie die Prozedur.
Schleifenstrukturen (Do-Loop, While-Wend, For-Next)
Die Zielmarke kann nicht angesprungen werden; Schleife, Select Case oder If-Block ist zu gross
Prozeduren dürfen von Anfang bis Ende maximal 64 KB umfassen, aber da Sprünge innerhalb einer Prozedur vorwärts oder rückwärts erfolgen können, sind derartige Sprünge auf 32'767 Bytes in beiden Richtungen beschränkt. Für diesen Fehler gibt es die folgenden Ursachen und Lösungen:
Sie haben eine sehr grosse Schleifenstruktur verwendet, die von Anfang bis Ende mehr als 32 KB Speicher benötigt.
Verkleinern Sie die Schleife.
Entscheidungsstrukturen (If-Then-Else, Select-Case)
Die Zielmarke kann nicht angesprungen werden; Schleife, Select Case oder If-Block ist zu gross
Prozeduren dürfen von Anfang bis Ende maximal 64 KB umfassen, aber da Sprünge innerhalb einer Prozedur vorwärts oder rückwärts erfolgen können, sind derartige Sprünge auf 32'767 Bytes in beiden Richtungen beschränkt. Für diesen Fehler gibt es die folgenden Ursachen und Lösungen:
Sie haben eine sehr grosse If-Blockstruktur verwendet, die einen Then- oder Else-Abschnitt enthält, der von Anfang bis Ende mehr als 32 KB Speicher benötigt.
Verkleinern Sie den Abschnitt der Struktur, der mehr als 32 KB umfasst.
Bedingte Verzweigungen (On...GoSub, On...GoTo)
Unzulässiger Prozeduraufruf oder ungültiges Argument
Verzweigt zu einer von mehreren angegebenen Zeilen, abhängig vom Wert eines Ausdrucks.
Ein beliebiger numerischer Ausdruck, der eine ganze Zahl im Bereich von 0 bis 255 (einschliesslich) ergibt. Wenn Ausdruck keine ganze Zahl ergibt, wird das Ergebnis vor der Auswertung gerundet.
Negativ: Ein Fehler tritt auf.
Grösser als 255: Ein Fehler tritt auf.
Laufzeitfehler 5 "Unzulässiger Prozeduraufruf oder ungültiges Argument"
Spezifikationen/Wertebereiche von Datentypen
| 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. |
Wie man Variablen benennen sollte, erfahren Sie hier:
Weitere Informationen |
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.
Ein spezieller Datentyp, der numerische Daten, Zeichenfolgen oder Datumsdaten ebenso wie die speziellen Werte Empty und Null enthalten kann. Der Datentyp Variant hat eine numerische Speichergrösse von 16 Bytes und kann Daten bis zum Wertebereich des Datentyps Decimal enthalten. Seine Speichergrösse für Zeichen beträgt 22 Bytes plus Länge der Zeichenfolge, wobei jede Zeichenfolge gespeichert werden kann. Die VarType-Funktion bestimmt, wie die Daten im Datentyp Variant behandelt werden. Alle Variablen werden zum Datentyp Variant, wenn sie nicht ausdrücklich als andere Datentypen deklariert sind.
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össe verschiedener Datenfelder:
' Nachstehendes Datenfeld aus
Elementen des Datentyps
' Integer beansprucht 22 Bytes (11 Elemente * 2 Bytes)
ReDim MeinIntegerDatenfeld(10) As Integer
' Nachstehendes Datenfeld aus Elementen des Datentyps
' Double beansprucht 88 Bytes (11 Elemente * 8 Bytes)
ReDim MeinDoubleDatenfeld(10) As Double
' Nachstehendes Datenfeld aus Elementen des Datentyps
' Variant beansprucht mindestens 176 Bytes (11 Elemente * 16 Bytes)
ReDim MeinVariantDatenfeld(10)
' Nachstehendes Datenfeld aus Elementen des Datentyps
' Integer beansprucht 100 * 100 * 2 Bytes (20.000 Bytes)
ReDim MeinIntegerDatenfeld (99, 99) As Integer
' Nachstehendes Datenfeld aus Elementen des Datentyps
' Double beansprucht 100 * 100 * 8 Bytes (80.000 Bytes)
ReDim MeinDoubleDatenfeld (99, 99) As Double
' Nachstehendes Datenfeld aus Elementen des Datentyps
' Variant beansprucht mindestens 160.000 Bytes (100 * 100 * 16 Bytes)
ReDim MeinVariantDatenfeld(99, 99)
Die maximale Grösse 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.
Weitere Informationen über Arbeitsspeicher und Datenfelder erhalten Sie hier:
Weitere Informationen |
Normalerweise kann man einer VBA-Funktion maximal 30 Argumente übergeben. Die beiden Funktionen Choose und Switch bilden hierbei eine Ausnahme. Sie können nämlich mehr als 30 Argumente verarbeiten, weil sie mit einem so genannten Parameter-Array arbeiten.
-> ParamArray
Public Function MyChoose(Index As Single, ParamArray
Choice())
On Error GoTo BadChoice
If IsObject(Choice(Index - 1)) Then
Set MyChoose = Choice(Index - 1)
Else
MyChoose = Choice(Index - 1)
End If
Exit Function
BadChoice:
MyChoose = Null
End Function
Hinweis
Die Limitation von 30 Argumenten gilt nur für die VBA-Funktion Choose und
nicht für die gleichnamige Tabellenfunktion Choose (WAHL) von Microsoft Excel.
Initialisiert die Elemente von Datenfeldern fester Grösse neu und gibt den von einem dynamischen Datenfeld belegten Speicherplatz frei.
Syntax
Erase Datenfeldliste
Das erforderliche Argument Datenfeldliste enthält eine oder mehrere durch Kommas getrennte Datenfeldvariablen, die gelöscht werden sollen.
Bemerkungen
Sie sollten wissen, ob es sich um ein Datenfeld mit fester Grösse oder ein dynamisches Datenfeld handelt, da sich Erase je nach Datenfeldtyp unterschiedlich verhält. Erase gibt bei Datenfeldern mit fester Grösse keinen Speicherplatz frei und legt die Elemente folgendermassen fest:
| Datenfeldtyp | Wirkung auf die Datenfeldelemente |
| Fixed numeric array | Sets each element to zero. |
| Fixed string array (variable length) | Sets each element to a zero-length string (""). |
| Fixed string array (fixed length) | Sets each element to zero. |
| Fixed Variant array | Sets each element to Empty. |
| Array of user-defined types | Sets each element as if it were a separate variable. |
| Array of objects | Sets each element to the special value Nothing. |
Bei dynamischen Datenfeldern gibt Erase den verwendeten Speicher frei. Vor dem nächsten Verweis auf das dynamische Datenfeld aus dem Programm müssen die Dimensionen der Datenfeldvariablen mit einer ReDim-Anweisung neu deklariert werden.
Haben Sie Fragen,
Anregungen oder einen Fehler entdeckt?
Kontakt zum Autor
Zuletzt aktualisiert am
18.04.2006 / 17:00 Uhr
Zuletzt kontrolliert am 19.12.2008 / 17:00 Uhr
© 2002-2009 by Philipp von Wartburg, Schweiz
Alle Rechte vorbehalten