Classement automatique de valeurs

Bonjour,

Je veux classer par ordre décroissant, automatiquement, les parties d'un tableau.

Si les valeurs changent, je veux que ça reste classé.

Tout est expliqué dans le fichier joint.

Merci par avance

21classeur1.zip (6.69 Ko)

Bonsoir jaco, le forum,

Voici ce que je vous propose en VBA.

A+

35classeur1-v1.xlsm (26.31 Ko)

Bonjour,

Voici une solution.

Par contre, elle ne gère pas les doublons.

À vous de voir de quelle façon vous voulez classer les doublons.

J'ai simplement mis une MFC pour qu'on voit les doublons.

Merci

21forum.xlsx (16.77 Ko)

Bonsoir,

Tes plages de données nommées Data1 et Data2 (voir gestionnaire de noms).

Une évènementielle qui réagit à un changement de valeur dans l'une ou l'autre des plages de données et en effectue le tri...

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Data As Range
    If Not Intersect(Target, [Data1]) Is Nothing Then
        Set Data = [Data1]
    ElseIf Not Intersect(Target, [Data2]) Is Nothing Then
        Set Data = [Data2]
    End If
    If Not Data Is Nothing Then
        Application.EnableEvents = False
        With Data
            .Sort key1:=.Cells(1, 2), order1:=xlDescending, key2:=.Cells(1, 1), _
              order2:=xlAscending, Header:=xlNo
        End With
        Application.EnableEvents = True
    End If
End Sub

Pour tester, il te suffit revalider une valeur dans une des plages de données, elle sera triée, puis dans l'autre et elle sera également triée, et si tu modifies des valeurs, le tri sera à chaque fois refait.

Cordialement.

37jaco-classeur1.zip (11.75 Ko)

Bonjour MFerrand,

Tes plages de données nommées Data1 et Data2 (voir gestionnaire de noms).

Une évènementielle qui réagit à un changement de valeur dans l'une ou l'autre des plages de données et en effectue le tri...

Qu'est ce qui n'allait pas dans "mon premier grand code VBA" sans utiliser le gestionnaire de noms?

Il fonctionne très bien pourtant dans les plages "I2:J4" et "I6:J12".

Bien à vous.

Bonjour mdo100,

D'abord, tu appliques un tri sur l'illustration du résultat souhaité, la demande étant que cela s'applique sur les données.

Ensuite tu utilises la méthode Worksheet.Sort, code enregistré, en reprenant tous les paramètres par défaut... méthode qui ne présente aucun avantage dans plus de 99% des cas, qui ne fait que révéler l'utilisation de code enregistré reproduit sans discrimination.

La méthode Range.Sort est nettement plus simple, efficace, et s'écrit généralement en une ligne... Pourquoi l'enregistreur privilégie une autre méthode, ça c'est un mystère relevant de la volonté de Microsoft dont j'ignore les raisons...

Enfin, des plages de données destinées à alimenter des graphiques sont en général bien circonscrites et il est avantageux de les nommer. Il y en a deux dans l'exemple mais on peut en ajouter d'autres sans modifier le fonctionnement. Lors de l'exécution de la procédure Change, on peut alors opérer en 2 temps : tester la plage modifiée (si l'une ou l'autre l'a été, et il ne peut y en avoir qu'une en même temps qui a déclenché l'exécution), on l'affecte alors à une variable ; 2e temps, si la variable a reçu une affectation on trie la plage concernée (en interrompant les évènements le temps du tri car il n'est pas nécessaire de relancer l'exécution sur cette modification).

