[Catégorie modifiée VB6 -> VBA] sélectionner les lignes avec date max et date mi

Signaler
Messages postés
7
Date d'inscription
lundi 20 septembre 2010
Statut
Membre
Dernière intervention
24 mars 2020
-
Messages postés
79
Date d'inscription
mercredi 14 avril 2010
Statut
Membre
Dernière intervention
2 août 2014
-
Bonjour,
je débute en vba et je souhaiterais savoir si quelqu'un peut m'aider.
J'ai une liste avec plusieurs colonnes, en fait c'est un journal des achats.
Dans la colonne A, j'ai le code article, en colonne B leprix et en colonne C la date d'achat.
J'ai autant de ligne que de factures et tout ça pour tous mes articles (environ 5000)
je souhaite conserver pour chaque article, la ligne avec la date maximum et la ligne avec la date minimum.
En fait 2 lignes par article, afin de pouvoir faire ensuite un pourcentage d'augmentation par article.
Comment dois je faire ?
merci de votre aide

4 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut

2 lignes par article : C'est figé ou bien tu pourras un jour en avoir plus ?
Cela change la manière d'imaginer le programme.

Voilà ce qui me viendrait à l'esprit.
Supposons :
Colonne A : code article
Colonne B : prix
Colonne C : date
Colonne D : Pourcentage calculé (résultat de notre programme)
Seul le dernier code article aura un calcul (puisqu'on fera un seul calcul par code)

Puisque tu dois faire ce calcul pour chaque article, le mieux serait de :
- Faire un classement des tes données par article et en deuxième choix de classement, les dates.
Un enregistrement de macro pendant que tu le fais à la main te fournira le code.
- Parcourir toutes les cellules, du haut vers le bas.
Une simple boucle, grand classique du VBA :
Dim maCell As Range
For Each maCell In Range("A:A")
    ' le programme où maCell contriendra le code article
Next
- Détecter si le code article est le même que celui précédemment lu.
Pour cela, il suffit de comparer le contenu de maCell avec une variable aussi de type Range + mémoriser maCell dans cette variable avant de faire le prochain Next.
Il faudra juste penser à initialiser cette variable en désignant la cellule du premier code article de la liste avant de commencer.
Dans cette comparaison :
- Si la mémoire contient le même code article, tu ne fais rien, on passe à la ligne suivante
- Si la mémoire est différente, c'est que le code article change : il faut donc faire le calcul avec les données issues de :
* La variable mémoire qui correspondra à la première cellule d'un nouveau code article
* La cellule située au dessus de maCell (ligne précédente), qui correspond à la plus vieille donnée du code article.
Pour désigner les cellules autour de celle sur laquelle tu te trouves, il suffit d'utiliser .Offset
Exemples :
maCell.Offset(-1, 0).Value
te forunira le contenu de la cellule au dessus de maCell (ligne -1), dans la même colonne A (décalage 0)
maCell.Offset(-1, 1).Value
te forunira le contenu de la cellule au dessus de maCell (ligne -1), dans la même colonne B (décalage 1)

Il ne reste plus qu'à faire ton calcul et à le rentrer dans la colonne D de la ligne précédente.

Avec un peu de réflexion, je te laisse rassembler les morceaux et faire tes tests

Dernière astuce : le débogage pour suivre ce que fait ton programme :
- F9 sur une ligne de code
Le programme s'y arrêtera au prochain passage
Survole avec la souris tes variables pour visualiser leur contenu, ou va dans la fenêtre de debogage (Ctrl-G) et tape
? maVariable
pour qu'elle s'inscrive dans la fenêtre.
- F8 (VB6) ou F10 (.Net) pour avancer d'une ligne de code
- F5 pour continuer normalement

Vala
Jack, =fr MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Si tu as besoin de faire des calculs sur les dates, il te faudra calculer, par exemple, un nombre de jours ou de mois, utilise les fonctions liées aux dates :
DateDiff pour faire différence
DateAdd pour ajouter x jours (heure, mois, ...) à une date
Messages postés
7
Date d'inscription
lundi 20 septembre 2010
Statut
Membre
Dernière intervention
24 mars 2020

Merci bcp
Mes données sont extraites d'un logiciel de facturation, et donc je choisi la période d'extraction, au final je ne veux, donc prendre que 2 lignes, celle où la date est la plus ancienne et celle avec la date la plus récente, et calculer le pourcentage entre les 2.
Toutefois, parfois je n'ai qu'une ligne, car une seule commande sur la période, donc celles-ci je préfère les supprimer pour allèger mon tableau.

Sinon, j'avais commencer par faire un tri par code article, puis par date.

Ce qui me reste à faire, c'est supprimer les lignes entre les deux dates les plus et éventuellement celles qui sont uniques.

Je vais essayer ce que tu m'as dit, mais je suis super débutante, souvent j'utilise l'enregistreur pour des choses très simples.... donc je vais peut être avoir nouveau besoin d'aide
en tout cas merci
Messages postés
79
Date d'inscription
mercredi 14 avril 2010
Statut
Membre
Dernière intervention
2 août 2014

Si vous disposez du logiciel Access, je vous suggère l'importation de vos donnees dans un fichier, puis de définir la clé primaire comme étant : l'article et la date.
Ensuite, grâce à une boucle while (puisque la table sera lue par la clé primaire) écrire la première et la dernière ligne d'un article dans une autre table, que vous pourrez ensuite analyser à plaisir, avec VBA ou SQL.
Damedom Sologne