Trie croissant en ligne Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
c
cos81
Membre habitué
Membre habitué
Messages : 146
Inscrit le : 25 avril 2013
Version d'Excel : 2007+

Message par cos81 » 19 octobre 2017, 06:36

Bonjour à tous,


Ci joint un fichier de gestion de stock dans lequel j'aimerais faire un tri en ligne de la date la plus récente a la plus ancienne.
Les dates sont placées toutes les 5 colonnes à partir de la colonne H. Il faudrait donc faire un tri par 5 colonnes.
Il peut également y avoir des vides (5 colonnes vide) qu'ils faudrait supprimer, mais normalement, en faisant un tri, le problème de vide devrait être réglé.

En gros, il faudrait que la macro analyse a partir de la colonne H et toutes les 5 colonnes (step5) jusqu'a la dernière colonne vide.
On lance ensuite un tri des dates de la plus récentes qui devra être en colonne H jusqu'a la moins récente.
Il faudra faire ceci pour toutes les lignes du fichiers. (de la ligne 7 jusqu'a la dernière ligne).


Je précise que le tableau ne peut pas être fait dans l'autre sens. Le fichier joint est un extrait de mon fichier original qui comprend énormément de ligne.

Merci d'avance pour votre aide.
Fichier Forum.xlsm
(10.83 Kio) Téléchargé 8 fois
Avatar du membre
curulis57
Passionné d'Excel
Passionné d'Excel
Messages : 3'747
Appréciations reçues : 226
Inscrit le : 4 janvier 2016
Version d'Excel : 2016 FR / 2019 FR

Message par curulis57 » 19 octobre 2017, 07:23

Salut Cos81,

qu'on se comprenne bien :

- les "groupes" de 5 colonnes doivent être triées séparément : date la plus récente en haut ;
- les "groupes" de 5 colonnes doivent aussi être triés entre eux, cette fois : le groupe ayant la date du haut la plus récente doit être en [H:H] -> Sortie 3 , 2, 1, 4 ? L'en-tête doit suivre ou garde-t-il l'ordre logique (1, 2, 3, 4)?
- perso, j'appelle plutôt ça un tri décroissant!

Ai-je compris ou dois-je aller dans le coin avec le bonnet d'âne?

:lol:
A+
c
cos81
Membre habitué
Membre habitué
Messages : 146
Inscrit le : 25 avril 2013
Version d'Excel : 2007+

Message par cos81 » 19 octobre 2017, 17:29

Salut Curulis57,

Merci pour l’intérêt que tu portes à mon sujet.

Non non, pas besoin de bonnet d’âne, j'avoue que j'ai du mal à expliquer ce que je veux... :lol:

En fait, ce n'est que les lignes qui doivent être triées. Tu peux voir en ligne 5 les sorties. (Sorties 1, Sorties 2.....) chaque sorties comportent en première colonne des dates. (Colonne H, M, R.....) Ce sont ces dates la que je voudrait trier de la plus récente à la plus ancienne.
Toutes les données dans une plage sortie doivent rester ensemble.

En exemple, si on prend la ligne 9, il faudrait que la plage de sortie 2 (ligne 9) se retrouve en sortie 1 (ligne 9) car la date de la sortie 2 est plus récente que la sortie 2. Il faudrait adapter ça a toutes les lignes du fichier.

Je sais pas si c'est beaucoup plus clair. Si ce n'est pas le cas, je peux joindre le même fichier avec le résultat attendu.

Merci encore et désolé pour l'explication pas très explicite...

@ +

Re,

Je viens de rajouter un onglet "résultat attendu" pour mieux montrer ce que j'aimerai obtenir.

Merci.
Fichier Forum.xlsm
(12.04 Kio) Téléchargé 5 fois
Avatar du membre
curulis57
Passionné d'Excel
Passionné d'Excel
Messages : 3'747
Appréciations reçues : 226
Inscrit le : 4 janvier 2016
Version d'Excel : 2016 FR / 2019 FR

Message par curulis57 » 20 octobre 2017, 14:53

Salut Cos81,

voilà ton fichier.
- un événement Worksheet_Change() qui te trie cette seule ligne au moindre changement dans une colonne Date ;
- un double-clic sur la cellule 'Sortie 1' pour trier toute la série d'un coup ;
- une sortie sans date est considérée comme nulle et rejetée tout à droite du tri.
Public Sub ChronoLine(ByVal iRow As Integer)
'
iCol = Cells(6, Columns.Count).End(xlToLeft).Column - 4
For x = 8 To iCol Step 5
    For y = 8 To iCol - 5 Step 5
        If Cells(iRow, y + 5) > Cells(iRow, y) Or Cells(iRow, y) = "" Then
            sCol1 = Split(Columns(y + 5).Address(ColumnAbsolute:=False), ":")(1)
            sCol2 = Split(Columns(y).Address(ColumnAbsolute:=False), ":")(1)
            Range("M4:Q4").Value = Range(sCol2 & iRow).Resize(1, 5).Value
            Range(sCol2 & iRow).Resize(1, 5).Value = Range(sCol1 & iRow).Resize(1, 5).Value
            Range(sCol1 & iRow).Resize(1, 5).Value = Range("M4:Q4").Value
        End If
    Next
Next
Range("M4:Q4").Value = ""
'
End Sub
A tester, comme on dit, grandeur nature.

:btres:

:D
A+
Fichier Forum.xlsm
(22.76 Kio) Téléchargé 7 fois
c
cos81
Membre habitué
Membre habitué
Messages : 146
Inscrit le : 25 avril 2013
Version d'Excel : 2007+

Message par cos81 » 20 octobre 2017, 16:31

Bonjour Curulis57,

Merci beaucoup pour ton aide.
J'ai juste quelques problème, lorsque je change une date, on obtient exactement ce que je veux. Le seul problème est que dans mon fichier d'origine il y à beaucoup plus de sorties hors en regardant ton code, que je n'ai pas trop compris, je vois que tu as demandé un tri uniquement jusqu'à la colonne "W7". (Sortie 4). Si on ajoute une sortie 5 elle n'est pas prise en compte.
C'est vrai que je ne l'avais pas précisé mais serait il possible d'y remédier?
Lorsque je double clic sur sortie 1, chez moi rien ne se passe, mais ce n'est pas grave car le code dans "Worksheet_Change" me va tout a fait. Sauf pour le point cité au dessus.

Je vais être pénible, mais serait il possible de créer un bouton qui lorsqu'on clic dessus, va chercher la valeur saisie dans la case C1 ("Test" par exemple), dans le tableau puis une fois trouvé, fais le trie dans cette ligne?
J'essaye encore de comprendre le code, mais j'avoue que j'ai du mal....

Je te remercie encore.

@ +
Avatar du membre
curulis57
Passionné d'Excel
Passionné d'Excel
Messages : 3'747
Appréciations reçues : 226
Inscrit le : 4 janvier 2016
Version d'Excel : 2016 FR / 2019 FR

Message par curulis57 » 20 octobre 2017, 17:42

Salut Cos81,

j'avais prévu mais, comme il y a toujours du lait sur le feu ici, j'avais oublié de changer dans cette sub()...
Private Sub Worksheet_Change(ByVal Target As Range)
'
Dim iRow As Integer
'
Application.EnableEvents = False
Application.ScreenUpdating = False
'
If Not Intersect(Target, Range("H7:ZZ" & Rows.Count)) Is Nothing Then
    If Target.Column Mod 5 = 3 Then
        iRow = Target.Row
        Call ChronoLine(iRow)
    End If
End If
'
Application.ScreenUpdating = True
Application.EnableEvents = True
'
End Sub
Le double-clic fonctionne très bien, ici!
Petits détails :
- comme, je suppose, je ne bénéficie pas de l'environnement complet, je postule pour que le calcule démarre que la ligne 6 est complétée jusqu'à hauteur de la 5e colonne de la dernière sortie encodée, même si celle-ci se trouve en ligne 36.000 ;
- que la colonne A est complétée jusqu'à hauteur de la dernière ligne encodée ;
- si je peux être certain que les 5 colonnes de chaque sortie encodée de chaque ligne sont complètes, je pourrais alors calculer précisément la longueur de chaque ligne mais cela ne ferait rien gagner comme temps.

Pas compris ta deuxième demande :
- qu'y a-t-il en [C1] ?
- ta valeur 'Test' : c'est un nombre? Pourquoi un bouton, alors? Valider et c'est parti!?

:wink:
A+
c
cos81
Membre habitué
Membre habitué
Messages : 146
Inscrit le : 25 avril 2013
Version d'Excel : 2007+

Message par cos81 » 21 octobre 2017, 11:13

Salut Curulis57,

C'est bizarre, j'ai essayé le double clic sur un autre PC, mais ça ne fonctionne pas non plus. Mais comme dit, ce n'est pas important car ça ne me servira pas dans mon programme d'origine.

Effectivement, je t'ai envoyé un petit extrait de mon programme. L'original étant trop volumineux et contenant des données de mon entreprise, je n'ai pas pu le mettre sur le forum.

Pour répondre à ta question, les 5 colonnes de chaque sortie encodée de chaque ligne ne sont pas forcement complètes. Par contre, il y a obligatoirement une date. On pourrait donc uniquement vérifier les premières colonnes de chaque sorties.

Je vais essayer de t'expliquer un peu mieux mon programme original.

Dans le programme originale, j'ai un userform qui me permet de trouver une référence ce trouvant dans la colonne B.
Je saisie le mot que je souhaite trouver dans un champ de saisie, je clic sur le bouton rechercher, s'affiche alors tout les résultats contenant le mot recherché. Lorsque je double clic sur la référence voulu, je peux voir apparaitre dans un autre userform tout le détail contenu sur le fichier que je t'ai envoyé. Je peux donc voir toutes les sorties pour un article défini.
Mon problème est que, l'opérateur peux modifier les dates ou supprimer des sorties, ce qui fait que j'ai des lignes vide qui apparaissent et l'ordre décroissant des dates n'est plus forcément juste.

Donc, quand je te parle de la valeur se trouvant en C1, ça serait en réalité ce que je recherche dans la colonne B dans mon fichier original. La valeur "Test", c'est la valeur que j'ai pris en exemple.
Par exemple, si on saisie en C1 la valeur "test", puis qu'on clic sur un bouton nommé par exemple "Rechercher", une recherche serait lancée sur la colonne B. Étant donné que sur la ligne 10 en colonne B se trouve la valeur "Test", le tri se ferait sur cette ligne. (Suppression des sorties vide et classement des dates par ordre décroissant.

Sur mon fichier originale, je l'adapterait pour que lorsque je double clic sur une référence recherché, le tri se fasse directement. J’intégrerai également le tri dès qu'un opérateur ajoutera ou modifia une sorties. Mais ça, ça sera mon JOB. :D

J’espère que c'est plus clair pour toi.

Merci.

@ +
Avatar du membre
curulis57
Passionné d'Excel
Passionné d'Excel
Messages : 3'747
Appréciations reçues : 226
Inscrit le : 4 janvier 2016
Version d'Excel : 2016 FR / 2019 FR

Message par curulis57 » 21 octobre 2017, 22:46

Salut Cos81,

puis-je savoir quelle genre de données on peut trouver dans [B:B]? Entiers longs, string...
Et ne me dis pas que ça n'a pas d'importance, stp!

:wink:
A+
c
cos81
Membre habitué
Membre habitué
Messages : 146
Inscrit le : 25 avril 2013
Version d'Excel : 2007+

Message par cos81 » 22 octobre 2017, 10:43

Salut curulis57,

Non non, je ne le dirais pas, promis. :D
On cherche en B:B toujours des valeurs de 8 caractère qui peuvent être composé de chiffre, mais également de lettre.
Je précise que ces valeurs peuvent commencer par 0.
Exemple: 0956XX67 ou 09564531 ou 79621234

Voilà, j'espère que ma réponse te convient.

Bon dimanche.

@+
Avatar du membre
curulis57
Passionné d'Excel
Passionné d'Excel
Messages : 3'747
Appréciations reçues : 226
Inscrit le : 4 janvier 2016
Version d'Excel : 2016 FR / 2019 FR

Message par curulis57 » 23 octobre 2017, 17:09

Salut Cos81,

à tester.
J'ai programmé le Double-Clic sur les références de [B:B].

C'est quoi ce format de cellule GREC en [B:B]?

:D
A+
Fichier Forum.xlsm
(27.43 Kio) Téléchargé 13 fois
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message