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?
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
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.
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.
Pour le mettre sur une seule ligne:
currentLoad = IIf(IsNumeric(oXLSheet2.Cells(4, 6).Value), CInt(oXLSheet2.Cells(4, 6).Value), 0)