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:=xlSortNormalpour mettre ensuite dans une variable tableau
Set pl = Range(plage)
tabl = pl.Valuesi 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 TRIELe 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:=xlSortNormalremplace
Header:=xlYespar
Header:=xlNopour 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