Jaco peut ainsi disposer d'un code facile à comprendre et à adapter à diverses situations, qui répond à ce qu'il souhaitait faire... (et qui ne relève d'aucun enregistrement )

Cordialement.

Re MFerrand,

Pas facile de rivaliser avec vos compétences, je comprends que mon code est laborieux et drôlement tordu, mais il y a quelques mois de cela je n'avais jamais fait un ch'ti bout de VBA et à 50 ans c'est pas facile de s'y mettre.

D'abord, tu appliques un tri sur l'illustration du résultat souhaité, la demande étant que cela s'applique sur les données.

C'était volontaire, il est vrai que j'aurai du ou pu le mettre sur le premier tableau, ça c'est une mauvaise interprétation du problème posé.

Pour le reste, je reconnais que votre solution est bien meilleure que la mienne et c'est vrai qu'en nommant les plages cela offre d'autres possibilités, je comprends mieux après vos explications.

J'apprends, j'apprends et je retiendrai autant que possible cette leçon particulière, mais je ne saurai jamais à votre niveau ou au niveau d'autre que vous dont je vois la réactivité et la précision.

Mais j'étais plutôt content de moi , j'essai d'être dans la participation et pas seulement dans la demande.

Bon week-end à vous.

Je t'engage à poursuivre sur ta lancée... C'est en persévérant que l'on progresse. Et de toutes façons, il y a toujours quelque chose à apprendre...

Pratiquant VBA depuis son introduction avec Excel 5, je ne peux prétendre cependant tout connaître et je continue à apprendre... Ce que j'essaie de faire comprendre dans mes critiques c'est que l'enregistreur ne permet pas de progresser, car en ne reproduisant que les manipulations de l'utilisateur, les outils propres à VB en sont absents, or ce sont eux qui permettent de structurer le code et de l'optimiser pour qu'il s'exécute de façon plus fluide et rapide...

Il peut être intéressant de passer au crible dans les moindres détails quelques macros enregistrées, pour arriver à voir tout ce qu'on peut en éliminer (et qui ralentit l'exécution car ce sont souvent des éléments parasites).

Il est souhaitable ensuite de se concentrer, sur les variables, leur portée, les boucles, les tableaux, les instructions spécifiques... tous éléments qui permettront d'utiliser au mieux VBA. Ça vient à l'usage...

C'était plus simple sans doute d'appréhender les éléments existants lorsque j'ai débuté... depuis ça s'est un peu complexifié... mais le rôle que peuvent jouer les 'anciens' est de permettre aux néophytes de progresser plus vite qu'eux-mêmes n'ontpu le faire autrefois...

Cordialement.

Merci MFerrand pour ta réponse.

Cela fonction fonctionne très bien sur ton fichier, mais comme je débute en VBA, je ne sais pas comment l'adapter à mon vrai fichier.

Est-ce qu'il faut que je remplace [data1] et [data2] par la sélection de mes cellules.

Merci

Je te conseille plutôt de nommer ta sélection de cellules (la plage de données destinée à alimenter un graphique et qui doit être triée), cela simplifie grandement l'écriture.

Tu peux en ajouter... Dans la macro, il te suffit d'introduire autant de ElseIf... que tu mets de plages nouvelles (dans la première partie de la macro), avec la même commande : affecter la plage concernée à la variable si le test est positif.

La 2e partie, fonctionnant avec la variable n'a pas besoin d'être modifiée.

Cordialement.

Merci pour cette réponse rapide.

J'arrive bien à définir un nom pour un groupe de cellule.

J'ai remplacé [data1] et [dataé] par [zone1] et [zone2].

Dans ton exemple, je ne sais pas comment visualiser les cases qui correspondent à [data1] et [data2]

Lorsque je trace la figure, elle ne se classe pas par ordre croissant.

Dans mon fichier, j'ai plusieurs onglet, en faisant "alt+f11", je fais apparaître la fenêtre des macros.

Et, si j'ai bien compris, je dois mettre le script sur la feuille correspondante. Mais à mon tableau de données? ou à mon graphique?, qui ne sont pas sur le même onglet.

Et ensuite, comment je fais pour que mon scipt soit pris en compte?

Depuis le graphique, clic droit "affecter une macro", dans ce cas je dois choisir une macro sauvergardée, mais je n'ai pas l'impression que tu as fait comme cela.

Désolé pour ces questions triviales, mais je ne connait pas VBA

Les plages, une fois nommées, elles restent nommées, tu utilises le nom...

La macro est une évènementielle, liée à l'évènement 'Change' de la feuille qui contient les données. Elle doit être placée sur le module de cette feuille, et déclarée :

Private Sub Worksheet_Change(ByVal Target As Range)

