Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2311 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA-Macros][Excel]Comparaison de deux dates

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VBA-Macros][Excel]Comparaison de deux dates

n°2187571
sadhya
Posté le 25-04-2013 à 16:10:56  profilanswer
 

Bonjour je suis actuellement en stage et j'ai quelques petites interrogations sur comment comparer deux dates. J'ai essayé plusieurs codes mais cela fonctionne pas je vous ai mis ci dessous mon dernier code. Sur ma feuille excel il y a toutes les interventions qui ont été effectué depuis 4 ans . à la demande de l'utilisateur il doit en ressortir toutes les interventions pour lesquelles la date qui est dans la colonne 5 est comprise entre l'intervalle que l'utilisateur aura saisie. JATTENDS PATIEMMENT VOS REPONSES PARCE QUE JE SUIS DANS UNE IMPASSE ....  
   

Code :
  1. Dim i As Integer 
  2. Dim stock As Date 
  3. Dim DateDebut As Date 
  4. Dim DateFin As Date 
  5. Dim papi As Integer 
  6.  
  7. fin = Range("A1" ).End(xlDown).Row 
  8.  
  9. DateDebut = InputBox("Entrer la date ", " Date de debut d'intervalle ", "01/01/2013 " ) 
  10.  
  11. MsgBox "Bonjour" & Chr(10) & "La date est " & DateDebut 
  12.  
  13. DateFin = InputBox("Entrer la date ", " Date de fin d'intervalle ", "01/01/2013 " ) 
  14.  
  15. MsgBox "Bonjour" & Chr(10) & "La date est " & DateFin 
  16.  
  17. For i = 2 To fin 
  18. Cells(i, 5).Select 
  19. stock = Cells(i, 5).Value 
  20. If (stock <= DateDebut) Or (stock >= DateFin) Then 
  21. Rows(i).Select 
  22. Selection.Delete Shift:=xlUp 
  23. papi = Range("A1" ).End(xlDown).Row 
  24. fin = papi 
  25. End If 
  26. Next i


Message édité par sadhya le 25-04-2013 à 16:28:24
mood
Publicité
Posté le 25-04-2013 à 16:10:56  profilanswer
 

n°2187583
Marc L
Posté le 25-04-2013 à 16:59:46  profilanswer
 

 
           Bonjour.
 
           Quel est donc le souci ?
 
           Si message d'erreur, préciser aussi le numéro de la ligne déclenchant …
 

n°2187606
sadhya
Posté le 25-04-2013 à 18:03:45  profilanswer
 

Marc L a écrit :

 
           Bonjour.
 
           Quel est donc le souci ?
 
           Si message d'erreur, préciser aussi le numéro de la ligne déclenchant …
 


 Bonjour Marc L,  
 
