XL 2016 Excel et les grands nombres

Bandoulier

XLDnaute Junior
Bonjour,

Certains d'entre-vous m'ont déjà aidé dans mon problème, mais les solutions n'étaient pas satisfaisantes. Je les en remercie tout de même car ils m'ont permis d'avancer.
Mes soucis sont qu'au delà de 15 chiffres Excel ne sait plus calculer (ou donne des résultats faux).
J'ai réussi à avoir un résultat sur un nombre à 15 chiffres multiplié par 2 grâce à une macro qui transforme le résultat en texte (je ne fais que des multiplications par 2).
Jusque là tout va bien, mais je voudrais maintenant inclure une manip qui peut sembler facile mais qui me bloque car je ne suis pas un expert en VBA.
Je voudrais :
- Me positionner sur la cellule à multiplier
- Lancer ma macro (donc j'aurais un résultat)
- Et qu'en cliquant sur la cellule de destination du résultat, ce résultat s'affiche dans la cellule en question

Ou si vous pensez qu'une autre solution serait plus rapide ... je suis preneur ! (sachant que la cellule de destination n'est jamais au même endroit par rapport à la cellule source)

Merci d'avance à tous ceux qui me permettront d'avancer
Cordialement
 

vgendron

XLDnaute Barbatruc
Hello
Comme il n'y a pas de fichier joint pas plus que de macro (ce qui serait utile pour voir comment elle travaille et ou..)
une idée:
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Value = "" Then Exit Sub
Application.EnableEvents = False
Set Destination = Application.InputBox("selectionnez la cellule destination", Type:=8)
Destination.Select
Call Macrofois2(Target) 'appelle ta macro qui doit calculer le double de la cellule en target
Application.EnableEvents = True
End Sub

Sub Macrofois2(Source As Range)
ActiveCell = Source * 2 'met le resultat sur la cellule active
End Sub
 

Bandoulier

XLDnaute Junior
Merci Vgendron pour ta réponse.
Mon fichier d'essai n'a rien ou presque ... juste un nombre de 15 chiffres dans une cellule.
Quant à ma macro la voici (ne te moque pas, je ne suis pas un expert) :

Sub Essai_pour_15_chiffres()
Orig = ActiveCell.Value 'Orig = cellule d'Origine
Orig1 = Left(Orig, 3) 'Orig1 = les 3 premiers chiffres de Orig
Orig2 = Mid(Orig, 4, 3) 'etc ...
Orig3 = Mid(Orig, 7, 3)
Orig4 = Mid(Orig, 10, 3)
Orig5 = Right(Orig, 3)

Dest5 = Val(Orig5) * 2 'Multiplication des 3 derniers chiffres de la cellule d'origine
Retenue = IIf(Dest5 > 999, 1, 0) 'Au cas où il y ait une retenue après la multiplication
Dest5 = Right(Dest5, 3) 'Les 3 derniers chiffres du résultat
'etc ...
Dest4 = Val(Orig4) * 2 + Retenue
Retenue = IIf(Dest4 > 999, 1, 0)
Dest4 = Right(Dest4, 3)

Dest3 = Val(Orig3) * 2 + Retenue
Retenue = IIf(Dest3 > 999, 1, 0)
Dest3 = Right(Dest3, 3)

Dest2 = Val(Orig2) * 2 + Retenue
Retenue = IIf(Dest2 > 999, 1, 0)
Dest2 = Right(Dest2, 3)

Dest1 = Val(Orig1) * 2 + Retenue
Dest1 = IIf(Dest1 > 999, "1 " & Dest1 - 1000, Dest1)

Resultat = "'" & Dest1 & " " & Dest2 & " " & Dest3 & " " & Dest4 & " " & Dest5
End Sub

Ta macro me semble intéressante. Comment l'insérer dans la mienne ?

Merci encore de t'être penché sur mon problème.
Cordialement
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Voyez si ces fonctions quand même un peu plus simples ne règlent pas le problème :
VB:
Function AddDc(ByVal V1, ByVal V2) As String
   AddDc = CStr(CDec(V1) + CDec(V2))
   End Function
Function MultDc(ByVal V1, ByVal V2) As String
   MultDc = CStr(CDec(V1) * CDec(V2))
   End Function
Elle permettent d'aller jusqu'à 29 chiffres décimaux.

Cela dit quand vous dites que vous ne faites que des multiplications par 2 et des ajouts de 1, ça me fait une impression très bizarre. Parce qu'en binaire, ça revient à tout décaler d'un bit vers la gauche puis à mettre le dernier bit à 1. Vous en faites quoi tout à la fin de ces nombres ?
 
Dernière édition:

Bandoulier

XLDnaute Junior
Voir PJ

Peut etre serait il préférable de demander la destination DANS ta macro
Un grand merci Vgendron ! C'est exactement ce que je voulais.
Juste un tout petit bémol, est-il possible que la macro ne se déclenche que lorsque je sélectionne une cellule numérique ?
En effet, dès que je vais corriger un nom la macro va se déclencher ...
Si c'est trop compliqué, laisse tomber, je désactiverai la macro pour faire mes corrections.
Merci encore et bravo !
Cordialement
 

vgendron