Cette instruction de déclaration de procédure (le reste de la macro suit cette ligne, et la proc. se termine par End Sub) indique qu'elle sera lancée automatiquement lorsqu'un changement de valeur de cellule intervient dans la feuille ; elle va alors tester où se situe le changement et si celui-ci concerne l'une des plages surveillées elle va exécuter le code qui opère un tri de cette plage selon les nouvelles valeurs. Si le changement ne concerne pas une plage suveillées, elle ne fait rien.

J'ai compris pourquoi mon tableau ne fonctionnait pas.

J'ai remis un fichier.

Les résultats proviennent d'autres cellules (d'un comptage de jours par exemple) et en plus j'ai le même nom de ligne pour plusieurs colonnes.

Est-il toujours possible de faire ce que je veux ?

11jaco-classeur2.zip (11.60 Ko)

Mets-toi d'accord sur un modèle fonctionnel qu'on puisse interpréter sans ambiguïté...

Je vais faire un onglet par catégorie, je me retrouve donc avec des tableaux à 2 colonnes.

Dans mon fichier joint, j'ai mis 2 tableaux, un qui calcul le nombre de jour, et l'autre avec des chiffres, mis la macro ne fonctionne pour aucun des 2, le classement ne se fait plus, et je ne comprends pas pourquoi.

Il me faut un tableau, qui calcul le nombre de jour (la formule fonctionne), et qui réaliser un tri croissant (tableau de gauche).

Merci MFerrand pour tes réponses

16jaco-classeur2.zip (11.50 Ko)

Bonjour jaco, MFerrand, toutes et tous,

À quoi correspond A,B,C colonne "B & C" ?, c'est toujours pas très clair !

MFerrand te fera un code aux petits oignons dès que tu sauras exactement ce que tu veux !

Et puis ce n'est pas comme si quelqu'un d'autre t'avais aussi fait une proposition, même si le code n'était pas parfait.

Allez, oublie les autres contributeurs, pour ne t'adresser qu'à une personne sur ce forum!

Cordialement.

Je ne veux vexer personne, mais c'est juste que comme je débute en VBA, et que j'ai à peu près compris comment fonctionne la macro de MFerrand, pour l'adapter à mon vrai tableau, je voulais continuer dans la ligné.

A, B, C correspondent à d'autres données fonctionnant sur le même principe que les jours de la semaine. C'est juste pour monter que j'ai un tableau assez long, mais avec des données différentes.

mdo100, j'ai regardé le tableau que tu as mis sur le forum. si je programme les cases pour qu'elles reprennent les valeurs d'autres cellules, cela ne fonctionne plus.

Bonjour,

Bien sûr que des modifications de valeurs liées au recalcul de formules ne constituent pas un changement de valeurs de cellules !

Il est indispensable que ton classeur modèle reflète exactement ton organisation !

On ne peut pas travailler avec des renvois d'erreurs non plus !

Et ta formule qui subsiste est déjà à revoir !

Et il faut savoir ce qui est sur la même feuille et ce qui est ailleurs !

Tu ne peux avoir de solution adaptée à ton cas en soumettant un cas qui n'y correspond pas exactement !

Cordialement.

ci-joint, le vrai tableau.

13classeur3.xlsm (45.99 Ko)

On y voit plus clair !

Donc les modification susceptibles d'intervenir proviennent de modifications dans ta base de données.

Il n'est pas vraiment intéressant de coupler une mise à jour avec des modifications dans la base.

Il est plus rationnel d'opérer un recalcul complet au moment opportun !

Quel est le moment opportun ?

On pourrait penser que ce pourrait être lors de l'activation de la feuille concernée, mais en fait ces données alimentent des graphiques et ce serait plutôt lors de l'activation de la feuille contenant les graphiques qu'il faudrait mettre à jour (retrier) les données...

La feuille graphiques étant absente de ce dernier fichier, peux-tu préciser ce point ?

(On procèderait alors à un tri général lors de l'activation de cette feuilles contenant les graphiques.)

Cordialement.

Rechercher des sujets similaires à "classement automatique valeurs"