Syntax-Fehler, logische Fehler, Laufzeitfehler, Datentyp-Probleme

Datentyp-Probleme in VBA

∅ 1.7 / 6 Bewertungen

Datentyp-Probleme in VBA

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.

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

    Dim i As Integer
    
    i = "123"
    MsgBox i / 2

darf eigentlich bereits von einem Compiler nicht akzeptiert werden, weil der Dateninhalt ein klarer Verstoß gegen die Deklaration ist. Genauso undenkbar ist

Const i As Integer = "123"

weil dieser angeblichen Integer-Konstanten sogar schon in der gleichen Zeile eine String-Variable zugewiesen wird.

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.

Sub DatentypVerletzung()
    Dim i As Integer
    
    i = InputBox("Bitte Zahl eingeben")
    MsgBox "Die Zahl war: " & i
End Sub

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.

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:

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

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

strC = CStr(varA) & CStr(varB)

oder die explizite Umwandlung in Zahlen mit

strC = CStr(CDbl(varA) + CDbl(varB))

wenn denn tatsächlich Zahlen addiert werden sollen. Alles andere ist ein völlig unnötiges Risiko.