XLDnaute Barbatruc
est-il possible que la macro ne se déclenche que lorsque je sélectionne une cellule numérique
Hello
suffit de modifier comme ceci
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Value = "" Or Not IsNumeric(Target) Then Exit Sub
Application.EnableEvents = False
Set Destination = Application.InputBox("selectionnez la cellule destination", Type:=8)
Destination.Select
Call Essai_pour_15_chiffres(Target) 'appelle ta macro qui doit calculer le double de la cellule en target
Application.EnableEvents = True
End Sub
 

Bandoulier

XLDnaute Junior
Bonjour Bandoulier
Salut vgendron

Un essai

Bonjour PierreJean !
Je suis bluffé !
Ta macro marche du tonnerre de Dieu et m'ôte même le petit souci que j'avais avec celle de Vgendron.
Et quand je vois la simplicité de cette macro ... je suis vert ! Moi je me suis emm... avec une macro qui ne marchait que pour des nombres à 15 chiffres !!!
Je vais étudier ça de près ... ton code est simple mais me reste à comprendre ton astuce mathématique !
Juste une question : Puis-je mettre ton bouton dans un menu (ou ailleurs) afin que je puisse y avoir accès à tout moment ? (Mon tableau est gigantesque)
Bravo encore !
Cordialement
 

Bandoulier

XLDnaute Junior
Bonsoir.
Voyez si ces fonctions quand même un peu plus simples ne règlent pas le problème :
VB:
Function AddDc(ByVal V1, ByVal V2) As String
   AddDc = CStr(CDec(V1) + CDec(V2))
   End Function
Function MultDc(ByVal V1, ByVal V2) As String
   MultDc = CStr(CDec(V1) * CDec(V2))
   End Function
Elle permettent d'aller jusqu'à 29 chiffres décimaux.

Cela dit quand vous dites que vous ne faites que des multiplications par 2 et des ajouts de 1, ça me fait une impression très bizarre. Parce qu'en binaire, ça revient à tout décaler d'un bit vers la gauche puis à mettre le dernier bit à 1. Vous en faites quoi tout à la fin de ces nombres ?

Bonsoir Danreb,

Je fais un arbre généalogique.
En généalogie, plusieurs ancêtres portent le même nom. Nous sommes donc obligés de les différencier par des numéros, qu'on appelle SOSA.
Nous avons donc une méthode qui date du 16ème siècle et qui permet d'éviter les doublons.
Je vous joins un petit fichier qu'on m'avait donné quand j'ai commencé et qui vous éclairera.(j'ai fait "Téléverser un fichier", j'espère que c'est ça qu'il fallait faire. Avouer que "Envoyer un fichier" eut été plus compréhensible)
Pourriez-vous m'éclairer pour savoir comment utiliser ces fonctions ... Je les mets dans un module, puis dans Excel je me positionne sur la cellule qui doit recevoir le calcul et j'écris "=MultDc(" puis je clique sur la cellule à l'origine du calcul et")" puis Entrée. Est-ce ça ?
merci encore de vous être penché sur mon problème
 

Pièces jointes

  • SOSA.txt
    2.8 KB · Affichages: 31
  • SOSA.txt
    2.8 KB · Affichages: 22

Dranreb

XLDnaute Barbatruc
Pourriez-vous m'éclairer pour savoir comment utiliser ces fonctions ... Je les mets dans un module, puis dans Excel je me positionne sur la cellule qui doit recevoir le calcul et j'écris "=MultDc(" puis je clique sur la cellule à l'origine du calcul et")" puis Entrée. Est-ce ça ?
merci encore de vous être penché sur mon problème
Oui, c'est à peu près ça sauf qu'elles attendent chaque fois 2 opérandes à multiplier ou additionner.
Je me doutais bien un peu qu'il y avait un lien avec du calcul binaire. Mais du coup je trouve un peu idiot de calculer en décimal même si ça autorise des valeurs plus grandes. Je vous écrirais bien quelque chose qui permettrait de calculer en binaire sur des nombre illimités en taille si vous acceptiez qu'ils soient codés dans des textes en hexadécimal. Autre chose que je voulais vous dire: en binaire virgule flottante double précision la multiplication par 2 ne perd aucun bit. C'est seulement sa conversion en décimal qui ne restitue pas tous les chiffres, mais en interne la valeur reste juste. En revanche l'addition de 1 sur un nombre trop grand peut être impossible. Vous pourriez aussi faire des calculs en Currency, ça autorise aussi des valeurs plus grandes en précision puisqu'il n'y a pas d'exposant. Un Currency est codé comme un entier binaire sur 64 bits valant 10000 × sa valeur conventionnelle. Mais attention, Excel ne semble pas stocker les devises sous cette forme.
 

Bandoulier

XLDnaute Junior
Re

Normalement il doit apparaître à l'ouverture du fichier
C'est un bouton qui se trouve dans un userform avec showmodal à true
je poste à nouveau le ficher

Merci PierreJean ... mais le userform ne s'affiche pas à l'ouverture du fichier !
Est-ce que ça ne vient pas du fait qu'il n'y ait nulle part "UserForm1.Show" ?
Ou alors ça ne convient pas à ma version d'Excel (2016) !
 

Discussions similaires

Statistiques des forums

Discussions
312 034
Messages
2 084 808
Membres
102 676
dernier inscrit
LN6