Classement automatique de valeurs Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
j
jaco
Membre habitué
Membre habitué
Messages : 149
Inscrit le : 22 juillet 2016
Version d'Excel : 2007 FR

Message par jaco » 22 juillet 2016, 17:01

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
Classeur1.xls
(40 Kio) Téléchargé 15 fois
m
mdo100
Membre dévoué
Membre dévoué
Messages : 881
Appréciations reçues : 37
Inscrit le : 25 mai 2013
Version d'Excel : 2010 FR

Message par mdo100 » 22 juillet 2016, 20:55

Bonsoir jaco, le forum,

Voici ce que je vous propose en VBA.

A+
Classeur1 V1.xlsm
(26.31 Kio) Téléchargé 24 fois
b
benibeno
Membre habitué
Membre habitué
Messages : 111
Inscrit le : 20 juillet 2016
Version d'Excel : 2016

Message par benibeno » 22 juillet 2016, 21:08

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
forum.xlsx
(16.77 Kio) Téléchargé 15 fois
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'201
Appréciations reçues : 445
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 22 juillet 2016, 23:47

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.
Jaco_Classeur1.xls
(52.5 Kio) Téléchargé 26 fois
m
mdo100
Membre dévoué
Membre dévoué
Messages : 881
Appréciations reçues : 37
Inscrit le : 25 mai 2013
Version d'Excel : 2010 FR

Message par mdo100 » 23 juillet 2016, 08:10

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 :roll: dans les plages "I2:J4" et "I6:J12".

Bien à vous.
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'201
Appréciations reçues : 445
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 23 juillet 2016, 12:43

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 :D )

Cordialement.
m
mdo100
Membre dévoué
Membre dévoué
Messages : 881
Appréciations reçues : 37
Inscrit le : 25 mai 2013
Version d'Excel : 2010 FR

Message par mdo100 » 23 juillet 2016, 13:41

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 :D , j'essai d'être dans la participation et pas seulement dans la demande.

Bon week-end à vous.
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'201
Appréciations reçues : 445
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 23 juillet 2016, 14:19

Je t'engage à poursuivre sur ta lancée... :D 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.
j
jaco
Membre habitué
Membre habitué
Messages : 149
Inscrit le : 22 juillet 2016
Version d'Excel : 2007 FR

Message par jaco » 25 juillet 2016, 13:56

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
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'201
Appréciations reçues : 445
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 25 juillet 2016, 14:05

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.
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message
  • Classement de valeurs
    par Vantury » 1 décembre 2017, 18:52 » dans Excel - VBA
    13 Réponses
    326 Vues
    Dernier message par Vantury
    2 décembre 2017, 16:31
  • Classement + affichage 3 valeurs
    par fizik » 18 mai 2019, 20:47 » dans Excel - VBA
    9 Réponses
    91 Vues
    Dernier message par Gli73
    19 mai 2019, 18:56
  • classement valeurs tableau
    par tutorbly » 5 décembre 2018, 10:29 » dans Calc
    2 Réponses
    1864 Vues
    Dernier message par Jean-Eric
    5 décembre 2018, 10:56
  • Classement automatique
    par jaco » 22 juillet 2016, 14:00 » dans Calc
    1 Réponses
    563 Vues
    Dernier message par Dan
    25 juillet 2016, 13:05
  • Classement automatique.
    par chti74 » 24 novembre 2014, 15:29 » dans Excel - VBA
    6 Réponses
    352 Vues
    Dernier message par chti74
    16 décembre 2014, 16:27
  • Classement automatique de données
    par Tacentaure » 10 juin 2018, 18:50 » dans Excel - VBA
    9 Réponses
    247 Vues
    Dernier message par dhany
    13 juin 2018, 14:18