Syntax-Fehler, logische Fehler, Laufzeitfehler, Datentyp-Probleme
Datentyp-Probleme in VBA
Datentyp-Probleme in VBA
Auf dieser Seite
Mit Bild
Obwohl automatische Datentyp-Konvertierungen oft als Bequemlichkeit und Vorteil betrachtet werden, sind sie doch sicherer Anlass für ganz besonders schwierig zu findende Fehler. Diese treten nämlich nur manchmal auf, je nachdem, wie "unglücklich" der Dateninhalt gerade auftritt.
Mit Bild
An der Grenze zu richtigen Syntaxfehlern sind einige Besonderheiten, die im Umgang mit VBA beachtet werden müssen. Dazu gehört vor allem die unvorhersehbare Datentyp-Umwandlung. Eine Anweisung wie
Mit Bild
Dim i As Integer i = "123" MsgBox i / 2
Mit Bild
darf eigentlich bereits von einem Compiler nicht akzeptiert werden, weil der Dateninhalt ein klarer Verstoß gegen die Deklaration ist. Genauso undenkbar ist
Mit Bild
Const i As Integer = "123"
Mit Bild
weil dieser angeblichen Integer-Konstanten sogar schon in der gleichen Zeile eine String-Variable zugewiesen wird.
Mit Bild
Automatische Umwandlungen
VBA kümmert sich kaum um korrekte Datentypen, was allerdings zu recht überraschenden Umwandlungen führen kann. Sie sollten daher immer darauf achten, dass nur passende Werte in die Variablen geschrieben werden.
Nun mögen Sie es pingelig finden, solche Regel-Verstöße zu kritisieren, zumal es manchmal sehr praktisch scheint. Der folgende Code zeigt so einen Fall, natürlich stark vereinfacht.
Mit Bild
Sub DatentypVerletzung() Dim i As Integer i = InputBox("Bitte Zahl eingeben") MsgBox "Die Zahl war: " & i End Sub
Mit Bild
Für ganze Zahlen ist das unproblematisch, jedenfalls innerhalb des Größenbereichs von Integer-Zahlen bis 32767. Aber was ist mit 1,2 oder 1,7?
Eigentlich lässt sich in einer Integer-Zahl keine Nachkommastelle speichern, so dass entweder eine Datentyp-Verletzung gemeldet werden müsste oder nur der ganzzahlige Anteil übernommen werden dürfte.
Nicht so bei VBA: das Problem wird nicht bloß verschwiegen, sondern außerdem noch unangekündigt eine Auf- oder Abrundung vorgenommen. Das tatsächliche Ergebnis ist also 1 statt 1,2 beziehungsweise 2 statt 1,7.
Der einzig berechtigte Einwand gegen dieses überraschende Verhalten ist, dass es wenigstens in der Hilfe dokumentiert ist.
Mit Bild
Addieren oder Verketten
Historisch bedingt verwechseln viele Programmierer immer noch die Addition zweier Zahlen mit der Verkettung zweier Zeichenketten. Das kann zu hinterhältigen Umwandlungen führen, mit denen Sie wahrscheinlich nicht gerechnet haben.
Eine weitere Merkwürdigkeit in diesem Zusammenhang ist nur historisch erklärbar. "Das war schon immer so", ist zwar eine der schwächsten Begründungen, aber überzeugender geht es eben nicht. Betrachten Sie doch einmal das nächste Listing:
Mit Bild
Sub AllesZusammen() Dim varA As Variant Dim varB As Variant Dim strC As String varA = "1" varB = "2,3" strC = varA + varB MsgBox strC End Sub
Mit Bild
Welches Ergebnis mag wohl in strC stehen? Da sich Zeichenketten natürlich nicht addieren lassen, muss das Verketten zweier solcher String-Variablen den Text 12,3 ergeben und nicht etwa die Zahl 3,3.
Das +-Zeichen als Verkettungs-Operator ist zwar heute nicht mehr so vorgesehen, war aber beispielsweise in WordBasic (der Word-Programmiersprache vor 1997) nicht anders möglich. Wie Sie in erstaunlich vielen Beispielen auch im Internet sehen können, werden aber noch ganz viele Prozeduren wie damals programmiert.
Nun ändern Sie bitte mal die erste Zuweisung durch Löschen der Gänsefüßchen in varA = 1 und betrachten nun das Ergebnis. Überrascht? Jetzt ist das Ergebnis nämlich 3,3 statt 12,3 und trotzdem noch eine String-Variable.
Nun können Sie natürlich einwenden, dass Sie ja den Inhalt der Variablen bewusst und mutwillig verändert haben. Das gilt jedoch nur, wenn Sie immer wissen, welcher Inhalt darin steht.
Wenn Ihr Programm an dieser Stelle eine Benutzereingabe benötigt oder Daten aus einer Datei eingelesen hat, bleibt das Wagnis der völlig zufälligen Berechnung weiter bestehen.
Die sichere Variante ist entweder die korrekte Verkettung zweier Variablen mit dem tatsächlich dafür vorgesehenen &-Operator, also
Mit Bild
strC = CStr(varA) & CStr(varB)
Mit Bild
oder die explizite Umwandlung in Zahlen mit
Mit Bild
strC = CStr(CDbl(varA) + CDbl(varB))
Mit Bild
wenn denn tatsächlich Zahlen addiert werden sollen. Alles andere ist ein völlig unnötiges Risiko.