Tri adresses mail combobox

Résolu
Bonjour,

J'ai une combobox dans un fichier Excel reprenant une liste d'adresses mail au format :

pierre.dupont@entreprise.fr

Comment puis-je classer la liste de la combo par ordre alphabétique de NOM.

Merci beaucoup

Configuration: Windows / Chrome 89.0.4389.82

14 réponses

Résumé de la discussion

Une question porte sur le tri en ordre alphabétique par NOM d'une combobox Excel qui liste des adresses mail au format prenom.nom@domaine.fr. Plusieurs échanges évoquent l'usage de macros, de TextToColumns et de tri sur des colonnes intermédiaires, avec une proposition de macro qui sépare le nom sur le point et le trie. L'approche clé décompose l'adresse en nom via TextToColumns puis trie les résultats par NOM dans l'ordre croissant, avec des paramètres de tri adaptés et une mise en place locale des colonnes intermédiaires.

Bobot (l’IA à votre service)
  1. Contributeur
    bonjour,
    cette combobox est-elle construite sur le contenu de cellules?
    si oui, il suffit de trier les cellules.
    1. Bonjour,

      J'y ai pensé mais il faudrait trier les cellules sur la partie du nom seulement. je sais que ça peut se faire mais la saisie des adresses mails va se faire par des utilisateurs sur une plage.
      1. Contributeur
        il suffit alors d'ajouter une formule dans une autre plage, afin d'y obtenir ce que tu appelles la partie du nom, et de faire un tri.
        quand la formule est en place, tu peux utiliser l'enregistreur de macro pour découvrir comment faire un tri en VBA.
    2. Bonjour,

      Après essai, ce n'est pas satisfaisant. Malgré une une macro fait par l'enregistreur, un message apparait : "Voulez-vous remplacer le contenu des cellules existantes". Si on clique sur OK, c'est bon.
      Si on clique dur Annuler ça bug.

      Je préfèrerais une macro à la source sur la combobox, plus fluide pour l'utilisateur.
      1. Contributeur
        peux-tu partager ton fichier, ou, au minimum, le code de la macro?
        la macro ne trie pas la plage source de la combobox?
      2. Contributeur
        @yg_beas-tu répondu à la seconde question?
      3. @yg_beSi mais elle déclenche la question gérée par Excel : "Voulez-vous remplacer les cellules existantes"
        Si on clique sur OK, c'est bon
        Si on clique sur Annuler, ça bug.
        Pas top pour l'utilisateur.
    3. Voilà :

      Sub Macro6()
      '
      ' Macro6 Macro
      '

      '
      Sheets("JoursFériés et mails").Select
      Range("I9:I22").Select
      Selection.TextToColumns Destination:=Range("K9"), DataType:=xlDelimited, _
      TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
      Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
      :=".", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _
      TrailingMinusNumbers:=True
      Range("K8:L21").Select
      ActiveWorkbook.Worksheets("JoursFériés et mails").Sort.SortFields.Clear
      ActiveWorkbook.Worksheets("JoursFériés et mails").Sort.SortFields.Add Key:= _
      Range("L9:L21"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
      xlSortNormal
      With ActiveWorkbook.Worksheets("JoursFériés et mails").Sort
      .SetRange Range("K8:L21")
      .Header = xlYes
      .MatchCase = False
      .Orientation = xlTopToBottom
      .SortMethod = xlPinYin
      .Apply
      End With
      Sheets("Mail actualisation").Select
      End Sub
      1. REctificatif :

        Sub Macro10()
        '
        ' Macro10 Macro
        '

        '
        Sheets("JoursFériés et mails").Select
        Range("I9:I22").Select
        Selection.TextToColumns Destination:=Range("K9"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
        :=".", FieldInfo:=Array(Array(1, 2), Array(2, 1), Array(3, 1)), _
        TrailingMinusNumbers:=True
        Range("K8:M22").Select
        ActiveWorkbook.Worksheets("JoursFériés et mails").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("JoursFériés et mails").Sort.SortFields.Add Key:= _
        Range("L9:L22"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
        With ActiveWorkbook.Worksheets("JoursFériés et mails").Sort
        .SetRange Range("K8:M22")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        End With
        Range("L24").Select
        Sheets("Mail actualisation").Select
        End Sub
        1. @yg_be
          Sub Macro10()
          '
          ' Macro10 Macro
          '
          
          '
          Sheets("JoursFériés et mails").Select
          Range("I9:I22").Select
          Selection.TextToColumns Destination:=Range("K9"), DataType:=xlDelimited, _
          TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
          Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
          :=".", FieldInfo:=Array(Array(1, 2), Array(2, 1), Array(3, 1)), _
          TrailingMinusNumbers:=True
          Range("K8:M22").Select
          ActiveWorkbook.Worksheets("JoursFériés et mails").Sort.SortFields.Clear
          ActiveWorkbook.Worksheets("JoursFériés et mails").Sort.SortFields.Add Key:= _
          Range("L9:L22"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
          xlSortNormal
          With ActiveWorkbook.Worksheets("JoursFériés et mails").Sort
          .SetRange Range("K8:M22")
          .Header = xlYes
          .MatchCase = False
          .Orientation = xlTopToBottom
          .SortMethod = xlPinYin
          .Apply
          End With
          Range("L24").Select
          Sheets("Mail actualisation").Select
          End Sub
           
        2. Contributeur
          @romanzapour du VBA, il faut préciser "basic" comme langage.
        3. Contributeur
          @romanzasi je devine bien ce que fait ton code, tu as choisi d'utiliser "text to columns" plutôt qu'une formule afin d'isoler le nom.

          as-tu investigué et déterminé quelle est la ligne de code qui déclenche la question "gérée" par Excel?

          je pense qu'il suffit de vider la plage de destination avant de faire TextToColumns:
          Sheets("JoursFériés et mails").Range("K8:M22").Clear
      2. Ok j'ai intégré le code supplémentaire à l'endroit précisé et cela fonctionne (pour info, je ne maîtrise pas du tout les macros). Merci.

        Y-a t'il un moyen, quand on défiltre dans l'onglet "rétroplanning", de ne plus avoir l message :

        "Voulez-vous remplacer le contenu des cellules de destination dans Mail actualisation?"
        et donc d'être obligé de faire "OK" à chaque fois?
        1. Contributeur
          ta nouvelle question a-t-elle un rapport avec la macro?
        2. @yg_beNon, sur le premier sujet c'est réglé....
        3. Contributeur
          @romanzaj'ai commencé à regarder pour ta nouvelle question.
          j'ai arrêté, le fichier est trop désordonné, avec du code dans tous les sens.
      3. Bonjour,

        Hormis la complexité du fichier, on pourrait prendre la question à part, non?

        Quand on filtre un TCD, peut-on empêcher, par macro, le message : "Voulez-vous remplacer le contenu des cellules existantes"?
        1. Contributeur
          Me message est produit parce que l'extension du TCD va effacer des données hors du TCD existant.
          Je pense que le plus simple est d'effacer ces données avant d'étendre le TCD.
      4. Non parce qu'il y a juste la macro qui permet de ne pas écraser ces données même si on clique OK (onglet Mail actualisation")
        1. Contributeur
          Tu réponds non, alors que je n'ai pas posé de question.
      5. Bonjour.

        Je réponds non au fait qu'il faille effacer les données avant d'étendre le TCD.
        1. Contributeur
          Ces données sont effacées quand on répond "ok".
      6. Non, voir l'onglet "Mail actualisation"

        La macro suivante empêche cela :

        'Adapte le texte sous le TCD à la hauteur du TCD
        Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
        '
        Dim d&, t&
        Const p$ = "Bien cordialement"
        Const f$ = "=CONCATENATE(""Date de retour souhaitée le "")&TEXT(WORKDAY(Rétroplanning!C8,J2,'JoursFériés et mails'!B9:B17),""jj mmmm aaaa"")"
        
            t = Target.TableRange2.Row + Target.TableRange2.Rows.Count - 1
            d = Cells(Rows.Count, "B").End(xlUp).Row
            Do While d > t
                Cells(d, "B").Clear
                d = Cells(Rows.Count, "B").End(xlUp).Row
            Loop
            With Cells(t + 2, "B")
                .Formula = f
                .Font.Bold = True
                .Font.Underline = True
            End With
            Cells(t + 4, "B").Value = p
            With Shapes("Signature")
              .Top = Cells(t + 7, "B").Top
              .Left = Cells(t + 7, "B").Left
            End With
        
        End Sub
        
        
        1. Contributeur
          comme tu le vois, cette macro fait deux choses, après la mise à jour du TCD:
          - elle efface d'abord toutes les données en dessous du nouveau TCD
          - elle ajoute ensuite de nouvelles données en dessous du nouveau TCD

          ce que tu dois ajouter, c'est du code qui est exécuté avant de mettre le TCD à jour, pour effacer les données qui vont disparaitre à cause de l'extension du TCD (ou effacer toutes les données en dessous de l'ancien TCD).
        2. @yg_beOui mais là je ne sais pas faire.

          les macros que tu as pu voir dans mon fichier ne sont pas de ma science mais de helpers sur ce forum....
        3. Contributeur
          @romanzale fichier est trop désordonné, avec du code dans tous les sens, sans logique globale.
          très probablement avec beaucoup de code inutile.

          comment se fait-il que ce TCD se mette à jour, qu'est-ce qui déclenche cette mise à jour?
          quand tu auras déterminé quelle ligne de code déclenche cela, il sera probablement simple d'adapter le code pour éviter de recevoir la question.

          ceci t'aidera peut-être:
          https://www.commentcamarche.net/contents/1381-debogage
      7. Bon OK.

        Je n'ai malheureusement pas le temps d'attaquer une formation en macro.

        Je vais repositionner la question sur le forum.

        Merci pour le temps passé.

        Bonne journée
        1. Contributeur
          peux-tu alors marquer la discussion comme résolue?
      8. Oui même si Ce n'est pas le terme exact
        1. Contributeur
          tu as pourtant obtenu une excellente solution à ta question de départ, me semble-t-il.
      9. Oui tu as raison puisque j'ai formulé ensuite une seconde question qui n'était pas dans le sujet