Microsoft 365 Anomalie tri colonnes d’un tableau

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 !

JPC33

XLDnaute Junior
Les onglets Volière 1, Volière 2 Volière 3 sont semblables. Les macros « Tri » sont dans le module 3.

Les cellules B3 :B38 ne comportent pas de formules. Le tri alpha par cette colonne avec la macro « TriNF » est OK.

Les cellules C3 :C38 comportent des formules. Le résultat du tri alpha, avec la macro « TriNS », est en bas du tableau après les lignes vides ! La macro est-elle incomplète ou comment palier cette anomalie ?

Merci
 

Pièces jointes

Solution
Pour moi, ceci devrait suffire :
VB:
Sub TriNoms()
'
    If Range("esp").ListObject.ListRows.Count = 0 Then Exit Sub

    Application.ScreenUpdating = False

    Sheets("Noms").Unprotect

    With Range("Tab_AB")
        If Not .ListObject.DataBodyRange Is Nothing Then .ListObject.DataBodyRange.Delete
        Range("esp[[NOM FRANÇAIS]:[NOM SCIENTIFIQUE]]").Copy
        .Cells(1, 1).PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    End With

    With Range("Tab_AB").ListObject.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("Tab_AB[NOM FRANÇAIS]"), _
                        SortOn:=xlSortOnValues, _
                        Order:=xlAscending, _
                        DataOption:=xlSortNormal...
Bonjour @JPC33🙂,

Vous utilisez des tableaux structurés et c'est bien👌.
Vous laissez tout un tas de lignes vides en fin de vos tableaux structurés et ce n'est pas bien du tout☹️.

Les TS ne sont pas conçus pour cela. Insérer une ligne en fin de TS a été pensé comme étant quelque chose de très simple.
  • on se place sur la dernière cellule du TS (en bas à droite) et on appuie sur la touche Tab
  • ou bien on saisit directement une valeur dans la première ligne vide sous le TS. La ligne est automatiquement incluse dans le tableau.

Une fois les lignes vides éliminées du TS, on n'a même plus besoin de macro pour trier le TS selon une colonne. On utilise les boutons du filtre automatique du TS.
 
Dernière édition:
Bonjour @JPC33🙂,

Vous utilisez des tableaux structurés et c'est bien👌.
Vous laissez tout un tas de lignes vides en fin de vos tableaux structurés et ce n'est pas bien du tout☹️.

Les TS ne sont pas conçus pour cela. Insérer une ligne en fin de TS a été pensé comme étant quelque chose de très simple.
  • on se place sur la dernière cellule du TS (en bas à droite) et on appuie sur la touche Tab
  • ou bien on saisit directement une valeur dans la première ligne vide sous le TS. La ligne est automatiquement incluse dans le tableau.

Une fois les lignes vides éliminées du TS, on n'a même plus besoin de macro pour trier le TS selon une colonne. On utilise les boutons du filtre du TS.
Merci mapomme.
Je vais suivre vos conseils.
Bonne soirée
 
Bonjour le forum et mapomme
Ci-joint mon fichier sans lignes vides. J’ai rajouté des boutons car les feuilles sont protégées à cause des formules dans certaines colonnes. La manip est contraignante mais évite les cata.
Dans la feuille Espèces, je rentre les noms puis clic sur le bouton rouge TriNoms. (Triage dans une feuille Noms)
Mais maintenant, lorsque je clique sur ce bouton TriNoms, la fenêtre suivante s’ouvre :
Cette cellule contient déjà des données. Voulez-vous les remplacer ? Oui non
Je vous remercie de vous pencher sur la solution.
 

Pièces jointes

Bonjour,

Mais maintenant, lorsque je clique sur ce bouton TriNoms, la fenêtre suivante s’ouvre :
Cette cellule contient déjà des données. Voulez-vous les remplacer ? Oui non
C'est peut-être parce que tu utilises un TS et qu'il faudrait déprotéger la feuille avant d'inscrire le nouveau nom pour que ça crée une nouvelle ligne dans le TS.

Perso, je ne vois pas la fenêtre dont tu parles.


[edit] Au temps pour moi : je n'avais même pas vu le gros bouton rouge [TriNom] !... 🙄 [/edit]
 
Dernière édition:
Bonjour,


C'est peut-être parce que tu utilises un TS et qu'il faudrait déprotéger la feuille avant d'inscrire le nouveau nom pour que ça crée une nouvelle ligne dans le TS.

Perso, je ne vois pas la fenêtre dont tu parles.


[edit] Au temps pour moi : je n'avais même pas vu le gros bouton rouge [TriNom] !... 🙄 [/edit]
Bonjour TooFatBoy et merci de vous pencher sur mon problème.
 
Barbatruc c'est uniquement par rapport au nombre de messages postés. Ca n'a rien à voir avec la qualité desdits messages. 😉


J'ai tout de même une question, qui n'a rien à voir avec ton problème de #4.
Dans la feuille Espèces, je rentre les noms puis clic sur le bouton rouge TriNoms. (Triage dans une feuille Noms)
comment procèdes-tu exactement pour ajouter un nom dans ton tableau de la feuille "Espèce" ?
 
