Pb : dép de capacité

julie21000 Messages postés 3 Date d'inscription vendredi 6 novembre 2009 Statut Membre Dernière intervention 6 novembre 2009 - 6 nov. 2009 à 17:26
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 9 nov. 2009 à 01:28
A l'appel de la fonction

=ChgBase(1000000000000000)

j'ai un pb de dépassement de capacité alors que j'utilise des types de données de plus 2 octets.
Y a t'il une sol ?

Public Function ChgBase(n As String, b As Long) As Long
Dim i, j, r, nb, nbchiffres As Long
i = Len(n)
nbchiffres = i
j = 0
nb = 0
r = 0
While (j <> nbchiffres)
r = Mid(n, i, 1)
nb = nb + (r * (b ^ j))
i = i - 1
j = j + 1
Wend
ChgBase = nb
End Function

4 réponses

julie21000 Messages postés 3 Date d'inscription vendredi 6 novembre 2009 Statut Membre Dernière intervention 6 novembre 2009
6 nov. 2009 à 17:27
désolé l'appel de la fonction est :
=ChgBase(1000000000000000;2)
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
6 nov. 2009 à 18:08
Dim i, j, r, nb, nbchiffres As Long

Félicitations, tu as déclaré un Long et 4 Variant...


tu pourrais faire :

Private Sub Form_Load()
    Debug.Print ChgBase("1000000000000000")
End Sub

Public Function ChgBase(n As String) As Long
Dim r As Long
Dim j As Long
    r = 1
    For j = Len(n) To 1 Step -1
        If Mid$(n, j, 1) = "1" Then
            ChgBase = ChgBase + r
        End If
        r = r * 2
    Next
End Function




Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
julie21000 Messages postés 3 Date d'inscription vendredi 6 novembre 2009 Statut Membre Dernière intervention 6 novembre 2009
6 nov. 2009 à 19:48
Ok, je suis d'accord c'est plus court et ça utilise moins de mémoire mais j'ai toujours le même pb. Je m'explique
Dans une cellule d'Excel (B2) je mets le nombre 1000000000000000 et puis dans une autre cellule du tableur je mets =ChgBase(B2)
le paramètre d'appel étant une référence à une cellule, j'obtiens 18 car l'ordi va convertir le nombre en 1E+15 lors de l'appel de la fonction. Je précise tout de même que j'ai bien mis le format de cellule de B2 en nombre (avec 0 décimale) et j'ai bien sous Excel en B2 la valeur 1000000000000000.
Lorsque je débug avec un point d'arrêt à l'appel de la fonction il me converti tout ça en 1E+15 (vérif effectuée avec un point d'arrêt). Aurais-tu une solution ?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 nov. 2009 à 01:28
Ah tiens, ce n'est pas du .Net ?
Catégorie modifiée

Comme te l'a suggéré RenField, intéresse-toi aux types des variables (on n'a pas à être pressé en programmation, il faut être précis).
Pour accueillir un chiffre entier aussi gros que 1.000.000.000.000.000, il faut un Large_Integer, variable qui n'existe pas en natif sous VBA.
Alors tu pourrais te rabattre sur les Single qui savent stocker de gros chiffres, mais tu perdrais de la précision (arrondis après la Xième décimale de 10)

Comment convertis-tu ce gros chiffre ne ... 18 : j'ai pas bien compris.

Ta fonction ChgBase est définie pour accepter une Chaine en premier paramètre, pas un chiffre.
Normal donc que VB tente de le convertir.
=ChgBase("
1000000000000000"
;2)
en supposant que le résultat tienne dans un Long ...

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Rejoignez-nous