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.

Rechercher des sujets similaires à "transformer string nombre"