Je m'amusais à savoir combien pouvait-il y avoir de chiffres entre 2 chiffres.
Je m'explique :
Par exemple, entre 1 et 2 :
- avec des ENTIERS il n'y a que 2 chiffres
- avec des DÉCIMAUX, mais avec 1 seul chiffre après la virgule, il y a 11 chiffres
- avec des DÉCIMAUX, mais avec 2 chiffres après la virgule, il y a 101 chiffres
- avec des DÉCIMAUX, mais avec 3 chiffres après la virgule, il y a 1.001 chiffres
- avec des DÉCIMAUX, mais avec 4 chiffres après la virgule, il y a 10.001 chiffres
- avec des DÉCIMAUX, mais avec 5 chiffres après la virgule, il y a 100.001 chiffres
En étudiant cette progression, j'ai bidouillé la fonction suivante :
VB:
Function NbChiffres(LimInf As Long, LimSup As Long, dec As Byte) As Double
Dim i As Byte, x As Double
If dec = 0 Then
x = 0
Else
For i = 0 To dec
x = x + 10 ^ (i - 1)
Next
End If
NbChiffres = (LimSup - LimInf) * (1 + 9 * x) + 1
End Function
Contre toute attente, j'obtiens le nombre de chiffres + 1.
Je modifie la fonction :
VB:
Function NbChiffres2(LimInf As Long, LimSup As Long, dec As Byte) As Long
'Magic_Doctor
Dim i As Byte, x As Long
If dec = 0 Then
x = 0
Else
For i = 0 To dec
x = x + 10 ^ (i - 1)
Next
End If
NbChiffres2 = (LimSup - LimInf) * (1 + 9 * x) + 1
End Function
Et là ça me donne le bon nombre de chiffres, mais au-delà d'un certain nombre (2 milliards... il faut dire qu'on monte vite en chiffres !) ça ne marche plus.
Pourquoi cette discordance entre "Long" et "Double" ? Mais, surtout, pourquoi avec "Double" on se plante dès le départ ?
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"
Bonjour Magic_Doctor, le forum,
Il ne faut pas déclarer la fonction As Long mais la déclarer As Double ou ne pas la déclarer.
dec étant le nombre de décimales le nombre de chiffres entre 1 et 2 est bien sûr 10^dec + 1
Donc tu peux écrire ta fonction :
Code:
Function NbChiffres1(LimInf As Long, LimSup As Long, dec As Byte) As Double
NbChiffres1 = (LimSup - LimInf) * 10 ^ dec + 1
End Function
Maintenant si tu tiens à faire une boucle :
Code:
Function NbChiffres2(LimInf As Long, LimSup As Long, dec As Byte) As Double
Dim i As Byte, x As Double
For i = 1 To dec
x = x + 10 ^ (i - 1)
Next
NbChiffres2 = (LimSup - LimInf) * (1 + 9 * x) + 1
End Function
Dans les 2 cas le dernier 1 ne s'affiche pas au-delà de dec = 14 puisqu'Excel ne peut afficher que 15 chiffres significatifs.
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"
Bonjour,
Merci job pour tes solutions.
Je ne tenais absolument pas à une boucle ; j'avais tenté de résoudre ce problème par ce moyen, mais le plus simple me paraît le mieux.
Je retiens donc :
NbChiffres1 = (LimSup - LimInf) * 10 ^ dec + 1
Quant aux décimales, dans mon quotidien, au-delà de 3 à 4, ça n'existe plus.
Ta fonction répond donc à tous les besoins non schizophréniques.
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"
Bonjour,
Maintenant, je voudrais répertorier tous les chiffres entre 2 chiffres, en précisant qu’entre le 1er chiffre et le second il n’y a toujours qu’une unité (1 et 2, 305 et 306, 2.001 et 2.002…). Pour ce faire, j’ai "bidouillé " une boucle :
VB:
Sub DécompteIntervalle()
Dim i As Double, x As Double, y, LimInf As Long, LimSup As Long, dec As Byte
LimInf = 1
LimSup = 2
dec = 2 'marche bien pour dec = 1 et dec = 2, après ça cafouille
x = LimInf - 10 ^ -dec
y = NbChiffres(LimInf, LimSup, dec)
For i = 1 To y
x = x + 10 ^ -dec
Debug.Print x 'pour voir ce que ça donne
Next
End Sub
Pour compter le nombre de chiffres, j’ai pris la fonction :
VB:
Function NbChiffres(LimInf As Long, LimSup As Long, dec As Byte) As Double
'Compte le nombre de chiffres entre 2 chiffres
'- LimInf : 1er chiffre
'- LimSup : 2ème chiffre
'- dec : nombre de décimales après la virgule
'job75
NbChiffres = (LimSup - LimInf) * 10 ^ dec + 1
End Function
Bien évidemment, on se limitera à 4, voir 5 décimales. Faut rester calme !
Merci d'avance pour m'expliquer pourquoi ça ne marche plus à partir de 3 décimales.
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"
Bonsoir,
Je reviens sur ce fil afin de mieux comprendre comment Excel gère les grands nombres.
Je reprends la fonction :
VB:
Function NbChiffres(LimInf As Double, LimSup As Double, dec As Byte) As Double
'Compte le nombre de chiffres entre 2 chiffres
'- LimInf : 1er chiffre
'- LimSup : 2ème chiffre
'- dec : nombre de décimales après la virgule
'job75
NbChiffres = (LimSup - LimInf) * 10 ^ dec + 1
End Function
Travaillons dans l'intervalle [1 , 10] et jonglons uniquement avec le nombre de décimales après la virgule ("dec").
Jusqu'à dec = 14 le compte est bon, mais au-delà il manque toujours une unité.
Pourquoi ? Et est-ce corrigible ?
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"
Bonsoir job, le forum,
Maintenant j'ai bien compris qu'au-delà d'un certain nombre de chiffres on travaille avec du texte.
J'ai bien regardé la PJ adressée à MADA et tâché d'obtenir ce que je voulais en utilisant les fonctions du classeur.
J'ai rédigé une petite macro événementielle pour obtenir le résultat escompté. 2 plombes que j'essaie sans succès.
Un grand merci pour qui me tirera d'affaire.
bonne fin de soirée.
PS : pas vraiment saisi la différence entre les 2 fonctions "additives" : "Additionner" & "AddEnt"
Pièces jointes
Addition et multiplication des entiers relatifs de grande longueur.xlsm
30.7 KB · Affichages: 23
Addition et multiplication des entiers relatifs de grande longueur.xlsm
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"
Bonsoir Magic_Doctor,
2 plombes ? Pourtant mes fonctions sont faciles à appliquer :
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Calcul de (LimSup - LimInf) * 10 ^ dec + 1
Dim LimInf$, LimSup$, dec As Byte, x$, y$, z$
LimInf = [B25]: LimSup = [B26]: dec = [B27]
x = Additionner(LimSup, "-" & LimInf)
y = 1
For dec = 1 To dec
y = Multiplier(y, 10)
Next
z = Multiplier(x, y)
z = Additionner(z, 1)
[B29] = z
End Sub
Fichier joint.
Bonne nuit.
Pièces jointes
Addition et multiplication des entiers relatifs de grande longueur(1).xlsm
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"
Re,
Fonction VBA :
Code:
Function NbChiffres$(LimInf$, LimSup$, dec As Byte)
'Calcul de(LimSup - LimInf) * 10 ^ dec + 1
Dim x$, y$, z$
x = Additionner(LimSup, "-" & LimInf)
y = 1
For dec = 1 To dec
y = Multiplier(y, 10)
Next
z = Multiplier(x, y)
NbChiffres = Additionner(z, 1)
End Function
Fichier (2).
Rebonne nuit.
Pièces jointes
Addition et multiplication des entiers relatifs de grande longueur(2).xlsm
Re : Nombre de chiffres entre 2 chiffres. Ou le dilemme "Long" - "Double"
Bonsoir job, le forum,
Quelle aventure ! Je dois reconnaître que ce problème est une leçon d'humilité : question quasi triviale, réponse quasi "hallucinante".
Demander à une bécane de réaliser cette simple opération : 1.000.000.000.000.000 + 1
Ô combien de prétentieux marioles répondront péremptoirement : "Mais... c'est évident !"
Tiens, mon œil !
Enfin j'obtiens le résultat qui ne sert strictement à rien dans la routine quotidienne, mais qui satisfait l'esprit un peu tatillon. Après tout, quand on fait les choses, autant bien les faire ! (cf. mon projet de listes de nombres aléatoires)
La combinaison de "NbTotalDeChiffres" & "SepareMilliers" marche très bien, sauf, curieusement, pour certaines "coordonnées".
Dans la PJ j'ai mis ces fonctions sous la forme la plus minimaliste qui soit.
Peut-être me suis-je (encore) planté quelque part... Mais si on prend comme intervalle [5 , 10] et que l'on "jongle" avec le nombre de décimales après la virgule, pourquoi ces discordances ?