Tri alphabétique en vba sur cellules non vides

89ric

XLDnaute Junior
Bonjour,
je me tourne de nouveau vers vous pour m'aider à programmer un code me permettant de faire un tri alphabétique par exemple sur la feuil4 dans une plage déterminée (a5:s36) selon une colonne B mais uniquement sur les lignes non vides. J'ai bien essayé sans macro mais comme il y a des formules dans les cellules vides, il me m'est en premier les cellules vides.
Pouvez-vous m'aider?
Merci.
 

Pièces jointes

  • Modèle Notes PP v3.5.zip
    249.8 KB · Affichages: 106
  • Modèle Notes PP v3.5.zip
    249.8 KB · Affichages: 104
  • Modèle Notes PP v3.5.zip
    249.8 KB · Affichages: 105
Dernière édition:

Daid

XLDnaute Nouveau
Re : Tri alphabétique en vba sur cellules non vides

Ce que je vous propose est une astuce qui contourne le problème du tri des cellules vides.

ça vous permettra d'utiliser en l'état et sans macro votre fichier.

C'est une bidouille !!

Je vous propose de remplir vos cellules vides dans la feuille saisie par "ZZZ" car vous avez peu de chance d'avoir un élève dont le nom commence par "ZZZ".

Ensuite et comme chaque onglets utilisent les 34 lignes de la feuille de saisie comme référence vous allez voir apparaitre les fameux "ZZZ".

Pour les faire disparaitre je vous propose d'activer une mise en forme conditionnelle qui lorsque la valeur de la cellule sera égale à "ZZZ" la couleur de la police passera en blanc donc invisible dans le tableau.

Si vous souhaitez mettre de la couleur il suffit de mettre les choses en concordance.

J'ai testé cette manip ça fonctionne.

Les élèves sont triés et les notes aussi dès lors qu'on les englobe dans la fonction tri.

La mise en forme conditionnelle est disponible dans le menu format.

pour l'utiliser suivez cet enchainnement de taches :
1 - Sélectionner la plage de donnée correspondant à la colonne des noms propres
2 - Ouvrir le menu Format
3 - Cliquer sur "Mise en forme conditionnelle"
4 - Choisisser "La Valeur de la cellule est" + "Egale à" + "ZZZ"
5 - Cliquer sur le bouton "format" juste en dessous
6 - Dans l'onglet "Police" choisissez la couleur blanche

A chaque fois qu'une cellule contiendra la chaine de caractère "ZZZ", la couleur blanche sera appliquée, ainsi vous ne verrez pas le "ZZZ" et vous pourrez trier sans que les cellules vides ou pseudo vides ne se placent en premier.

ça vaut ce que ça vaut je le reconnais mais ça marche !!
 

Daid

XLDnaute Nouveau
Re : Tri alphabétique en vba sur cellules non vides

Pour le tri automatique la meilleure solution c'est la macro evènementielle attachée à l'onglet "Saisie", qui lorsqu'il y a un changement dans une cellule, lance une macro.

Ce que je vous conseille c'est de nommer vos plages de cellules que vous devez trier à chaque fois que vous ajoutez un élève.

Ensuite la macro appliquera la fonction tri sur chaque plage nommée.

Pour ma part je préfère les plages de données nommées car si vous devez agrandir, par exemple le nombre d'élève où le nombre de colonne de vos tableaux à trier, vous n'aurez pas à modifier votre macro.
 

Daid

XLDnaute Nouveau
Re : Tri alphabétique en vba sur cellules non vides

C'est pas très compliqué,

il vous suffit de créer une macro dans la feuille concernée par l'évènement que vous voulez tracer, dans votre cas il s'agit d'un changement de cellule donc la séquence de code suivante est à utiliser :

