it-swarm.com.de

VBA konvertiert String in Int, wenn String eine Zahl ist

Ich muss eine Zeichenfolge aus Excel in VBA in ein Interger konvertieren. Dazu benutze ich CInt (), was gut funktioniert. Es besteht jedoch die Möglichkeit, dass es sich bei der Zeichenfolge nicht um eine Zahl handelt. In diesem Fall muss die Ganzzahl auf 0 gesetzt werden. Derzeit habe ich Folgendes:

If oXLSheet2.Cells(4, 6).Value <> "example string" Then
  currentLoad = CInt(oXLSheet2.Cells(4, 6).Value)
Else
  currentLoad = 0
End If

Das Problem ist, dass ich nicht alle möglichen nicht numerischen Zeichenfolgen vorhersagen kann, die sich in dieser Zelle befinden könnten. Gibt es eine Möglichkeit, zu sagen, dass es konvertiert werden soll, wenn es eine Ganzzahl ist und wenn nicht, auf 0 gesetzt wird?

57
Captastic

Verwenden Sie IsNumeric. Es gibt true zurück, wenn es eine Zahl ist, oder false, wenn dies nicht der Fall ist.

Public Sub NumTest()
    On Error GoTo MyErrorHandler

    Dim myVar As Variant
    myVar = 11.2 'Or whatever

    Dim finalNumber As Integer
    If IsNumeric(myVar) Then
        finalNumber = CInt(myVar)
    Else
        finalNumber = 0
    End If

    Exit Sub

MyErrorHandler:
    MsgBox "NumTest" & vbCrLf & vbCrLf & "Err = " & Err.Number & _
        vbCrLf & "Description: " & Err.Description
End Sub
94
ForEachLoop

Cast to Long oder Cast to Int, beachten Sie Folgendes.

Diese Funktionen sind eine der Ansichtsfunktionen in Excel VBA, die von den regionalen Systemeinstellungen abhängen. Wenn Sie also in einigen Ländern in Europa ein Komma in Ihrem Doppelten verwenden, tritt in den USA ein Fehler auf.

Zum Beispiel wird in der europäischen Excel-Version 0,5 mit CDbl () eine gute Leistung bringen, in der US-Version jedoch mit 5. Daher empfehle ich, die folgende Alternative zu verwenden:

Public Function CastLong(var As Variant)

    ' replace , by .
    var = Replace(var, ",", ".")        

    Dim l As Long
    On Error Resume Next
    l = Round(Val(var))

    ' if error occurs, l will be 0
    CastLong = l

End Function

' similar function for cast-int, you can add minimum and maximum value if you like
' to prevent that value is too high or too low.
Public Function CastInt(var As Variant)

    ' replace , by .
    var = Replace(var, ",", ".")

    Dim i As Integer
    On Error Resume Next
    i = Round(Val(var))

    ' if error occurs, i will be 0
    CastInt = i

End Function

Natürlich können Sie auch an Fälle denken, in denen Leute Kommas und Punkte verwenden, z. B. dreitausend als 3.000,00. Wenn Sie für diese Art von Fällen Funktionen benötigen, müssen Sie nach einer anderen Lösung suchen.

6
PeterH

Versuchen Sie dies: currentLoad = ConvertToLongInteger(oXLSheet2.Cells(4, 6).Value) mit dieser Funktion:

Function ConvertToLongInteger(ByVal stValue As String) As Long
 On Error GoTo ConversionFailureHandler
 ConvertToLongInteger = CLng(stValue)  'TRY to convert to an Integer value
 Exit Function           'If we reach this point, then we succeeded so exit

ConversionFailureHandler:
 'IF we've reached this point, then we did not succeed in conversion
 'If the error is type-mismatch, clear the error and return numeric 0 from the function
 'Otherwise, disable the error handler, and re-run the code to allow the system to 
 'display the error
 If Err.Number = 13 Then 'error # 13 is Type mismatch
      Err.Clear
      ConvertToLongInteger = 0
      Exit Function
 Else
      On Error GoTo 0
      Resume
 End If
End Function

Ich habe Long (Integer) anstelle von Integer gewählt, weil die minimale/maximale Größe einer Ganzzahl in VBA mies ist (min: -32768, max: +32767). In Tabellenkalkulationsoperationen ist es üblich, dass eine Ganzzahl außerhalb dieses Bereichs liegt.

Der obige Code kann geändert werden, um die Konvertierung von Zeichenfolge in Ganzzahlen, in Währung (mit CCur ()), in Dezimal (mit CDec ()), in Double (mit CDbl ()) usw. zu handhaben. Ersetzen Sie einfach die Konvertierungsfunktion selbst (CLng). Ändern Sie den Rückgabetyp der Funktion und benennen Sie alle Vorkommen der Funktionsvariablen um, um die Konsistenz zu gewährleisten.

3

Um es in eine Zeile zu setzen:

currentLoad = IIf(IsNumeric(oXLSheet2.Cells(4, 6).Value), CInt(oXLSheet2.Cells(4, 6).Value), 0)
1
ray