La ligne 19 me renvoie ( une erreur d'exécution'13', Incompatibilité de type ).

n°2187607
sadhya
Posté le 25-04-2013 à 18:04:22  profilanswer
 

Et donc ça ne fonctionne pas

n°2187608
Marc L
Posté le 25-04-2013 à 18:16:01  profilanswer
 

 
          Et avec .Value2 ?
 
          Sinon c'est la classique incohérence de type de variables par rapport aux données.
 
          Comme tu es déjà en main sur un autre forum, je m'arrêterais là …
 

n°2187610
sadhya
Posté le 25-04-2013 à 18:21:59  profilanswer
 

C'est comme tu veux pour l'instant j'ai toujours la même erreur j'ai remplacé par .Value2 et ça renvoie la même erreur.  
 
J'ai prospecté sur deux forums pour maximiser mes chances de réponses, car cette programmation sur VBA importante quant à la finalisation de mon stage et n'étant pas du tous dans mon domaine d'études je demande un peu partout pour avoir différent regard sur mon problème mais bon pour l'instant je suis toujours bloqué au mâme point.  
 
J'attends patiemment vos réponses et je vous remercie d'avance

n°2187612
Marc L
Posté le 25-04-2013 à 18:31:44  profilanswer
 

 
           Tout ce que je peux (re-)dire, c'est qu'il n'y a pas de cohérence entre les données saisies et le format de variable …
 
           Ce n'est juste qu'une question de pure logique et évidemment, faut être devant l'ordinateur pour comprendre ce qu'il se passe.
 
           Sur l'autre forum, si tu avais cherché dans les récents sujets, il y a un type avec le drapeau marocain sauf erreur, a galéré tant
           qu'il n'a pas fait l'effort de respecter cette cohérence; cela lui a pris des jours alors que dès le départ il avait la solution …
 
           Donc avant de définir des variables, vérifier le format de chaque cellule reprise par le code,
           sinon autant ne pas définir de variable qu'en définir avec un mauvais type ‼
 
           Sachant qu'une variable non définie, donc de type Variant, s'en sortira bien mieux …
 

n°2187657
Marc L
Posté le 26-04-2013 à 01:03:41  profilanswer
 

 
          D'abord, arrêter le code avant la suppression pour vérifier si cette colonne huit est correcte ou pas.
 
          Ce point est essentiel car inutile de poursuivre s'il subsiste un problème de cohérence de dates …
 
          Si c'est correct, tout serait à remanier à partir de la ligne 27 en beaucoup plus simple
          car il n'y a vraiment pas besoin de colonne supplémentaire pour supprimer une ligne,
          il serait juste question de comparer directement une cellule avec un intervalle …
 
          Mais comme il s'agit en fait de supprimer des lignes, la conception même de la boucle est à revoir
          car en observant la suppression manuelle d'une ligne, tout en gardant à l'esprit un compteur de boucle,
          des lignes ne pourraient être supprimées, non pas parce que le programme fait ce qu'il veut,
          loin de là, mais simplement à cause d'un souci de logique …
 
          De solution je n'apporterais sans déceler un minimum d'investissement vis à vis d'une possible piste.
 
          Affirmer attendre des réponses et être dans l'impasse est un fait mais, pour obtenir un retour positif,
          faudrait-il encore que soit clairement exposée la problématique !
 
          Jeter un code en pâture sans de concrètes explications, personne ne décryptera le besoin réel …
          Même sur l'autre forum, hyper spécialisé pourtant, après plusieurs échanges, ils en étaient toujours à essayer de comprendre !
 
          De plus, sur ce forum comme sur l'autre, une simple recherche aurait déjà dévoilé la solution concernant ce problème de boucle.
 
 
          Par expérience, écrire gros et fort n'aide vraiment pas pour donner l'envie de répondre favorablement …
 
 
          Côté code, plus il y a de  Select  plus l'exécution est longue, à proscrire donc !
          Une seule boucle est nécessaire pour tester et supprimer au besoin des lignes sinon vive l'usine à gaz …


Message édité par Marc L le 26-04-2013 à 02:00:01
n°2187754
Marc L
Posté le 26-04-2013 à 18:17:28  profilanswer
 

 
            :hello:  
 
            L'autre forum t'a mise sur la voie ?
 
            Sinon moins d'une vingtaine de lignes est nécessaire pour ton code (dans la limite de ce que j'ai capté, y a de la brume), et ce,
            en s'affranchissant même de la cohérence de la saisie des dates, qu'une cellule date soit en format texte puis une autre en date …
 

n°2188021
sadhya
Posté le 29-04-2013 à 15:30:28  profilanswer
 

Salut Marc L  
 
Oui ils m'ont mis sur la voie, je regarde un peu ce qu'il se dit dans le forum parce que mon problème maintenant demeure dans la suppression de ligne.  
Le code fonctionne jusqu'aux marqueurs mais arrivé sur le code de suppression ça ne supprime même plus quoi que ce soit.  
 
Désolé de n'avoir pas répondu plus mon ordi personnel est tombé en panne et ayant un décalage horraire de cinq heures c'était pas évident .  
 

Code :
  1. Sub ETAPE3()
  2. Dim i As Integer
  3. Dim DateDebut As Date
  4. Dim DateFin As Date
  5. Columns("D:E" ).Select
  6. Selection.NumberFormat = "dd/MM/yyyy"
  7. fin = Range("A1" ).End(xlDown).Row
  8. DateDebut = InputBox("Entrer la date ", " Date de debut d'intervalle ", "01/01/2013 " )
  9. MsgBox "Bonjour" & Chr(10) & "La date est " & DateDebut
  10. DateFin = InputBox("Entrer la date ", " Date de fin d'intervalle ", "01/01/2013 " )
  11. MsgBox "Bonjour" & Chr(10) & "La date est " & DateFin
  12. For i = 2 To fin
  13. stock = Cells(i, 5).Value
  14. If stock > DateDebut And stock < DateFin Then
  15. Cells(i, 7) = True
  16. Else: Cells(i, 7) = False
  17. End If
  18. Next i
  19. 'For j = fin To 2 Step -1
  20. 'If Cells(i, 7) = False Then
  21. 'Rows(i).Delete
  22. 'End If
  23. 'Next j
  24. End Sub


 