Private Sub Worksheet_Change()
"Ici mettre le code de la macro de tri" (rappel la fonction tri est assurée par la méthode "Sort", voir l'aide Excel pour son utilisation)
End Sub

Pour se faire vous ouvrez visual basic editor lorsque vous êtes sur votre fichier

Vous cliquez sur la feuille "Saisie" dans l'arborescence des feuilles du classeur qui se trouve à gauche

Vous glisser votre code macro dans la partie dédiée au code VBA

Et le tour est joué.

Si vous rencontrez des difficultés je vous ferai une insertion du code dans votre fichier que je vous enverrai ensuite.

Mais là c'est l'heure du dodo !!

Bonne soirée.
 

89ric

XLDnaute Junior
Re : Tri alphabétique en vba sur cellules non vides

Bonjour, je viens d'essayer la méthode de Daid mais je rencontre 2 problèmes:
  • le premier est que j'ai déjà une mise en forme conditionnelle sur mes cellules qui me "colorie" la cellule suivant le numéro de la ligne et du coup je me retrouve avec des cellules blanches dans des lignes grises.
    • le deuxième est que j'ai une macro qui me donne le nom des feuilles (à partir de la feuille 15) et qui suivant si la cellule est vide ou non modifie le nom de la feuille.

    Je viens d'essayer une macro que j'ai trouvé et modifié. Je l'ai essayé sur une feuille (1° trimestre) mais elle m'indique une erreur et surtout elle me place toujours les cellules vides en premier.

    Sub Trialphabétique()
    Dim ShtS As Worksheet
    ' Définir le nom de la feuille de saisie
    Set ShtS = Sheets("1° Trimestre")
    ' En Cas d'erreur on continue
    On Error Resume Next
    ' Selectionne la première cellule du tableau
    Range("b5").Select
    ' Boucle tant que pas vide
    nbligne = 0
    Do While Not (IsEmpty(ActiveCell))
    nbligne = nbligne + 1
    Selection.Offset(5, 0).Select
    Loop

    nbligne = Range(Cells(2, 5), Cells(2, 5).End(xlDown)).Rows.Count

    Range(Cells(2, 5), Cells(18, nbligne)).Select


    Range("b5:s5").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Sort Key1:=Range("b5"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

    End Sub

    Merci pour votre aide.
 

Pièces jointes

  • Modèle Notes PP v3.7.zip
    267.8 KB · Affichages: 93
Dernière édition:
C

Compte Supprimé 979

Guest
Re : Tri alphabétique en vba sur cellules non vides

Salut 89ric,

Essayes ce code
VB:
Sub TriVideEnDernier()
  Dim Lig As Long, DLig As Long
  With ActiveSheet
    ' 1er tri décroissant, les cellules vides à la fin
    .Range("A5:S36").Sort Key1:=Range("B5"), Order1:=xlDescending, _
        Key2:=Range("C5"), Order2:=xlDescending, Header:=xlNo, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    ' Déterminer la dernière ligne remplie en colonne B
    For Lig = 5 To 36
      If .Range("B" & Lig).Value = "" Then
        DLig = Lig - 1
        Exit For
      End If
    Next Lig
    ' 2ème trie ordre croissant, uniquement les lignes remplies
    .Range("A5:S" & DLig).Sort Key1:=Range("B5"), Order1:=xlAscending, _
        Key2:=Range("C5"), Order2:=xlAscending, Header:=xlNo, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  End With
End Sub

A+
 

89ric

XLDnaute Junior
Re : Tri alphabétique en vba sur cellules non vides

Bonjour BrunoM45,
Ca marche!!
J'ai juste changer le numéro de la colonne pour conserver la numérotation croissante numérique des élèves. Il ne me reste plus qu'à l'adapter pour faire le tri sur les autres feuilles concernées.
Encore merci!!:D
 

89ric

XLDnaute Junior
Re : Tri alphabétique en vba sur cellules non vides

Re,
j'ai un souci pour modifier ta macro pour qu'elle fonctionne sur plusieurs feuilles (feuil2 à 14).
J'ai essayé ceci:

Sub TriVideEnDernier()
Dim Lig As Long, DLig As Long
With Sheets("TNF AO")
' 1er tri décroissant, les cellules vides à la fin
.Range("B2:S33").Sort Key1:=Range("B2"), Order1:=xlDescending, _
Key2:=Range("C2"), Order2:=xlDescending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
' Déterminer la dernière ligne remplie en colonne B
For Lig = 2 To 33
If .Range("B" & Lig).Value = "" Then
DLig = Lig - 1
Exit For
End If
Next Lig
' 2ème tri ordre croissant, uniquement les lignes remplies
.Range("b2:S" & DLig).Sort Key1:=Range("B2"), Order1:=xlAscending, _
Key2:=Range("C2"), Order2:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With

With Sheets("Circulaire PP")
' 1er tri décroissant, les cellules vides à la fin
.Range("B3:S34").Sort Key1:=Range("B3"), Order1:=xlDescending, _
Key2:=Range("C3"), Order2:=xlDescending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
' Déterminer la dernière ligne remplie en colonne B
For Lig = 3 To 34
If .Range("B" & Lig).Value = "" Then
DLig = Lig - 1
Exit For
End If
Next Lig
' 2ème tri ordre croissant, uniquement les lignes remplies
.Range("b3:S" & DLig).Sort Key1:=Range("B2"), Order1:=xlAscending, _
Key2:=Range("C3"), Order2:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With


End Sub

Mais cela ne fonctionne pas. est-ce à cause du with?
J'ai essayé en enlevant le with et en mettant sheets('feuil2').select mais il me trouve une erreur: le point qui est avant le range.
Si je l'enlève, j'ai toujours une erreur.
Merci.
 
Dernière édition:

89ric

XLDnaute Junior
Re : Tri alphabétique en vba sur cellules non vides

Re, je pense avoir trouvé.

Sub TriVideEnDernier()
Dim Lig As Long, DLig As Long
Sheets("TNF AO").Select
With ActiveSheet
' 1er tri décroissant, les cellules vides à la fin
.Range("b2:S33").Sort Key1:=Range("B2"), Order1:=xlDescending, _
Key2:=Range("C2"), Order2:=xlDescending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
' Déterminer la dernière ligne remplie en colonne B
For Lig = 2 To 33
If .Range("B" & Lig).Value = "" Then
DLig = Lig - 1
Exit For
End If
Next Lig
' 2ème trie ordre croissant, uniquement les lignes remplies
.Range("b2:S" & DLig).Sort Key1:=Range("B2"), Order1:=xlAscending, _
Key2:=Range("C2"), Order2:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With

Sheets("Circulaires PP").Select
With ActiveSheet
' 1er tri décroissant, les cellules vides à la fin
.Range("b3:S34").Sort Key1:=Range("B3"), Order1:=xlDescending, _
Key2:=Range("C3"), Order2:=xlDescending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
' Déterminer la dernière ligne remplie en colonne B
For Lig = 3 To 34
If .Range("B" & Lig).Value = "" Then
DLig = Lig - 1
Exit For
End If
Next Lig
' 2ème trie ordre croissant, uniquement les lignes remplies
.Range("b3:S" & DLig).Sort Key1:=Range("B3"), Order1:=xlAscending, _
Key2:=Range("C3"), Order2:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
End Sub
 

Discussions similaires

Réponses
31
Affichages
1 K

Membres actuellement en ligne

Statistiques des forums

Discussions
312 505
Messages
2 089 070
Membres
104 019
dernier inscrit
BenKmc