Comparaison de deux dates [VBA-Macros][Excel] - VB/VBA/VBS - Programmation
Marsh Posté le 25-04-2013 à 16:59:46
Bonjour.
Quel est donc le souci ?
Si message d'erreur, préciser aussi le numéro de la ligne déclenchant …
Marsh Posté le 25-04-2013 à 18:03:45
Marc L a écrit : |
Bonjour Marc L,
La ligne 19 me renvoie ( une erreur d'exécution'13', Incompatibilité de type ).
Marsh Posté le 25-04-2013 à 18:16:01
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à …
Marsh Posté le 25-04-2013 à 18:21:59
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
Marsh Posté le 25-04-2013 à 18:31:44
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 …
Marsh Posté le 26-04-2013 à 01:03:41
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 …
Marsh Posté le 26-04-2013 à 18:17:28
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 …
Marsh Posté le 29-04-2013 à 15:30:28
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 :
|
Voilà ça, ça foncitonne. Mais la suppression
Marsh Posté le 30-04-2013 à 14:59:25
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 :
|
► Aide primaire concernant une instruction : touche
► 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.
Marsh Posté le 30-04-2013 à 15:43:09
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 ?
Marsh Posté le 30-04-2013 à 16:12:29
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 :
|
Je n'ai pas encore eu le temps de consulter l'autre forum …
Marsh Posté le 30-04-2013 à 16:20:38
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.
Marsh Posté le 30-04-2013 à 16:34:13
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 !
Marsh Posté le 25-04-2013 à 16:10:56
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 ....
Message édité par sadhya le 25-04-2013 à 16:28:24