Barbatruc c'est uniquement par rapport au nombre de messages postés. Ca n'a rien à voir avec la qualité desdits messages. 😉


J'ai tout de même une question, qui n'a rien à voir avec ton problème de #4.

comment procèdes-tu exactement pour ajouter un nom dans ton tableau de la feuille "Espèce" ?
Dans la feuille Espèces, je rajoute une ligne avec le bouton Ajouter une ligne. Puis je rentre les noms français et scientifique d'une nouvelle espèce. Clic sur le bouton rouge TriNoms qui déclenche la macro TriNoms. Le tri s'effectue dans la feuille Noms et c'est là que ça bloque avec la demande Cette cellule contient…
 
Une proposition à tester pour voir si ça fait vraiment ce que tu veux... :
VB:
Sub TriNoms()
'
    If Range("esp").ListObject.ListRows.Count = 0 Then Exit Sub

    Application.ScreenUpdating = False

    Sheets("Noms").Unprotect

    With Range("Tab_AB")
        If Not .ListObject.DataBodyRange Is Nothing Then .ListObject.DataBodyRange.Delete
        Range("esp[[NOM FRANÇAIS]:[NOM SCIENTIFIQUE]]").Copy
        .Cells(1, 1).PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    End With

    With ThisWorkbook.Worksheets("Noms").ListObjects("Tab_AB").Sort.SortFields
        .Clear
        .Add Key:=Range("Tab_AB[NOM FRANÇAIS]"), _
             SortOn:=xlSortOnValues, _
             Order:=xlAscending, _
             DataOption:=xlSortNormal
    End With

    With ThisWorkbook.Worksheets("Noms").ListObjects("Tab_AB").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    Sheets("Noms").Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
    Sheets("Espèces").Select

End Sub
 
Dernière édition:
Une proposition à tester pour voir si ça fait vraiment ce que tu veux... :
VB:
Sub TriNoms()
'
    If Range("esp").ListObject.ListRows.Count = 0 Then Exit Sub

    Application.ScreenUpdating = False

    Sheets("Noms").Unprotect

    With Range("Tab_AB")
        If Not .ListObject.DataBodyRange Is Nothing Then .ListObject.DataBodyRange.Delete
        Range("esp[[NOM FRANÇAIS]:[NOM SCIENTIFIQUE]]").Copy
        .Cells(1, 1).PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    End With

    With ThisWorkbook.Worksheets("Noms").ListObjects("Tab_AB").Sort.SortFields
        .Clear
        .Add Key:=Range("Tab_AB[NOM FRANÇAIS]"), _
             SortOn:=xlSortOnValues, _
             Order:=xlAscending, _
             DataOption:=xlSortNormal
    End With

    With ThisWorkbook.Worksheets("Noms").ListObjects("Tab_AB").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    Sheets("Noms").Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
    Sheets("Espèces").Select

End Sub
Impeccable la macro. Grand merci TooFatBoy
 
Pour moi, ceci devrait suffire :
VB:
Sub TriNoms()
'
    If Range("esp").ListObject.ListRows.Count = 0 Then Exit Sub

    Application.ScreenUpdating = False

    Sheets("Noms").Unprotect

    With Range("Tab_AB")
        If Not .ListObject.DataBodyRange Is Nothing Then .ListObject.DataBodyRange.Delete
        Range("esp[[NOM FRANÇAIS]:[NOM SCIENTIFIQUE]]").Copy
        .Cells(1, 1).PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    End With

    With Range("Tab_AB").ListObject.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("Tab_AB[NOM FRANÇAIS]"), _
                        SortOn:=xlSortOnValues, _
                        Order:=xlAscending, _
                        DataOption:=xlSortNormal
        .Apply
    End With

    Sheets("Noms").Protect DrawingObjects:=False, Contents:=True, Scenarios:=False

    Sheets("Espèces").Select

End Sub
 
J'ai l'impression que les deux derniers "With ... End With" font la même chose. Nan ?
Là, vous m'en demandez trop car je suis une vraie bille dans les macros. Heureusement le forum, dont vous faites partie, est là!
Pour moi, ceci devrait suffire :
VB:
Sub TriNoms()
'
    If Range("esp").ListObject.ListRows.Count = 0 Then Exit Sub

    Application.ScreenUpdating = False

    Sheets("Noms").Unprotect

    With Range("Tab_AB")
        If Not .ListObject.DataBodyRange Is Nothing Then .ListObject.DataBodyRange.Delete
        Range("esp[[NOM FRANÇAIS]:[NOM SCIENTIFIQUE]]").Copy
        .Cells(1, 1).PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    End With

    With Range("Tab_AB").ListObject.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("Tab_AB[NOM FRANÇAIS]"), _
                        SortOn:=xlSortOnValues, _
                        Order:=xlAscending, _
                        DataOption:=xlSortNormal
        .Apply
    End With

    Sheets("Noms").Protect DrawingObjects:=False, Contents:=True, Scenarios:=False

    Sheets("Espèces").Select

End Sub
C'est tout bon. Impeccable merci encore. Je joins le fichier terminé.
 

Pièces jointes

- 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
7
Affichages
271
Réponses
3
Affichages
297
Retour