Trie croissant en ligne

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.

20fichier-forum.xlsm (10.83 Ko)

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?

A+

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

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.

5fichier-forum.xlsm (12.04 Ko)

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.

A+

7fichier-forum.xlsm (22.76 Ko)

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.

@ +

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!?

A+

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.

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

Merci.

@ +

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!

A+

Salut curulis57,

Non non, je ne le dirais pas, promis.

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.

@+

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]?

A+

14fichier-forum.xlsm (27.43 Ko)

Salut Curulis57,

Merci beaucoup pour tout le travail que tu as fait. Ca à l'air de fonctionner parfaitement!!

Je vais essayer de l'adapter a mon programme et je reviens vers toi pour te dire si ça fonctionne.

Le format de cellule GREC me sert à visualiser les "0" lorsqu'on écrit un nombre commençant par un ou plusieurs "0".

Si tu prends le fichier que tu m'as renvoyé, tu saisis en C1 "Test" puis tu essayes de saisir ensuite la valeur "00087658", va s'afficher alors "87658". Le format grec et la seule parade que j'ai trouvé pour afficher le nombre en entier.

En tout cas merci encore pour ton aide.

Je reviens vers toi très vite.

Bonne soirée.

@ +

Salut Curulis57,

Désolé d'avoir été si long pour le retour, mais j'ai essayer d'adpter ton code au miens, mais sans grand succès....

J'ai un problème que je n'arrive pas à regler. Je fais les modifications des données par des userform que j'ai importer dans le fichier forum pour bien te faire comprendre mon soucis.

Les dates s'inversent toutes seules au niveau des jours et des mois.

Exemple:

Les modifications suivantes vont se faire sur la dernière ligne du tableau. Celle qui comprend la valeur "72565304" en colonne B

Si tu clic sur le bouton "Modif. Stock", dans l'userform qui apparait, tu double clic sur la ligne comprenant "TEST 3", tu modifies la date "04/03/2017" par "03/04/2017" dans l'userform qui vient de s'ouvrir puis tu clic sur "modifier la sortie". Tu peux ensuite cliquer sur "Fermer".

Sur la feuille "Stock" en "Sortie 4" tu peux voir que la date à bien été modifié en "03/04/2017". Jusqu'ici tout va bien donc.

Le problème est que si maintenant tu clic sur, par exemple, la date en "sortie 3", tu supprimes le 7 de 2017 puis tu le remets, ceci juste pour lancer ta macro de tri, tu verras que la date "03/04/2017" en "sorti 4" s'est inversé en "04/03/2017"

J'ai essayé pleins de chose, mais je n'arrive pas régler ce problème.

Pourrais tu m'aider encore une fois?

J'aurais également aimé que le tri s'effectue automatiquement sur la ligne qui comprend en colonne B la valeur écrite en "C1" lorsqu'on clic sur le bouton "Modif. Stock"

Je n'ai pas réussi à adapter ton code.

Désolé pour mon niveau plus que médiocre....

Merci.

@ +

Salut Cos81,

comme ceci, sans doute!?

Pour l'affichage des dates au format français, malgré le paramétrage du format des colonnes... il faut appliquer aux cellules le format "mm/dd/yyy"...

Complètement idiot, mais bon!

A+

Merci beaucoup Curulis57,

C'est exactement ce que je voulais. Par contre, je n'ai pas compris ou tu as fais la modification du format de date pour que ça ne s'inverse plus... Tu peux m'expliquer?

J'ai juste encore un problème lorsque je met en C1 la valeur "00087658". Je pense que ça doit être également un souci de format ou alors de variable à définir?

Merci encore pour ton aide qui m'est très précieuse sinon indispensable!!!

@ +

Salut Curulis57,

En regardant le code, j'ai effectivement trouvé l'endroit ou tu as fait la modification de format des cellules.

Désolé d'avoir répondu trop vite sans trop chercher. La solution de facilitée sans doute....

Comme tu dis, c'est vraiment idiot et incompréhensible le fait de devoir appliquer le format "mm/dd/yyyy" alors que dans la feuille de calcul le format est bien "dd/mm/yyyy".

J'ai appliquer ce format dans les autres lignes de mon code et ça fonctionne à merveille.

Mon seul problème reste pour les valeurs qui commencent par "0" comme par exemple "00087658" qui ne fonctionne pas.

Aurais tu une idée?

Merci d'avance.

@ +

Salut Cos81,

dans la Sub cmdGO_Click, mets ceci :

sData = CStr([C1])

Ici, ça va très bien, quelle que soit la valeur en [C1].

A+

Salut Curulis57,

J'ai bien essayer de rajouter Cstr, mais sans succès. J'ai tout de même fini par trouver la solution.

En fait, j'avais changé

sData = CStr([C1])

en

sData = Sheets("Recherche").Range("cel_symbole")

J'ai juste rajouter ".text" derrière et ca fonctionne.

Ouf! Ton code fonctionne parfaitement et j'ai réussi à adapter selon mon besoin.

Je classe donc le sujet en résolu, et te remercie encore beaucoup pour ton aide.

Bonne continuation à toi.

@ +

Rechercher des sujets similaires à "trie croissant ligne"