Voilà ça, ça foncitonne. Mais la suppression :??:  

mood
Publicité
Posté le 29-04-2013 à 15:30:28  profilanswer
 

n°2188207
Marc L
Posté le 30-04-2013 à 14:59:25  profilanswer
 

 
           Désolé mais je n'étais pas disponible hier après-midi …
 
           J'ai constaté que tu t'en es sortie sur l'autre forum et que ton souci est résolu, je t'en félicite !
 
           Mais avant de te livrer le code préparé il y a quelques jours, voici quelques remarques concernant ton dernier code ETAPE3 :
 
           ► Ligne n°11 :  si dans la colonne A il y a une cellule vide avant la dernière saisie, cette variable Fin renvoie alors
                                   la ligne de la cellule précédent cette ligne vide et non pas celle de la dernière saisie …
 
           ► Ligne n°13 :  - la date par défaut est en 2013, mais il sera de même les années suivantes …   Mieux vaut utiliser l'année en cours.
                                   - Que se passe-t-il aussi si dans la fenêtre de l'InputBox est cliqué le bouton Annuler ou autre chose qu'une date ?
                                     Je ne sais si c'est un hasard dans le code global, les variables DateDebut & DateFin ne sont plus déclarées en date.
 
           ► Ligne n°17 :  comme la date de fin ne devrait pas être inférieure à celle de début, au lieu de proposer une date par défaut en 2013,
                                   mieux vaut proposer celle de début …   Plus les mêmes observations que le point précédent.
 
           ► Lignes 15 & 19 :  je trouve idiot de confirmer chaque saisie, si vraiment il y a besoin d'une confirmation,
                                         la faire en une seule fois après la saisie de la date de fin …
 
           ► Lignes 23 à 28 :   inutiles, des lignes peuvent être directement supprimées sans ce bloc.
 
           ► La boucle en ligne n°30 est la bonne en cas de suppression de ligne, j'espère seulement que tu sais maintenant pourquoi …
 
 
           Le code suivant reprend les points précédents mais ne tient pas compte de ton code global publié hier sur l'autre forum :

