XL 2019 Tri sans modifier la mise en forme

  • Initiateur de la discussion Initiateur de la discussion MarcDJ
  • 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 !

MarcDJ

XLDnaute Junior
Bonjour,

Je voudrais trier une plage de cellules par Nom, dans laquelle, il y a des cellules vides qui seront remplies plus tard.

Bien sûr la mise en page de la feuille ne doit pas être modifiée.

Merci d'avance pour vos réponses.
 
Bonjour fanch55,

Merci pour votre réponse rapide, je joins un fichier.

En fait, j'ai créé une macro, qui remplit les champs Nom, Prénom, Téléphone, Courriel à partir de la feuille "Inscription des participants" non présente..

Ce remplissage se fait à chaque participant introduit dans la liste et doit se trier à chaque remplissage, mais le tri n'est pas fait correctement puisqu'il ne respecte pas les cases sous les renseignements des participants qui devront être remplies par la suite.

Un autre problème me tarabuste également, c'est la bordure rouge qui n'est pas complète pour les participants déjà introduits.

J'en demande beaucoup pour une première intervention, mais je n'ai pas assez d'expérience pour résoudre ce genre de problèmes.

Merci beaucoup.
 

Pièces jointes

On sait donc maintenant ce que tu voulais dire par "garder la mise en page".👍


Je ne sais pas si des cellules fusionnées peuvent aider à résoudre le problème plus simplement.

Avec du VBA "tout" est possible. 😉
En revanche, sans PC, ce n'est pas moi qui pourrait te donner la solution. Désolé.
 
Dernière édition:
Code à exécuter à chaque mise à jour de la liste ( code spécifique au classeur fourni ) :
VB:
Sub Tri_Tableau()
Dim Sh          As Worksheet: Set Sh = ActiveWorkbook.Worksheets("Feuil1")
Dim Start_Row   As Long:      Start_Row = 11
Dim End_Row     As Long:        End_Row = 28

Application.ScreenUpdating = False

    With Sh.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Sh.Columns("C").Rows(Start_Row & ":" & End_Row), _
             SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Sh.Columns("D").Rows(Start_Row & ":" & End_Row), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange Sh.Columns("A:T").Rows(Start_Row & ":" & End_Row)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    For Each L In Sh.Columns("A:T").Rows(Start_Row & ":" & End_Row).Rows
        If L.Cells(1) = "" Then
            L.Columns("A:D").Borders.LineStyle = xlLineStyleNone
            For Each Cell In L.Columns("E:T").Cells
                Cell.BorderAround LineStyle:=xlContinuous, Weight:=xlThin, ColorIndex:=0
            Next
        Else
            For Each Cell In L.Columns("A:T").Cells
                Cell.BorderAround LineStyle:=xlContinuous, Weight:=xlThick, Color:=vbRed
            Next
        End If
    Next
End Sub
 
Bonsoir à tous,

On trie par bloc de 6 lignes. On ne perd plus les bordures rouges => on garde le formatage (car on ne trie que les valeurs). Cliquez sur l'image (jaune) du tri.
La feuille "Feuil1" n'est là que pour la mise au point. Si la macro fonctionne, vous pouvez la supprimez.

VB:
Sub TestTri()
Dim der&, N&, last&, t, i&, j&, k&, aux, ech As Boolean

   der = Cells(Rows.Count, "c").End(xlUp).Row
   If der <= 11 Then Exit Sub
   t = Range("a11:t" & 10 + 6 * (1 + Int((der - 11) / 6)))
   For i = 1 To UBound(t) - 1 Step 6: t(i, 3) = t(i, 3) & "\" & t(i, 4): Next
   Do
      ech = False
      For i = 1 To UBound(t) - 6 Step 6
         If t(i, 3) > t(i + 6, 3) Then
            ech = True
            For k = 0 To 5
               For j = 1 To UBound(t, 2)
                  aux = t(i + k, j): t(i + k, j) = t(i + k + 6, j): t(i + k + 6, j) = aux
               Next j
            Next k
         End If
      Next i
      If Not ech Then Exit Do
   Loop
   For i = 1 To UBound(t) - 1 Step 6: t(i, 3) = Split(t(i, 3), "\")(0): Next
   Range("a11").Resize(UBound(t), UBound(t, 2)) = t
End Sub
 

Pièces jointes

Dernière édition:
Je n'avais pas compris qu'il y avait une notion de groupe ....
Re @fanch55 😉
Sois rassuré. Contrairement à la numérotation de mon fichier téléversé sur le site (v1), j'avais comme toi fait un premier jet sans tenir compte des blocs. Ensuite, j'ai tout réécrit suite à la question de @Marcel32 🙂 et à la réponse du demandeur.
 
Dernière édition:
- 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

Discussions similaires

Réponses
4
Affichages
200
Réponses
2
Affichages
154
  • Question Question
XL 2019 MFC
Réponses
6
Affichages
111
Retour