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 :

Mise en forme numéros de téléphone


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Developpeur amateur
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Par défaut Mise en forme numéros de téléphone
    Bonjour à tous,

    J'ai creusé pas mal sur internet mais je ne trouve pas de solution qui me convienne pour ce que je souhaite faire.

    J'ai un tableau excel avec une liste de numéros de téléphone. Chaque cellule peut contenir un ou deux numéros :

    Exemple : 0676408490
    Autre exemple : 0688143742/0564475389

    Nom : Capture.JPG
Affichages : 741
Taille : 20,6 Ko

    Je voudrait que les numéros soit affichés comme ceci :

    05 12 45 89 56
    ou
    05 12 45 89 56 / 05 45 78 23 56

    Je n'ai pas envie d'utiliser les fonctions excel car je veux que les utilisateurs puissent entrer directement les numéros dans les cellules sans réfléchir.
    D'autant qu'il y a une longue liste existante qu'il faut traiter, et j'anticipe les prochains ajouts.

    Du coup, la solution qui me semble idéale est de passer par le format de cellule.
    Les numéros sont sous forme de texte, donc je n'ai pas réussi avec les mise en forme du type : 00" "00" "00" "00" "00 ou autres variantes.

    Merci pour votre aide.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Les formats Excel ne sont utilisables que pour les valeurs numériques. La mise en format TEXTE ne permet aucune fioriture.

    La seule solution serait pour moi de passer par du vba après modification de la valeur de la cellule (évènement Worksheet_Change).

    [EDIT]
    Une fonction perso dans un module standard (parmi d'autres écritures possibles), qui omet de vérifier que la saisie initiale correspond aux attentes
    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
    Function PhoneNumbersFormatted(Value As String) As String
      Dim Counter As Long
      Dim RetVal As String
     
      For Counter = 1 To 10 Step 2
        RetVal = RetVal & IIf(RetVal = "", "", " ") & Mid(Value, Counter, 2)
      Next Counter
      If Len(Value) > 10 Then
        For Counter = 12 To 21 Step 2
          RetVal = RetVal & IIf(RetVal = "", "", " ") & Mid(Value, Counter, 2)
        Next Counter
        RetVal = Left(RetVal, 14) & "/" & Right(RetVal, 14)
      End If
     
      PhoneNumbersFormatted = RetVal
    End Function
    Dans le module de la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Worksheet_Change(ByVal Target As Range)
      On Error GoTo EndHandler
     
      If Not Intersect(Target, Range("a1:a10")) Is Nothing Then
        Application.EnableEvents = False
        Target.Value = PhoneNumbersFormatted(Target.Value)
      End If
     
    EndHandler:
      Application.EnableEvents = True
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre averti
    Homme Profil pro
    Developpeur amateur
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Par défaut
    Merci pour cette réponse.

    J'ai pondu ceci vite fait avant de voir ton code. C'est pas optimisé mais ça fonctionne :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim str As String
        If Selection.Count = 1 Then
            If (Target.Column = 4 And Len(Target.Value) <> 0) Then
                If Len(Target.Value) = 10 Then
                    str = Target.Value
                    For i = 2 To 8
                        y = 10 - i
                        If 1 - (y Mod 2) = 1 Then
                            str = Left(str, y) & " " & Mid(str, y + 1)
                        End If
                    Next i
                    Target.Value = str
                ElseIf Len(Target.Value) = 21 Then
                    str = Target.Value
                    For i = 0 To 10
                        y = 20 - i
                        If 1 - (y Mod 2) = 0 Then
                            str = Left(str, y) & " " & Mid(str, y + 1)
                        End If
                    Next i
                    Target.Value = str
     
                    str = Target.Value
                    For i = 0 To 9
                        y = 10 - i
                        If 1 - (y Mod 2) = 1 Then
                            str = Left(str, y) & " " & Mid(str, y + 1)
                        End If
                    Next i
                    Target.Value = str
                End If
            End If
        End If
    End Sub

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bien. Il y a plusieurs chemins pour aller à Rome...

    Cependant, je préfère ne pas mettre le traitement dans l'évènement, mais le déporter dans une fonction spécifique "qui ne fait que ça" comme je l'ai développé dans mon architecture. Si tu as d'autres traitements à réaliser sur modification dans la feuille pour d'autres plages, ton code évènementiel va vite devenir un foutoir. De plus, avec ton architecture "tout dans l'évènement", tu ne peux tester ton code que sur modif d'une cellule. En séparant les traitements, tu travailleras plus simplement sur la maintenance et l'évolution de ton code.

    Sortir le traitement de l'évènement te permet aussi d'utiliser la fonction pour les données déjà encodées et que tu souhaiterais traiter de façon identique. Tu pourrais alors effectuer le traitement au sein d'une boucle qui traiterait chaque cellule d'une plage... En incluant le code de traitement directement dans l'évènement, tu vas rendre cette manip plus compliquée et lourde, voire impossible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub UpdateCells()
      Dim rng As Range
     
      For Each rng In Range("a1:a10")
        rng.Value = PhoneNumbersFormatted(rng.Value)
      Next rng
    End Sub

    Attention aussi que ton code s'applique à toutes les cellules de ta feuille. Tu aurais intérêt à circonscrire le traitement à la plage dans laquelle les utilisateurs vont saisir des numéros de téléphone. Regarde comment j'ai isolé la plage grâce au test If Intersect...

    Enfin, pense à désactiver tes évènements, car tu risques de boucler longtemps...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSL]Mise en forme numéro de Téléphone
    Par wave95 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 23/12/2009, 14h59
  2. Mise en forme de Numéro
    Par clonjon dans le forum iReport
    Réponses: 1
    Dernier message: 24/03/2009, 18h22
  3. Mettre en forme un numéro de téléphone
    Par moilou2 dans le forum VBA Access
    Réponses: 6
    Dernier message: 10/10/2008, 16h02
  4. [PAO]mise en forme des numéros de bas de page
    Par mehdi1968 dans le forum Word
    Réponses: 5
    Dernier message: 11/05/2008, 02h42
  5. Mise en forme "Numéro de téléphone"
    Par Manou34 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 24/01/2008, 15h51

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