IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

convertir groupe de chiffre en groupe de lettre


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    meteorologiste
    Inscrit en
    Juin 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : meteorologiste

    Informations forums :
    Inscription : Juin 2012
    Messages : 2
    Par défaut convertir groupe de chiffre en groupe de lettre
    Bonsoir,
    je recherche un programme qui permettrait de convertir un groupe de chiffre en groupe de lettre (et vice versa). Par exemple j'aimerais convertir plusieurs groupes de 7 chiffres (10 millions de possibilité) en autant de groupe de 5 lettres (plus de 11 millions de possibilités). Le nombre de groupe étant variable.
    Par exemple les groupes 0000000 0000001 0000002 correspondraient aux groupes AAAAA AAAAB AAAAC

    Pensez-vous que cela réalisable en VBA? Je ne vois pas comment aborder le problème, le défi me paraît impossible...
    Si c'est pas possible avez-vous connaissance d'un logiciel capable de réaliser cette opération?

    Je vous remercie par avance pour vos réponses

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    déjà avec 10 millions de possibilites, tu vas t'amuser sous Office (access serait un moindre mal)...
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, Un échantillon de 2 fonctions qui servent à convertir un n° de colonne en lettre et inversement, peut-être que cela pourra t'aider ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Option Explicit
     
    Function NumCol2Lettre(iNumCol As Long) As String
    Dim i As Long, sStr As String
        i = iNumCol
        sStr = ""
        Do While i > 0
            sStr = Chr$(((i - 1) Mod 26) + 65) & sStr
            i = (i - 1) \ 26
        Loop
        NumCol2Lettre = sStr
    End Function
     
    Function Lettre2NumCol(sChaine As String) As Long
    Dim i As Long, ValeurCh As Long, v As Long
    Const sChaineAlpha As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        For i = 1 To Len(sChaine)
            ValeurCh = InStr(1, sChaineAlpha, Mid$(UCase$(sChaine), i, 1))
            v = v * 26 + ValeurCh
        Next i
        Lettre2NumCol = v
    End Function

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Il suffit, dans un premier temps, de convertir le nombre initial (en base 10 composé de chiffres arabes) vers le même nombre en base 26 (en utilisant comme chiffre les lettres de l'alphabet) avec la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function Base10versBase26(Nombre As Long) As String
    Dim x As String
    Dim r As Byte
      x = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      r = Nombre Mod 26
      If Int(Nombre / 26) = 0 Then
        Base10versBase26 = Mid(x, r + 1, 1)
      Else
        Base10versBase26 = Base10versBase26(Int(Nombre / 26)) & Mid(x, r + 1, 1)
      End If
    End Function
    Et dans un second temps, d'ajouter devant, les zéros non significatifs (représentés par des A) avec la formule du type :
    =DROITE("AAAAA" & Base10versbase26(A1);5)

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour à tous,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Function rigolo(ch As String) As String
       Dim Q() As Byte
       Q = StrConv(ch, vbFromUnicode)
       For i = 0 To UBound(Q)
         Q(i) = Q(i) + 17
       Next
       rigolo = StrConv(Q, vbUnicode)
    End Function
    Preuve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     MsgBox rigolo("0000001")
      MsgBox rigolo("0000002")
      MsgBox rigolo("0003002")

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Tu prends le modulo 26 du nombre que tu réserves dans une variable. Tu le convertis en lettre avec, par exemple, un Chr(). Ca donne la lettre la plus à droite.

    Tu soustrais le modulo obtenu à ton nombre, tu divises par 26 et tu obtiens le nouveau nombre à traiter.

    Tu mets tout ça dans une boucle qui tourne tant que le nombre à traiter n'est pas arrivé à 0, en concaténant la lettre résultat de chaque tour au résultat du tour précédent.

  7. #7
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Fonction améliorée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Function Base10versBase26Alphabet(Nombre As Long, Optional Digits As Byte) As Variant
    Dim x As String
    Dim r As Byte
      If Digits > 0 And 26 ^ Digits <= Nombre Then Base10versBase26Alphabet = CVErr(xlErrNum): Exit Function
      x = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      r = Nombre Mod 26
      If Int(Nombre / 26) = 0 Then
        Base10versBase26Alphabet = Mid(x, r + 1, 1)
        If Digits > 0 Then
          Base10versBase26Alphabet = Right(String(Digits, "A") & Base10versBase26Alphabet, Digits)
        End If
      Else
        Base10versBase26Alphabet = Base10versBase26Alphabet(Int(Nombre / 26), Digits) & Mid(x, r + 1, 1)
        If Digits > 0 Then
          Base10versBase26Alphabet = Right(String(Digits, "A") & Base10versBase26Alphabet, Digits)
        End If
      End If
    End Function
    Utilisation :
    =Base10versBase26Alphabet(A1;5)

  8. #8
    Candidat au Club
    Homme Profil pro
    meteorologiste
    Inscrit en
    Juin 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : meteorologiste

    Informations forums :
    Inscription : Juin 2012
    Messages : 2
    Par défaut
    bonjour à tous!
    avant d'étudier de près toutes vos réponses, je tenais à vous remercier pour ces dernières!
    je vais regarder tout ça de très près, un gros merci!

Discussions similaires

  1. [Vxi] Convertir un mois en chiffre à un mois en lettres
    Par Burt67 dans le forum Webi
    Réponses: 3
    Dernier message: 04/06/2010, 08h34
  2. [AC-2003] Convertir un montant chiffre en montant lettre
    Par ouzzin dans le forum IHM
    Réponses: 4
    Dernier message: 05/06/2009, 23h05
  3. Réponses: 2
    Dernier message: 11/12/2008, 18h44
  4. Réponses: 1
    Dernier message: 04/06/2007, 07h51
  5. Réponses: 5
    Dernier message: 21/07/2006, 18h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo