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)

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. j'ai compris d'où ça vient : ce n'est pas à cause du code VBA, mais à cause des colonnes "Point Actuel" ; je n'avais pas remarqué qu'au lieu de valeurs saisies, c'est des formules ; et ces formules ne conviennent pas ; exemple : feuille "Semaine 2", en C5 :

=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 ! une 1ère solution serait de supprimer toutes ces formules et d'faire par macro un copier / coller valeurs de la colonne "Total Points" d'une semaine donnée sur la suivante ; voici une 2ème solution par formules :

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

Super merci beaucoup 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 ! (et cette fois, c'est pas des formules : les nombres sont bien des valeurs ! )

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 et ta disponibilité

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 doublonen 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

Rechercher des sujets similaires à "trier tableaux"