Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Abreger Nombre !

  • Initiateur de la discussion Initiateur de la discussion satas
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

S

satas

Guest
bonjour et un grand merci pour ce forum sympa ou j'ai trouvé pleins de solutions et astuces super bien ,mon probleme et le suivant je cherche a abreger un nombre de 6 chiffres en 3 par exemple : 123456 = 372 en additionant les 2 premiers et 2 du milieu et les 2 derniers j'ai enormement de cellules ! et c'est tres important merci d'avance !
 
Re : Abreger Nombre !

Bonjour, satas.

D'après le seul exemple que vous donnez, essayez, avec votre nombre en A1 :
Supprimez éventuellement les espaces générés par l'édition.

Edit : Bonjour, Robert : J'adore tes codes toujours super documentés 🙂
 
Dernière édition:
Re : Abreger Nombre !

Bonjour Satas et bienvenu, Patrick, bonjour le forum,

Comme tu es nouveau parmi nous, je te recommande vivement de lire la Lien supprimé du forum qui donne tous les bons plans pour obtenir de l'aide rapidement. Dans ton cas c'est un petit fichier exemple qui manque cruellement.
Si j'ai bien compris ton problème (car avec un seul exemple c'est pas facile), je te propose uns solution VBA en pièce jointe, à adapter à ton cas, avec le code commenté ci-dessous :

Code:
Sub Macro1()
Dim O As Object 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim C As Integer 'déclare la variable C (Centaines)
Dim D As Byte 'déclare la variable D (Dizaines)
Dim U As Byte 'déclare la variable U (Unités)

Set O = Sheets("Feuil1") 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée de la colonne 1 (=A) de l'onglet O
Set PL = Range("A1:A" & DL) 'définit la plage PL
For Each CEL In PL 'boucle sur toutes les cellules CEl de la plage PL
    If CEL <> "" Then 'condition : si la cellule n'est pas vide
        C = CInt(Mid(CEL.Value, 1, 1)) + CInt(Mid(CEL.Value, 2, 1)) 'définit la variable C
        If C > 9 Then C = CInt(Mid(C, 1, 1)) + CInt(Mid(C, 2, 1)) 'si C est supérieure à 9, redéfinit la variable C
        D = CByte(Mid(CEL.Value, 3, 1)) + CByte(Mid(CEL.Value, 4, 1)) 'définit la variable D
        If D > 9 Then D = CInt(Mid(D, 1, 1)) + CInt(Mid(D, 2, 1)) 'si D est supérieure à 9, redéfinit la variable D
        U = CByte(Mid(CEL.Value, 5, 1)) + CByte(Mid(CEL.Value, 6, 1)) 'définit la variable U
        If U > 9 Then U = CInt(Mid(U, 1, 1)) + CInt(Mid(U, 2, 1)) 'si U est supérieure à 9, redéfinit la variable U
        CEL.Offset(0, 1).Value = 100 * C + 10 * D + U 'place dans la cellule adjacente à CEL la valeur obtenue
    End If 'fin de la condition
Next CEL 'prochaine cellule de la boucle
End Sub
Le fichier :
 

Pièces jointes

Re : Abreger Nombre !

Bonsour® Satas,Victor21, Robert...
dans le cas d'utilisation de la numération décimale, il ne peut exister de bijection entre la liste originale et la liste codée ! ?
un même codage pointe alors obligatoirement sur plusieurs valeurs distinctes ???

veuillez tester vos propositions sur cette liste de chiffres :
541348
903148
272248
184048
810475
720493
630466
540448
900448
270448
180448
810448
720448
630448
450448

Par ailleurs je ne suis pas certain que l'utilisation d'une base inférieure à 32(10 chiffres +22 caractères) soit suffisante (tests en cours 🙄 )
 
Re : Abreger Nombre !

Bonsour®
mes doutes étaient fondés ...
même avec une base 36 (10 chiffres + 26 lettres) on ne peut descendre en dessous de 4 caractères

HEX2BIN Function fails after 2 characters.
(7ème réponse)

