Trier de tableaux
Bonsoir
Je sollicite votre aide car je n'arrive pas a trouver de solution
Je voudrais que lorsque je tri mon tableau de la semaine 1 celui ci ne modifie pas la semaine 2 et idem quand je tri la semaine 3 et cela sur toutes les semaines
avec le fichier joint cela devrait etre plus explicite.
Merci pur votre aide.
Bonsoir Bob34,
En testant ton EXCEL, je ne constate pas qu'il se comporte différemment de ce que tu souhaites.
J'ai certainement mal compris...Peux-tu expliciter?
Bonsoir GVIALLES
Quand tu tri les données du tableau semaine 2 trier par points par exemple les cellules ne correspondent plus a la semaine 1
Voudrais-tu donc que le tri s'applique à tous les tableaux "SemaineX"?
Je voudrais que chaque semaine puisse etre trier par utilisateur ou points sans que cela ne modifie les tableaux des semaines précédentes ou suivante
Rebonsoir Bob,
1) pour une feuille "Semaine X" :
* le bouton jaune « Triez par noms » appelle la sub TriNoms() :
tri du tableau selon la colonne B (Noms, ordre croissant) et selon la colonne cp (colonne Total Points, ordre croissant)
ainsi, pour 2 personnes nommées "Jean Dupont", celui qui a le plus de points sera en premier.
* le bouton vert « Triez par points » appelle la sub TriPoints() :
tri du tableau selon la colonne cp (colonne Total Points, ordre décroissant) et selon la colonne B (Noms, ordre décroissant)
➯ de bas en haut, nombre total de points croissant et noms en ordre alpha croissant.
ces 2 subs TriNoms() et TriPoints() sont dans Module1, et sont complètement indépendantes l'une de l'autre : on peut être sûr qu'il y a aucune interférence entre les deux ; chaque feuille "Semaine X" appelle une des 2 subs par son bouton jaune ou son bouton vert, et la sub modifie uniquement la feuille active ; on peut être sûr qu'un tri effectué sur une feuille ne peut pas modifier une autre feuille.
2) à l'ouverture du fichier, feuille "Semaine 1", c'est déjà trié par noms : "Utilisateur 01" à "Utilisateur 19" ; va sur "Semaine 2" : idem ; clique sur le bouton vert « Triez par points » ➯ en colonne E : de 801 à 0 ; va sur "Semaine 1" ; c'est toujours trié dans l'ordre croissant des noms : ça n'a pas changé.
dhany
pour chaque feuille "Recap" ("Janvier" à "Decembre") :
* la colonne "Noms Chauffeurs" est la colonne B
* la colonne "Total Points" est la colonne C
donc dans le module de la feuille "Recap", la sub du bouton vert « Triez par points » contient cet appel erroné :
TriPoints 5 'colonne sigma points (E)
c'est à remplacer par :
TriPoints 3 'colonne Total points (C)
de plus, il manque sur les feuilles "Recap" un bouton jaune « Triez par noms » ; l'appel sera :
TriNoms 3 'colonne Total points (C)
là aussi, il faut transmettre le n° de la colonne Total Points, car ne pas oublier que le tri est selon 2 critères !
dhany
Bonsoir Dhany
Merci pour ton aide j'applique tes modifications des demain et je poste un retour
Bonne soirée
Bonjour
Dhany je viens d'appliquer tes corrections c'est impeccable
Par contre je viens de contrôler le fichier donc si je tri ma semaine 1 par noms ou par points c'est Ok
puis je passe sur ma semaine 2 les deux tri fonctionnent correctement
par contre si reviens sur ma semaine 1 et que pour contrôler je tri par noms cela modifie la semaine 2
et c'est cela que je ne souhaite pas.
Merci pour l'aide.
Bonjour Bob,
tu a écrit :par contre si je reviens sur ma semaine 1 et que pour contrôler je trie par noms cela modifie la semaine 2
oui, c'est exact ; au temps pour moi, je ne l'avais pas vu.
=CELLULE("contenu";'Semaine 1'!E5)
c'est ça qui fout le boxon, car quand tu tries en "Semaine 1", ça modifie l'ordre des lignes mais la formule se réfère toujours à E5 qui contient le total d'un autre nom !
1) pour chaque feuille "Semaine", mettre un nom défini via le Gestionnaire de noms :
* "Semaine 1" : Week01 : ='Semaine 1'!$B$5:$D$23
* "Semaine 2" : Week02 : ='Semaine 2'!$B$5:$D$23
* "Semaine 3" : Week03 : ='Semaine 3'!$B$5:$D$23
* "Semaine 4" : Week04 : ='Semaine 4'!$B$5:$D$23
* "Semaine 5" : Week05 : ='Semaine 5'!$B$5:$D$23
2) attention : les formules de la colonne "Total Points" sont inchangées ➯ ne pas utiliser cette colonne ; à la place :
* "Semaine 2" : en C5 (étiré vers le bas jusqu'en C23) :
=SI(B5="";0;SIERREUR(RECHERCHEV(B5;Week01;2;0);0)+SIERREUR(RECHERCHEV(B5;Week01;3;0);0))
* "Semaine 3" : en C5 (étiré vers le bas jusqu'en C23) :
=SI(B5="";0;SIERREUR(RECHERCHEV(B5;Week02;2;0);0)+SIERREUR(RECHERCHEV(B5;Week02;3;0);0))
* "Semaine 4" : en C5 (étiré vers le bas jusqu'en C23) :
=SI(B5="";0;SIERREUR(RECHERCHEV(B5;Week03;2;0);0)+SIERREUR(RECHERCHEV(B5;Week03;3;0);0))
* "Semaine 5" : en C5 (étiré vers le bas jusqu'en C23) :
=SI(B5="";0;SIERREUR(RECHERCHEV(B5;Week04;2;0);0)+SIERREUR(RECHERCHEV(B5;Week04;3;0);0))
* "Recap Janvier" : en C5 (étiré vers le bas jusqu'en C23) :
=SI(B5="";0;SIERREUR(RECHERCHEV(B5;Week05;2;0);0)+SIERREUR(RECHERCHEV(B5;Week05;3;0);0))
oui, c'est à faire pour la feuille "Recap" aussi !
tous les changements décrits ci-dessus sont déjà faits dans ce fichier :
fais des tests sur les feuilles "Semaine 1" à "Semaine 5" et "Recap Janvier" ; si ça marche comme tu veux et que cette solution te plaît, à toi d'faire pareil pour toutes les autres feuilles "Semaine" et "Recap", en ajoutant les noms définis Week06 à Week52.
à te lire pour avoir ton avis.
dhany
@Bob
ajout : si tu as des homonymes, par exemple 2 "Jean Dupont", la fonction RECHERCHEV() trouvera les infos du 1er rencontré, et pas celui qui est en dessous ; dans ce cas, solution la plus simple : ajoute un chiffre : "Jean Dupont 1" et "Jean Dupont 2".
dhany
Re Dhany
Merci pour ton aide précieuse, il n'y aura pas de doublon.
le code macro serais lequel pour le faire avec une macro, si cela ne te dérange pas bien entendu.
bob34
j'ai bien lu ton post ; je ferai la macro dès que possible.
dhany
Re Dhany
@+Bob34
Bonjour Bob,
voici la nouvelle version :
regarde la feuille "Semaine 1" ; note bien qu'il y a un tri par points, donc c'est pas dans l'ordre alphabétique des noms ; va sur la feuille "Semaine 2" ; j'ai effacé C5:C23 (tu verras plus tard que c'est pareil sur toutes les feuilles qui suivent ; dans ton fichier réel, t'auras pas besoin d'le faire car cet effacement est fait automatiquement par la macro, même si y'a plus de lignes) ; toujours sur la même feuille "Semaine 2", fais Ctrl r (r pour Récup) ➯ ça a récupéré en colonne C tous les points de la feuille précédente, même si les noms sont pas dans le même ordre !
tu peux faire Ctrl r sur toutes les feuilles qui suivent, y compris sur les feuilles "Recap" (ça marchera même si tu renommes celles-ci en "Récap")
si tu as fait un tri sur la feuille précédente et / ou sur la feuille active, la macro récupérera toujours correctement les données.
Alt F11 pour voir le code VBA, puis revenir sur Excel
si besoin, tu peux demander une adaptation.
merci de me dire si ça te convient.
dhany
Bonjour dhany
J'ai rajouté dans un module pour protéger toutes les feuilles en une seule fois et les déprotéger avec ce code :
Sub Protection()
For i = 1 To Sheets.Count
Sheets(i).Protect Password:=""
Next
End Sub
Sub OterProtection()
For i = 1 To Sheets.Count
Sheets(i).Unprotect Password:=""
Next
End Sub
Comment faire pour que lors du ctrl R pour que la récupération des données cela fonctionne.
merci pour ton aide
@+Bob34
1) pour la dernière ligne de la sub VN(), j'avais laissé par erreur le : Exit Sub
en bout de ligne : il est inutile, car on est juste avant le End Sub
➯ on sort de la sub de toute façon ; j'ai donc supprimé ce : Exit Sub
inutile :
Private Sub VN(f$, c As Byte) 'VérifNom ; si ok : c = 5 ou 3
Dim m$, p As Byte: p = InStr(f, " "): If p = 0 Then Exit Sub
m = Left$(f, p - 1): If m = "Semaine" Then c = 5: Exit Sub
If m = "Recap" Or m = "Récap" Then c = 3
End Sub
2) pour la sub Récup(), à propos de la protection des feuilles :
* la feuille qui précède la feuille active est lue uniquement, y'a aucune modif ; elle peut donc rester protégée
* la feuille active doit être déprotégée au début (1×) ; puis reprotégée ensuite (en 2 endroits différents)
3) les 2 subs TriPoints() et TriNoms() ont aussi besoin d'une déprotection de feuille ; puis reprotection de feuille !
les points 1) à 3) sont faits dans ce fichier :
(regarde aussi Module2
dhany
Bonsoir Dhany
Un très grand merci pour ton aide
le fichier est impeccable et fonctionne a merveille
Bonne Soirée
@+Bob34
tu a écrit :le fichier est impeccable et fonctionne à merveille
merci pour ton retour !
pour passer le sujet en résolu, clique sur près de (coin haut droit du post) ➯; ça permet aussi de clôturer le fil de la discussion (toi seul peut le faire, car c'est toi qui a créé ce sujet).
bonne soirée à toi aussi !
dhany
Bonsoir Bob,
[quote="dans ton post du 16 janvier à 16:10, tu"]Merci pour ton aide précieuse, il n'y aura pas de doublon.[/quote]
ça fait que j'ai oublié une petite optimisation dans la sub Récup() :
For j = 5 To d2
If .Cells(j, 2) = nom Then Cells(i, 3) = .Cells(j, c): Exit For
Next j
sans le : Exit For
ça fait qu'après avoir écrit la bonne info en colonne C, ça continue de lire les lignes en dessous, ce qui est inutile puisque tu as écrit qu'il n'y a pas de doublon ➯ en sortant tout de suite de la boucle For j
, ça accélère l'exécution du code VBA ; alors imagine que tu as une liste de 500 chauffeurs et qu'ça a trouvé l'info à la 3ème ligne, ça évite maint'nant de tester pour rien les 497 lignes qui sont dessous ! et plus ta liste de chauffeurs sera longue, plus le gain de temps sera important pour un chauffeur trouvé en début de liste.
➯ si tu ne veux pas écrire le : Exit For
sur la même ligne, ne fais surtout pas comme ça :
For j = 5 To d2
If .Cells(j, 2) = nom Then Cells(i, 3) = .Cells(j, c)
Exit For 'FAUX, car c'est exécuté dans tous les cas !
Next j
mais comme ça:
For j = 5 To d2
If .Cells(j, 2) = nom Then
Cells(i, 3) = .Cells(j, c): Exit For
End If
Next j
ou comme ça:
For j = 5 To d2
If .Cells(j, 2) = nom Then
Cells(i, 3) = .Cells(j, c)
Exit For
End If
Next j
ainsi, pour ces 2 derniers codes, c'est exécuté seulement si le test est vrai, comme quand tout est sur une seule ligne.
fichier avec l'optimisation déjà faite (comme ça, tu pourras tester avant d'faire pareil sur ton vrai fichier) :
si t'es dans une entreprise de transport avec plusieurs centaines de chauffeurs routiers, cette optimisation vaut le coup, pas vrai ?
c'était des infos supplémentaires de ton SAV gratuit.
dhany