Code :
  1. Sub ETAPE3()
  2.     Const PR = vbLf & vbLf & "Entrer la date de ", TI = "   INTERVALLE"
  3.  
  4.     DateDebut = InputBox(PR & "début  :", TI, "01/01/" & Year(Now))
  5.     If IsDate(DateDebut) Then DateFin = InputBox(PR & "fin  :", TI, DateDebut)
  6.     If Not IsDate(DateFin) Or DateFin < DateDebut Then Beep: Exit Sub
  7.     Application.ScreenUpdating = False
  8.  
  9.     For R = Cells(Rows.Count, 5).End(xlUp).Row To 2 Step -1
  10.         If IsDate(Cells(R, 5)) Then
  11.             If Cells(R, 5) < DateDebut Or Cells(R, 5) > DateFin Then Rows(R).Delete
  12.         End If
  13.     Next
  14.  
  15.     Application.ScreenUpdating = True
  16. End Sub

           ► Aide primaire concernant une instruction :   touchehttp://www.developpez.net/forums/images/smilies/f1.gif
 
           ► Pas de définition de format de cellule, doit être fait directement au sein de la feuille.
 
           ► Pas de déclaration de variable, obligatoire pour les puristes, dans ce cas commencer le code par Option Explicit
               Correction ci-dessous …
 
           ► La fonction  IsDate  permet donc de s'affranchir comme promis de la cohérence des formats des dates,
               peu importe alors le format texte d'une cellule du moment qu'elle puisse être interprétée comme une date.
 
           ► La ligne n°7 a une utilité certaine, je dirais même plus, elle a une certaine utilité …
 
           ► Ligne n°9, dans l'unique boucle nécessaire pour supprimer les lignes,
               la dernière saisie détectée s'effectue directement sur la colonne n°5 car c'est la seule testée pour la suppression.
 
               Dans ton code global, la variable Fin est utilisée à cet effet plusieurs fois, à conserver dans une configuration multi boucles …
 
           ______________________________________________________________________________________________________
 
           En jetant un œil à ton code global, dans le cas probable d'un exercice, tu risques de perdre pas mal de points !
 
           En effet si j'étais correcteur et qu'en dehors de souci de conception mes critères soient la détection des erreurs et l'efficacité,
           comme pour un applicatif professionnel, je ne te donnerais guère plus que la moyenne à cause, comme déjà cité,
           du non contrôle de la cohérence des renvois des InputBox et des boucles inutiles.
 
           J'ai juste un doute sur un point mais s'il est levé, une boucle unique suffirait pour l'intégralité de ton code …
           Avec des milliers de lignes à traiter, quel gain de temps de n'utiliser qu'une seule boucle, n'est-il pas ?
 
           Mais aussi les  .Select  sont d'affreux ralentisseurs, beaucoup ne servent à rien dans ton code global
           (proviennent certainement de l'enregistreur de macros conservant chaque action même inutile !)
           et de toute manière mieux vaut travailler directement sur l'objet au lieu d'une sélection.
           Exemple avec les lignes n°8 & 9 de ton code ETAPE3 corrigées en une seule :
 
                  Columns("D:E" ).NumberFormat = "dd/MM/yyyy"
 
 
           Si tu es intéressée, je t'invite à poursuivre dans un nouveau sujet dans lequel tu posteras l'intégralité de ton code et tes attentes.


Message édité par Marc L le 30-04-2013 à 16:16:40
n°2188228
sadhya
Posté le 30-04-2013 à 15:43:09  profilanswer
 

Salut Marc L,  
 
Le premier problème est réglé compte à l'amélioration je faire un nouveau post mais là je m'attele à un nouveau problème si tu as pu le voir dans l'autre forum.  
 
Merci pour tes suggestions, mais en essayant ton code toute ma page c'est effacé est-ce normal ? :ouch:


Message édité par sadhya le 30-04-2013 à 15:44:05
n°2188237
Marc L
Posté le 30-04-2013 à 16:12:29  profilanswer
 

 
           M E A   C U L P A   ‼
 
           J'ai voulu faire le kéké en simplifiant au maximum et j'ai zappé la phase test …
           Comme quoi avec les dates, il faut vraiment blinder !
 
           Voici le code préparé le 26 tel quel :

Code :
  1. Sub ETAPE3()
  2.     Const PR = vbLf & vbLf & "Entrer la date de ", TI = "   INTERVALLE"
  3.     Dim DateDebut As Date, DateFin As Date, Dstock As Date
  4.     D = InputBox(PR & "début  :", TI, "01/01/" & Year(Now))
  5.     If IsDate(D) Then DateDebut = D Else Exit Sub
  6.     D = InputBox(PR & "fin  :", TI, D):  If IsDate(D) Then DateFin = D
  7.     If DateFin < DateDebut Then Beep: Exit Sub
  8.     Application.ScreenUpdating = False
  9.     For R = Cells(Rows.Count, 5).End(xlUp).Row To 2 Step -1
  10.         If IsDate(Cells(R, 5)) Then
  11.             Dstock = Cells(R, 5)
  12.             If Dstock < DateDebut Or Dstock > DateFin Then Rows(R).Delete
  13.         End If
  14.     Next
  15.     Application.ScreenUpdating = True
  16. End Sub


 
           Je n'ai pas encore eu le temps de consulter l'autre forum …


Message édité par Marc L le 30-04-2013 à 16:22:40
n°2188239
sadhya
Posté le 30-04-2013 à 16:20:38  profilanswer
 

Whaouw c'est génial merci beaucoup Marc L quand j'aurais fini mes requêtes il me restera plus qu'à comprendre ton code à très vit sur le poste d'amélioration.

n°2188244
Marc L
Posté le 30-04-2013 à 16:34:13  profilanswer
 

 
           A consulter en priorité l'aide concernant la fonction  IsDate  et la propriété  ScreenUpdating  …
 
           Et si ce n'est déjà fait, pourquoi la boucle en ligne n°11 s'effectue en remontant et non pas en descendant,
           certainement le plus important en devant justifier la logique du code auprès d'un professeur !
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA-Macros][Excel]Comparaison de deux dates

 

Sujets relatifs
Requête Sql - Trouver dates les plus prochesA l'aiiiiide.!! Programation Excel urgent
Transformer x onglets Excel en x pdfExcel : Vlookup et lookup
[access 2003] - Incrémentation de DatesComparaison avec perl
perl + comparaison + xmlMacro importer des fichiers txt d'un dossier dans des fichiers excel
Aide pour macros Excel 
Plus de sujets relatifs à : [VBA-Macros][Excel]Comparaison de deux dates


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR