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 :
- Sub ETAPE3()
- Const PR = vbLf & vbLf & "Entrer la date de ", TI = " INTERVALLE"
-
- DateDebut = InputBox(PR & "début :", TI, "01/01/" & Year(Now))
- If IsDate(DateDebut) Then DateFin = InputBox(PR & "fin :", TI, DateDebut)
- If Not IsDate(DateFin) Or DateFin < DateDebut Then Beep: Exit Sub
- Application.ScreenUpdating = False
-
- For R = Cells(Rows.Count, 5).End(xlUp).Row To 2 Step -1
- If IsDate(Cells(R, 5)) Then
- If Cells(R, 5) < DateDebut Or Cells(R, 5) > DateFin Then Rows(R).Delete
- End If
- Next
-
- Application.ScreenUpdating = True
- End Sub
|
► 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.
Message édité par Marc L le 30-04-2013 à 16:16:40