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

XL 2019 Tri sans modifier la mise en forme

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.
 

fanch55

XLDnaute Barbatruc
Bonjour,
Un tri ne modifie pas la mise en page définie.
Les cellule vides doivent être en haut ou en bas de liste ?
Sans un document permettant de faire des tests, on ne peut que vous dire cela ...
 

MarcDJ

XLDnaute Junior
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

  • Tri.xlsx
    114.8 KB · Affichages: 29

mapomme

XLDnaute Barbatruc
Bonjour @MarcDJ , @fanch55 ,

Point de macro dans le fichier que vous avez fourni. D'ailleurs le fichier fourni est un fichier de type .xls donc sans macro. Par conséquent on ne sait pas ni ce que vous voulez trier ni comment vous envisagez de le faire.
 

TooFatBoy

XLDnaute Barbatruc
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:

fanch55

XLDnaute Barbatruc
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
 

mapomme

XLDnaute Barbatruc
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

  • MarcDJ- tric par bloc de lignes- v1.xlsm
    130.1 KB · Affichages: 10
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…