Tri d'un tableau de valeurs - VBA

Bonjour à tous,

Je lutte depuis quelques temps pour mettre au point un code sur VBA, pour trier un tableau de valeurs, je m'explique:

Dans un tableau ou j'ai 6 colonnes (dans l'ordre : référence, désignation, unité, date, prix, quantité) et un nombre de ligne variable non défini, j'aurais besoin :

- extraire dans un tableau de valeurs 2D à 3 colonnes VBA (et non sur une feuille) les dates, les prix et les quantités des lignes dont la référence à été tapée dans la Textbox d'un userform

En d'autres termes:

avec une boucle do while pour recherche tant que la référence du tableau différente de " "

dès que la valeur de référence de Textbox1 = Valeur de référence de la ligne du tableau de recherche

--> Tab(i , 1) = date Tab(i , 2)=prix Tab(i , 3)=quantité (Pour la iéme valeur trouvée et colonne 1,2 et 3)

-Trier les valeurs de ce tableau extrait en fonction de la date, dans l'ordre croissant

En d'autres termes :

Pour un tableau

01/02/2015 20.5 80

01/01/2015 20 150

03/01/2015 19 200

On obtiendra

01/01/2015 20 150

03/01/2015 19 200

01/02/2015 20.5 80

Je n'ai jamais utilisé de tableaux et encore moins trié dans un code... j'ai fait quelques recherches sur le net mais a part les fonctions Quicksort et Shellsort (que j'ai essayées en vain), je rame depuis pas mal de jours, ne serait-ce que pour définir les dimensions de mon tableau virtuel. J'espère avoir été assez clair en tout cas, sinon n'hesitez pas à me questionner

Si quelqu'un peut m'aider? Ou du moins m'aider sur la structure du code à adopter et les fonctions à utiliser

Je vous en remercie d'avance

Bonjour

j'ai jamais vu de tri par date sur une variable tableau .... puisque ce que j'ai vu il ne peut y avoir de doublons dans le tri.... donc pour une date cela va être difficile je pense

par contre on peut tres bien le faire sur des cellules temporaires et les mettre ensuite dans une variable tableau....

je ne sais pas si cela peut t'aider mais :

pour faire le tri une fois copier dans une feuille temporaire

Range(plage).Sort Key1:=[A1], Order1:=xlascending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

pour mettre ensuite dans une variable tableau

Set pl = Range(plage)
tabl = pl.Value

si tu veux plus d'aide faudra mettre un fichier a dispo

fred

Oui tout à fait ! J'avais pensé à cette option

Et merci beaucoup de ta contribution en passant, je me penche dès à présent sur ton code...

Il n'est pas possible sinon de traiter les dates comme des chiffre? par exemple je sais que le jour 01/01/2015 équivaut au nombre 42005, le 02/01/2015 au 42006, etc... Ca permettrait de les trier non?

Je joint mon classeur xls, mais quelques précisions: je demande ce code pcq je suis en train de travailler sur une gestion des stock de type FIFO/PEPS (premier entré premier sorti). Je posterai la version finale du fichier.. j'ai remarqué que pas mal en cherche sur internet, ca peut toujours servir

Le code que je demande dans ce poste se trouve dans le code de l'userform "saisie"

Enfin, jette y un coup d'oeil... et si il y a des incohérences, ou des questions je suis preneur de toute remarque

Bonjour le forum,

AnthonyS a écrit :

je demande ce code pcq je suis en train de travailler sur une gestion des stock de type FIFO/PEPS (premier entré premier sorti). Je posterai la version finale du fichier.. j'ai remarqué que pas mal en cherche sur internet, ca peut toujours servir

Excellente idée.

Avec un tableur, il est aisé de programmer la valorisation des sorties avec les méthodes CUMP (après chaque entrée, ou à la fin d'une période).

Par contre, je n'ai jamais trouvé (toujours avec un tableur) cette valorisation avec la méthode First In, First Out.

J'attends donc avec impatience et intérêt ta "version finale".

je viens de regarder rapidement ton fichier

il y a un truc qui ne va pas pour moi....

tu dis vouloir faire un tri par date en fonction d'un premier critère la référence choisies...

hors ton fichier aucune référence n'est en double, que cela soit dans commande ou stock... a moins que j'ai mal vu...

peut-être que c'est une prévision et que le fichier ne correspond pas a la demande initiale...

fred

edit :

pour revenir a ton problème de départ, je pense que le mieux c'est de faire un filtre avancé qui copie les données en fonction de la référence choisie sur une feuille/fichier, voir

Plg.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Feuil1.Range("H1:H2"),CopyToRange:=ActiveWorkbook.Sheets(1).Range("A1:C1")

voir le post ou je traite de cela : https://forum.excel-pratique.com/excel/macro-vba-creation-d-autant-de-fichiers-qu-il-y-a-des-code-t63202.html?hilit=clin

puis faire un tri par date (donner ci dessus)

et enfin mettre dans ta variable tableau... donner ci dessus

mais peut etre auront d'autre idées...

fred

Oui il n'y a pas de doublons pour la simple et bonne raison que je n'en ai pas rentré ^^

En fait les commandes de produits qui sont déjà rentrées sont juste là pour tester les codes déjà écris, mais il sera tout à fait possible à l'avenir que plusieurs commandes d'un même produit soient faites à des dates différentes, voir même à la même date (dans ce cas on prendrais arbitrairement le prix le plus faible, ou la quantitée la plus faible en stock selon moi...).

Je vais potasser ca cet après midi pour ta proposition sur mon problème initial, merci encore ! Je tiens au courant de l'avancement de toute manière et reste ouvert à toute autre proposition.

Et oui mbbp ! Le but c'est aussi de mettre à disposition un outil de gestion des stock FIFO assez simple pour tout le monde, donc ne traiter que de la base du programme, que chacun pourra ensuite accomoder à sa manière. Tout commentaire ou conseil est bon à prendre.

Bonjour

regarde ici j'ai refait hier un filtre avancé sur un nouvel onglet qui est supprimer à la fin... si cela peut t'aider a comprendre mieux les filtres avancés

fred

https://forum.excel-pratique.com/excel/fasture-en-masse-t66299-10.html

Salut,

j'ai regardé ton code... je m'en suis inspiré, si tu peux me dire ce que tu en penses...

Merci encore

Dim feuil As Worksheet
Dim plg As Range
Dim tabl() As Integer      ' tableau 2D colonne1 date colonne2 prix colonne3 quantité
Dim r As Integer
Dim i As Integer
Dim k As Integer
k = 2                       ' pour recherche à partir de la 2ème ligne
r = TextBox1.Value
i = 1                       'à partir de la valeur 1

Sheets.Add 
Set feuil = ActiveSheet
Do Until Sheets("stock").Cells(k, 1) = ""

    If Sheets("stock").Cells(k, 1) = r Then             'pour les articles du stock de meme reference

     feuil.Cells(i, 1) = Sheets("stock").Cells(k, 4).Value       'Création d'une colonne des dates dans feuil temporaire
     feuil.Cells(i, 2) = Sheets("stock").Cells(k, 5).Value       'Création d'une colonne des prix dans feuil temporaire
     feuil.Cells(i, 3) = Sheets("stock").Cells(k, 6).Value       'Création d'une colonne des quantités dans feuil temporaire
     i = i + 1
  End If
k = k + 1
Loop

'TRI DU TABLEAU PAR DATE DU PLUS ANCIEN AU PLUS RECENT

Range("A:C").Sort Key1:=[A1], Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
Set plg = Range("A:C")
tabl = plg.Value
feuil.Delete

'UTILISATION DU TABLEAU TRIE

Le problème qui survient c'est que dans le tri de la feuille temporaire, tout se tri normalement hors mis la 1ère ligne, elle reste à sa place....

Le code que tu m'as donné au début ne correspondait pas plutôt au tri d'un tableau avec une 1ère ligne avec la légende et sans valeur?

Ensuite le code me marque une erreur au niveau du transfert des données au tableau tabl() ...

oui deux chose

pour le tri sans "entete"

Range("A:C").Sort Key1:=[A1], Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

remplace

Header:=xlYes

par

Header:=xlNo

pour l'erreur un tableau doit etre déclarer en variant et non pas en integer

fred

Okeyy ! C'est Parfait !

J'ai plus qu'à rebasculer mes valeurs du tableau sur ma feuille de sortie

Merci beaucoup

Dans ce cas

merci

fred

Oui tout à fait,

Et je posterai mon fichier une fois finalisé

Dernière question :

Il y a une solution pour fermer automatiquement la feuille temporaire sans avoir le message de "Les feuilles sélectionnées contiennent des données, voulez vous vraiment les supprimer"?

Edit :

J'ai trouvé, il suffit de mettre "Application.DisplayAlerts = False " avant la suppression de feuille, et "Application.DisplayAlerts = True" après

voilà tu as trouvé tout seul...

a+

fred

Rechercher des sujets similaires à "tri tableau valeurs vba"