Transformer une string en nombre
Bonjour a tous, j'ai une erreur lorsque hour vaut plus que 9, faut-il que je change ma syntaxe?
hour est défini comme une string
Apres vérification, c'est plutot un dépassement pour totalSeconds (plus grand que 32 000). Pourtant j'ai déclaré totalSeconds as long
totalSeconds = totalSeconds + 3600 * CInt(hour)
Bonjour,
Hour() est une fonction de VBA, Hour(Time) qui attend un argument !
Extrait de l'aide :
Renvoie une valeur de type Variant (Integer) indiquant un nombre entier compris entre 0 et 23 inclus, qui représente l'heure du jour.
Donc, si hour pour toi est une variable, modifie son nom afin qu'il n,y ait pas d'ambiguïté !
OK je vais utiliser un autre nom que hour pour qu'il n'y est pas de confusion. Par contre j'ai réalisé que le probleme est un débordement.
La derniere ligne donne une erreur de débordement lorsque Cint(hour)=10 ou plus. Pourtant totalSeconds est déclaré as long.
Dim strArray() As String
Dim sec As String: sec = "0"
Dim min As String: min = "0"
Dim hour As String: hour = "0"
Dim totalSeconds As Long: totalSeconds = 0
strArray = Split(Range("J" & ActiveCell.Row).Value, ":")
If UBound(strArray) = 1 Then
min = strArray(0)
sec = strArray(1)
Else
hour = strArray(0)
min = strArray(1)
sec = strArray(2)
End If
totalSeconds = totalSeconds + 3600 * CInt(hour)
Bonjour,
Converti en Long :
Sub Test()
Dim strArray() As String
Dim sec As String
Dim min As String
Dim Heure As String
Dim totalSeconds As Long
strArray = Split(Range("J" & ActiveCell.Row).Text, ":")
If UBound(strArray) = 1 Then
min = strArray(0)
sec = strArray(1)
Else
Heure = strArray(0)
min = strArray(1)
sec = strArray(2)
End If
totalSeconds = totalSeconds + 3600 * CLng(Heure)
MsgBox totalSeconds
End Sub
bonjour,
Edit : je viens de voir que tu as déjà reçu une explication semblable sur un autre fil.
lors de l'évaluation d'une formule, vba va faire les calculs en respectant l'ordre de priorité B-O-DM-AS (1)parenthèse, 2)puissance, 3)division et multiplication, 4)addition et soustraction). quand on se retrouve à devoir évaluer 2 opérations ayant même priorité, on fait l'évaluation de la gauche vers la droite.
en outre, lorsqu'il y a une constante dans une formule, VBA va la stocker dans une variable interne et lui donner un type en fonction de sa valeur. dans la formule :
totalSeconds = totalSeconds + 3600 * CInt(hour)
3600 aura un type integer.
donc on a une opération
long=long+integer*integer
suivant la règle BODMAS, vba évalue d'abord 3600*CINT(hour). Comme les 2 variables sont de type integer, l'opération se fait en mode integer, et est limitée à des valeurs de réponse allant de -32768 à 32767. (sinon erreur de dépassement de capacité)
si dans l'opération on a des variables de type différent, VBA fera la conversion de la variable vers le type de la variable dans la partie de la formule à évaluer, pouvant contenir la plus grande valeur. (INT-LONG-SINGLE-DOUBLE)
En remplaçant Cint par Clng dans la formule, on a une opération de type
long=long+int*long
la variable integer sera convertie en long.
on peut forcer le type d'une constante
3600 en long on ajoute &,
totalSeconds = totalSeconds + 3600& * CInt(hour)
3600 en single on ajoute !
totalSeconds = totalSeconds + 3600! * CInt(hour)
3600 en double on ajoute #
totalSeconds = totalSeconds + 3600# * CInt(hour)
le type des variables ne change pas, la conversion de type se fait en interne durant le calcul.