String in Integer konvertieren und dabei Laufzeitfehler verhindern.

Tikonteroga

Erfahrenes Mitglied
Hallo,

ich habe ein Problem, dass ich in einer vernünftigen Programmiersprache schon längst gelöst hätte :)

Ich muss ein Arbeitsblatt (Worksheet) auswerden. Dabei ist in einer Spalte die Kalenderwoche engegeben. Ich muss jetzt die aktuellste Kalenderwoche ermitteln.

Jetzt zu meiner Frage.

Wie kann ich:

1. Prüfen, ob ein Zelleninhalt bzw. String ein ganzzahliger Long, Integer, Byte ist?
2. Wie kann ich den Zelleninhalt bzw. String in einen Long, Integer, Byte umwandeln, wenn die Prüfung ergeben hat, dass es ein Long, Integer oder Byte ist?
 

Yaslaw

alter Rempler
Moderator
ich habe ein Problem, dass ich in einer vernünftigen Programmiersprache schon längst gelöst hätte :)
Man kommt leider nicht umhin, in VB diverse Funktionen die man braucht selber zu schreiben. Ich habe inzwischen eine grössere Sammlung davon.

Das erste ist nicht ganz einfach. Ich hatte dazu mal 4 Funktionen geschrieben.
Visual Basic:
'/**
' * Copyright mpl by ERB software
' * http://wiki.yaslaw.info/dokuwiki/doku.php/vba/functions/index#isbyte
' *
' * Prüft on ein Value ein Byte-Wert ist
' * @param  Variant     Zu prüfender Wert
' * @return Boolean
' */
Public Function isByte(ByVal iExpression As Variant) As Boolean
    If Not IsNumeric(iExpression) Then Exit Function
    If iExpression < 0 Or 255 < iExpression Then Exit Function
    isByte = (CByte(iExpression) = iExpression)
End Function

'/**
' * Copyright mpl by ERB software 
' * http://wiki.yaslaw.info/dokuwiki/doku.php/vba/functions/index#isinteger
' *
' * Prüft on ein Value ein Integer-Wert ist
' * @param  Variant     Zu prüfender Wert
' * @param  Boolean     Angabe, ob Byte auch als Integer gelten (Byte: 0 bis 255)
' * @return Boolean
' */
Public Function isInteger(ByVal iExpression As Variant, Optional ByVal iWithByte As Boolean = False) As Boolean
    If Not IsNumeric(iExpression) Then Exit Function
    If iExpression < -32768 Or 32767 < iExpression Then Exit Function
    isInteger = (CInt(iExpression) = iExpression)
    If Not iWithByte And isInteger Then isInteger = Not isByte(iExpression)
End Function



'/**
' * Copyright mpl by ERB software
' * http://wiki.yaslaw.info/dokuwiki/doku.php/vba/functions/index#islong
' *
' * Prüft on ein Value ein Long-Wert ist
' * @param  Variant     Zu prüfender Wert
' * @param  Boolean     Angabe, ob Integer/Byte auch als Long gelten (Integer: -32768 bis 32767)
' * @return Boolean
' */
Public Function isLong(ByVal iExpression As Variant, Optional ByVal iWithInteger As Boolean = False) As Boolean
    If Not IsNumeric(iExpression) Then Exit Function
    If iExpression < -2147483648# Or 2147483647 < iExpression Then Exit Function
    isLong = (CLng(iExpression) = iExpression)
    If Not iWithInteger And isLong Then isLong = Not isInteger(iExpression)
End Function



'/**
' * Copyright mpl by ERB software
' * http://wiki.yaslaw.info/dokuwiki/doku.php/vba/functions/index#isdouble
' *
' * Prüft on ein Value ein Double-Wert ist
' * @param  Variant     Zu prüfender Wert
' * @param  Boolean     Flag ob ein Integer/Long als Double akzeptiert werden soll
' * @return Boolean
' */
Public Function isDouble(ByVal iExpression As Variant, Optional ByVal iWithIntLng As Boolean = False) As Boolean
    If Not IsNumeric(iExpression) Then Exit Function
    isDouble = (CDbl(iExpression) = iExpression)
    If Not iWithIntLng And isDouble Then isDouble = Not isLong(iExpression, True)
End Function

Und das Konvertieren selber: cLng(), cInt(), cByte()

Eine Methode über Error ist nicht zu empfehlen, da zB. die cByte() durchaus ein Double akzeptiert und entsprechend abschreibt.
Code:
?cByte(12.3)
 12