Extraction entre 2 dates

JackMiles Messages postés 5 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 27 novembre 2007 - 26 nov. 2007 à 11:48
JackMiles Messages postés 5 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 27 novembre 2007 - 27 nov. 2007 à 16:07
Bonjour,
Je débute en macro excel sous VBA 6.0 (3jours de formations il y a 15 jours !! ), j'ai préparé un tableau de bord où je contrôle plusieurs modules (une 30 aine).
Il me reste la partie traitement d'un fichier texte où je dois extraire des lignes entre 2 dates.
Par exemple: j'ai un fichier texte avec des lignes entre le 15/11/07 et le 22/11/07 et je ne dois garder que les lignes du 18/11/07 au 20/11/07.

Je traite la variable de date par inpubox "DateDepart" et une "DateFin"
J'arrive à faire une boucle qui delete les lignes avant le 18/11/07 mais quand j'integre ma variable "DateFin", tout se delete...
Voici mon code sans cette histoire de date de fin:
****************************************************
Sub couperlignes()

Dim datedebut As String
Dim datefin As String

datedebut = InputBox("date début au format mm/dd/yy")
'datefin = InputBox("date début au format mm/dd/yy")

Range("l2").Select


j = 2
While Cells(j, 12) <> "" And Cells(j + 1, 12) <> ""
j = j + 1
For I = 2 To j
While Cells(I, 12) > datedebut
I = I + 1
Wend
While Cells(I, 12) < datedebut And Cells(I, 12) <> ""
Rows(I).Select
Selection.Delete shift:=xlUp
Wend


Next
Wend

End Sub
*********************************************************

Autre question, est-il possible de simplifier le code en lui donnant comme variable l'intervalle de date que je souhaiterais garder, ex " 18/11/07 - 20/11/07" ?
Merci d'avance pour votre aide...

Jack :)

7 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
26 nov. 2007 à 13:20
Salut
Un rapide coup d'oeil :
- L'indentation : Ce sont ces tabulation qu'on ajoute au début des lignes pour les décaler
   Ton code gagnerait beaucoup en clarté si tu indentais les lignes à l'intérieur de tes boucles.
   (Exemple après ces remarques)
- Tu ne commenceras le traitement qu'à la ligne 3 puisque tu commence avec j = 2 et que tu l'incrémentes tout de suite.
   Normal ?
- Habitues toi à ajouter des commentaires. Dans ce cas là, ça aiderait les lecteurs et tu verras que toi aussi ça t'aidera
- DateFin : Je ne vois nulle part de DateFin dans ton programme
   Etourderie ?
- Je comprends que tu testes que la ligne J contienne quelque chose, mais pourquoi tester que la ligne J+1 ne soit pas vide ?
- Le 1er While permet de scruter chaque ligne si celle-ci n'est pas vide (on s'arrête si elle est vide)
   Pourquoi refaire une boucle For-Next qui commence à la ligne 2 ?
   Ton While s'est déjà occupé d'incrémenter la ligne
- Relit tes cours : Tu as oublié d'instruction IF
- Ton l'instruction Selection.Delete shift:=xlUp supprime la ligne en demandant aux suivantes de remonter
   En supposant que la ligne soit en 32, cela veut donc dire que la ligne d'après (33) se retrouve en 32
   Si tu reboucles en incrémentant le n° de la ligne, la prochaine ligne traitée sera 33
   --> La ligne qui vient d'être décalée (33 --> 32) ne sera pas traitée !

Code original indenté :
    j = 2
    While Cells(j, 12) <> "" <strike>And Cells(j + 1, 12) <> ""</strike> 
         ' On s'arrête dès qu'une cellule est vide
          j = j + 1 
          <strike>For I = 2 To j </strike>
                ' Si la cellule contient une date après 'Début', on la supprime
                If Cells( J , 12) > datedebut Then
                <strike>While Cells(I, 12) > datedebut</strike> 
                     <strike> I = I + 1</strike> 
                <strike>Wend</strike> 
                <strike>While Cells(I, 12) < datedebut And Cells(I, 12) <> ""</strike> 
                      Rows(J).Select 
                      Selection.Delete shift:=xlUp 
                      ' On recommencera le test sur la même ligne à la prochaine incrémentation :
                      J = J - 1
                <strike>Wend</strike> 
               End If
          <strike>Next</strike>
    Wend

Si tu veux tester que ta date ne dépasse pas DateFin, il te suffira de l'intégrer dans le If :
                If Cells(J, 12) > datedebut And Cells(J, 12) < DateFin Then

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

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
26 nov. 2007 à 15:46
PS : L'incrémentation "j = j + 1" doit se trouver juste devant le dernier Wend et non juste après le While (il me semblait bien qu'il y avait qqchose de pas clair)
0
JackMiles Messages postés 5 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 27 novembre 2007
26 nov. 2007 à 16:11
Hi Jack...quand Jack parle à Jack !!

-Pour ce qui est de l'indentation, effectivement, je ne sais pas trop où indenter pour le moment, ça viendra avec la pratique (ça ne fait que 15 jours de pratiques avec une formation type lance-pierre !!).

-Pour les commentaires, toutes les macros que j'ai fait pour le moment en comportent, c'est vrai que je n'ai pas détaillé ligne par ligne dans mon exemple.

Je t'avouerais que j'ai récupéré un bout de code d'une autre macro et j'ai essayé de bidouiller (pas glop !!), je n'avais pour le moment jamais vu le cas d'une boucle avec "while", c'est pour cela que ça cafouille pas mal !!!

-Pour l'histoire de la date de fin, je l'ai laissée en commentaire et je ne l'ai pas mis dans le code car comme je l'expliquais, je n'arrive pas à mettre cette variable...tout se delete !!

Je vais tester tout ça et je reviens vers toi !!
Merci pour ton aide
;)Jack
0
JackMiles Messages postés 5 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 27 novembre 2007
26 nov. 2007 à 16:21
Au fait, pour le delete de ligne c'est ce que je veux faire car ensuite j'exporte le fichier au format texte pour qu'il soit traité par une autre macro...
Je vois le pb de ligne non traité...
Qu'est-ce qui serait le mieux, prendre le pb à l'envers et créer une boucle qui copie entre les 2 dates vers un nouveau fichier ? visiblement cela semblerait plus propre ? Qu'en penses tu ?
Il faut simplement que j'extrais des datas entre 2 dates...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
JackMiles Messages postés 5 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 27 novembre 2007
26 nov. 2007 à 17:00
Hi Jack,
Meci pour ton bout de code, c'est ok...je vire toutes les lignes avant ma date de départ (j'ai inversé le signe)...faut que je vire maintenant tout ce qui est supérieur à ma date de fin...on verra ça demain...
Bonne soirée
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
26 nov. 2007 à 23:35
Pour l'indentation, j'ai pris l'habitude d'agir ainsi...

j'écris disons For ..... [Enter]
j'inscris tout de suite Next
puis flèche haut, End, Enter, Tab  (ça devient un automatisme)

et je suis positionné pour le reste du code
Même chose pour tous les groupes de code (If, While, ...)

MPi²
0
JackMiles Messages postés 5 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 27 novembre 2007
27 nov. 2007 à 16:07
Bonjour Tous le monde,
Mon projet est terminé..extract entre 2 dates ok agrémenté du calendrier que j'ai trouvé sur le site...
Tableau de bord pilotant 40 modules de macros...j'ai réduit une tache qui me prenait 1/2 journée à 15mn de runs !!
Faut maintenant que je pratique plus...
Merci pour l'aide...
:) Jack
Ps: Félicitation pour la clareté et la richesse de ce site....
0
Rejoignez-nous