Problème pour macro de tri avec conditions

lhyce Messages postés 5 Date d'inscription lundi 31 mai 2010 Statut Membre Dernière intervention 4 juin 2010 - 2 juin 2010 à 23:35
lhyce Messages postés 5 Date d'inscription lundi 31 mai 2010 Statut Membre Dernière intervention 4 juin 2010 - 4 juin 2010 à 01:53
Bonjour,
J'ai intégré une macro de tri dans Excel 2007 avec la condition suivante : le tri automatique doit se faire automatiquement seulement quand la plage de cellules est complétée en entier, en occurence ici A3:J3 nommé "plage".
Ça fonctionne super bien pour cette plage mais j'aimerais que ça se produise aussi pour les plages suivantes : A4:J4, A5:J5 etc. Quelqu'un pourrait-il m'aider!?? Merci beaucoup! Voici mon code :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Fin As Boolean
Fin = True
For Each cel In Range("plage")
If cel.Value "" Then Fin False
Next
If Fin Then Call m
End Sub


Sub m()
Range("Monnaie").Sort Key1:=Range("Annee"), Order1:=xlAscending, _
Key2:=Range("serie"), Order2:=xlAscending, _
Header:=xlYes, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom
End Sub


Lhyce

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
3 juin 2010 à 00:08
Salut
Pas tout compris :
Quel est le lien entre "plage" et "serie" (et autre "Monnaie" et "Annee") ?

Si tu veux que le tri que tu lances dans ta fonction "m" travaille sur une autre étendue que "serie", il va falloir passer ce paramètre à la fonction, genre :
Sub m(monRange As Range)
...
Key2:=Range(monRange),...
...
End Sub
et pour l'appeler, suffira de fournir le range, genre :
If Fin Then Call m(Range("A4:J4"))

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
lhyce Messages postés 5 Date d'inscription lundi 31 mai 2010 Statut Membre Dernière intervention 4 juin 2010
3 juin 2010 à 02:35
Bonsoir,
d'abord, merci de bien vouloir m'aider :)!
En fait, je vais te décrire un peu plus en détails mon classeur.
Je veux classer une collection de monnaie.
D'abord dans mon entête de tableau :
Colonne A : # (item numéroté) ;
Colonne B : Coupure ;
Colonne C : Année de la pièce ;
Colonne D : Caractéristiques ;
Colonne E : Signature ;
Colonne F : # de série ;
Colonne G : Grade ;
Colonne H : Catégorie ;
Colonne I : Prix ;
Colonne J : Particularités.

Ma macro de tri s'appelle "m", mon tableau s'appelle "monnaie" et la première ligne de données, donc la ligne 3 s'appelle "plage".
Pour le tri, je veux trier en premier par "Annee" et ensuite par # de série "serie". Pour le tri ça fonctionne!

La seule chose, c'est que je veux que le tri s'effectue au fur et à mesure que je remplis mon tableau, mais pas à chaque modification de cellules. Actuellement, mon désir fonctionne, je remplis ma première ligne "plage" et ensuite mes données se trient. Mais pour les autres lignes .. ça marche pas:(. Je veux que le tri se fasse juste quand j'ai terminé de remplir toute les cellules d'une ligne et ça pour toutes les lignes jusqu'à la ligne 400.

J'espère que mon désir est plus clair?

Penses-tu qu'il est possible de le faire en modifiant quelques paramètres dans mon code actuel?

Je débute en macro alors ... merci de ton indulgence!!!! :)

Merci encore!

Lhyce
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
3 juin 2010 à 10:39
Ah Ok
Donc la méthode de tri porte sur toutes les données, mais tu ne veux la remettre à jour que lorsque toutes les lignes sont complètes.

Une méthode beaucoup plus simple consiste à créer un bouton en haut de ta feuille et de lancer manuellement le tri quand tu le souhaites.

Mais pour te répondre programmaticalement, il te faut scruter toutes les lignes de tes données. Le Range "plage" n'a d'intérêt qu'à la première saisie puisque la suivante sera à la ligne d'après.
    Dim maCellule As Range
    Dim lDernièreLigne As Long
    Dim r As Long
    Dim bIncomplet As Boolean
    
    lDernièreLigne = Range("A1").End(xlDown).Row + 1
    For Each maCellule In Range("A:A")
        bIncomplet = False  ' par défaut
        If maCellule.Row = lDernièreLigne Then Exit For
        For r = 0 To 3  ' Colonne A à colonne D
            If IsEmpty(maCellule.Offset(0, r)) Then
                bIncomplet = True
                Exit For
            End If
        Next r
        If bIncomplet Then Exit For
        DoEvents
    Next

    If bIncomplet Then
        MsgBox "La ligne " & maCellule.Row & " est incomplète"
    Else
        MsgBox "Données complètes. Première ligne vide : " & maCellule.Row
    End If
0
lhyce Messages postés 5 Date d'inscription lundi 31 mai 2010 Statut Membre Dernière intervention 4 juin 2010
4 juin 2010 à 00:56
Wow!
J'aurais jamais trouvé ça toute seule!
J'aurais dû demander de l'aide bien avant! Merci :)
Et ... comment je fais pour "pluger" ma macro tri à la suite de ça?

Merci beaucoup !!!

Lhyce
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lhyce Messages postés 5 Date d'inscription lundi 31 mai 2010 Statut Membre Dernière intervention 4 juin 2010
4 juin 2010 à 01:53
Bonsoir!
ça marche pas peu importe où je clique ça m'écrit Ligne 1 incomplète????

Merci!
Lhyce
0
Rejoignez-nous