VB:
Public Function DecToBase(dTarget As Double, Optional ByVal iBaseOut As Integer) As String
 Const sBASE As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 Dim sOut As String
 Dim dRemainder As Double
 '--------------
 If (iBaseOut < 2) Or (iBaseOut > 36) Then DecToBase = "Base " & iBaseOut & " !! out of range(2-36)": GoTo exit_f
 '--------------
 sOut = ""
 dTarget = Abs(dTarget)
 '--------------
 Do
    dRemainder = dTarget - (iBaseOut * Int((dTarget / iBaseOut)))
    sOut = Mid$(sBASE, dRemainder + 1, 1) & sOut
    dTarget = Int(dTarget / iBaseOut)
 Loop While (dTarget > 0)
 DecToBase = sOut
 '--------------
exit_f:
 End Function
 '***************************************************************************
 Function BaseToDec(sTarget As String, Optional ByVal iBaseIn As Integer) As String
 Const sBASE As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 Dim dDec As Double
 Dim n As Integer
 If (iBaseIn < 2) Or (iBaseIn > 36) Then BaseToDec = "Base " & iBaseIn & " !! out of range(2-36)": GoTo exit_f
 sTarget = UCase(sTarget)
 '-------------
 n = 0
 '-------------
 Do
 If InStr(sBASE, Mid(sTarget, (Len(sTarget) - n), 1)) > iBaseIn Then BaseToDec = Error(13): Exit Function
    dDec = ((InStr(1, Left(sBASE, iBaseIn), Mid(sTarget, (Len(sTarget) - n), 1)) - 1) * (iBaseIn ^ n)) + dDec
    n = n + 1
 Loop Until n = Len(sTarget)
 BaseToDec = CStr(dDec)
 '-------------
exit_f:
 End Function
 

Pièces jointes

Re : Abreger Nombre !

Bonjour satas, Victor21, Robert, Modeste geedee

En dehors du fait que satas ne semble guère intérressé et que la codification n'est pas décodable, je me suis lancé dans la récursivité.
Dans le fichier il y a en fin de liste les exemples de Modeste, qui, effectivement, renvoient tous 7.
VB:
Private X As Integer

Sub test()
Dim Rng As Range, T As Variant,i&

With Sheets("Feuil1")
Set Rng = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(3))
End With

T = Rng

For i = LBound(T, 1) To UBound(T, 1)
T(i, 1) = Concat(T(i, 1))
Next i

Rng.Offset(, 1) = T
End Sub

Private Function Concat(ByVal Nb As String) As Integer
Dim i&, Tot&

For i = 1 To Len(CStr(Nb))
Tot = Tot + CInt(Mid(Nb, i, 1))
Next i

If Tot > 9 Then
Concat (Tot)
Else
X = Tot
End If

Concat = X
End Function
J'ai été obligé de déclarer X au niveau du module.
Si certains voient des améliorations, je suis toutes ouies 🙂

Cordialement
 

Pièces jointes

Dernière édition:
Re : Abreger Nombre !

Bonjour le fil, bonjour le forum,

Haaaa Satas, Satas ! Oui Satas.
Enfin moi ça me tasse vraiment les c... de répondre à des TdC qui ne prennent même pas la peine de lire...

Hé hop... un peu de travail pour Dascal et Pavid qui s'éclatent peut-être en vacances et à qui je viens donner du travail. Ingrat que je suis... (oui je sais, j'aurais aussi pu écrire un gras que je suis...)

@Patrick : Arrête ! T'es malade non. Après je me prends pour ce que je ne suis pas... (ça veut aussi dire "Merci")
 
Dernière édition:
Re : Abreger Nombre !

Bonjour Efgé 🙂, le forum,

[...] je me suis lancé dans la récursivité. [...] J'ai été obligé de déclarer X au niveau du module.
Si certains voient des améliorations, je suis toutes ouies [...]
Un essai sans X:
VB:
Private Function Concat(ByVal Nb As String) As Integer
Dim i&, Tot&
  For i = 1 To Len(Nb): Tot = Tot + Mid(Nb, i, 1): Next i
  If Tot > 9 Then Concat = Concat(Tot) Else Concat = Tot
End Function
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
11
Affichages
692
Réponses
6
Affichages
809
Réponses
3
Affichages
623
D
Réponses
4
Affichages
1 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…