Home HomeXLimits - Hauptseite


Limitationen in VBA und VB

Inhaltsübersicht

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:
Limitationen in Excel-VBA und -Objekten

Alle Limitationen im VBA-Editor von Microsoft Excel finden Sie hier:
Limitationen im VBA-Editor (VBE)

Alle Limitationen in Projekten sind hier vorgestellt:
Limitationen in VBA- und VB-Projekten

Die Limitationen von Benutzerformularen und Steuerelementen sind hier beschrieben:
Limitationen von UserForms und Controls

To Top

 


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

To Top

 


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.

To Top

 


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.

To Top

 


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.

To Top

 


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"

To Top

 


Spezifikationen/Wertebereiche von Datentypen

Übersicht der 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

Phil's Office Secrets: Namenskonventionen, Richtlinien und Empfehlungen: Richtlinien für Variablennamen

To Top

 


Objekt-Variablen

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.

To Top

 


Variant-Variablen

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.

To Top

 


Datenfeld/Array-Variablen

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

Excel-Arbeitsspeicher

Limitationen von Arrays und Matrizen

To Top

 


Spezielle Limitationen

Choose- und Switch-Funktion

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.

To Top

 


Erase-Anweisung

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.

To Top


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