web-dev-qa-db-fra.com

vba convertir une chaîne en entier si la chaîne est un nombre

J'ai besoin de convertir une chaîne, obtenue à partir d'Excel, en VBA en un entier. Pour ce faire, j'utilise CInt () qui fonctionne bien. Cependant, il est possible que la chaîne soit autre chose qu'un nombre. Dans ce cas, je dois définir le nombre entier sur 0. Actuellement, j'ai:

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

Le problème est que je ne peux pas prédire toutes les chaînes non numériques possibles qui pourraient se trouver dans cette cellule. Y a-t-il un moyen que je peux lui dire de convertir si c'est un entier et mis à 0 sinon?

57
Captastic

Utilisez IsNumeric. Il renvoie true s'il s'agit d'un nombre ou false sinon.

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 à long ou cast à int, soyez conscient de ce qui suit.

Ces fonctions sont l’une des fonctions de visualisation dans Excel VBA qui dépendent des paramètres régionaux du système. Ainsi, si vous utilisez une virgule dans votre double, comme dans certains pays d’Europe, vous rencontrerez une erreur aux États-Unis.

Par exemple, dans la version européenne Excel, la version 0,5 fonctionnera bien avec CDbl (), mais dans la version américaine, elle aboutira à la version 5. Je recommande donc l’utilisation de l’alternative suivante:

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

Bien sûr, vous pouvez aussi penser aux cas où les gens utilisent des virgules et des points, par exemple trois mille à 3 000,00. Si vous avez besoin de fonctionnalités pour ce type de cas, vous devez alors rechercher une autre solution.

6
PeterH

Essayez ceci: currentLoad = ConvertToLongInteger(oXLSheet2.Cells(4, 6).Value) avec cette fonction:

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

J'ai choisi Long (Integer) au lieu de simplement Integer car la taille min/max d'un Integer dans VBA est minable (min: -32768, max: +32767). Il est courant d'avoir un entier en dehors de cette plage dans les opérations de feuille de calcul.

Le code ci-dessus peut être modifié pour gérer la conversion de chaîne en entier, en devise (en utilisant CCur ()), en décimale (en utilisant CDec ()), en Double (en utilisant CDbl ()), etc. fonction de conversion elle-même (CLng). Changez le type de retour de la fonction et renommez toutes les occurrences de la variable de fonction pour que tout soit cohérent.

3
Isaac Comer-Wyrd

Pour le mettre sur une seule ligne:

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