Tester si une date est déjà passée ou non

F

Fab

Guest
Bonjour,
Une partie de ma macro doit tester des dates (se trouvant dans une colonne) pour savoir si elle sont déjà passées ou non.
Les dates déjà dépassées sont alors mises en évidence (grisée).
Mais, ça ne fonctionne pas (probablement des End If pas bien plaçés, j'ai essayé diverses combinaisons en vain)
Voici la partie du code concernée qui ne marche pas :

Sub auto_open()
'Macro exécuté à l'ouverture du fichier
Dim DateLimite As Date
Dim DelaiLimite
Dim k
Dim DateActuelle As Date
Dim Blanc


DateActuelle = Now


Sheets("ATTENTION").Select

' Colore en Gris les délais négatifs

For k = 3 To 25
' Test de la cellule selectionnée
Range("D" & k).Select
If Range("D" & k) = "" Then
Blanc = 0
Else
DateLimite = Range("D" & i).Value
DelaiLimite = (DateLimite - DateActuelle)
If (DelaiLimite < 0) Then
' Action
Range("D" & i).Select
Cell.Select
With Selection.Interior
.ColorIndex = 15
.Pattern = xlSolid
Else
Blanc = 0
End If
End If

Next k

Range("a1").Select
End Sub


Merci d'avance.
Fab
 
C

CHti160

Guest
Salut "Fab" re le "FORUM"
je pense que ton problème vient du format de tes dates dans
DelaiLimite = (DateLimite - DateActuelle)'<--- il faut convertir en chiffre ces variables soit un truc du genre DateLimite =format(dateLimite,"00000")
DateActuelle=format(DateActuelle,"00000")
DelaiLimite=(DelaiLimite,"00000")
pour comparaison de numerics
Je pense je testerai plus tard
A+++
Jean Marie
 
J

jmps

Guest
Bonjour Fab, bonjour Jean-Marie, bonjour le Forum,

Fab, pourquoi n'utilises-tu pas la mise en forme conditionnelle plutôt que du VBA ? Ca me paraît beaucoup plus simple.

Tu mets en condition "La valeur de la cellule" "est inférieure à" "=AUJOURDHUI()"

A moins que tu ais une bonne raison que je n'ai pas saisie d'utiliser une macro.

Bonne journée.

José
 
C

CHti160

Guest
re Salut "Fab"
bonjour "jmps"
jmps n'a pas tord "Pourquoi faire Simple quand on peut faire Compliqué"
mais bon !!! en pièce jointe un essai qui peut sûrement être amélioré
A+++
Jean Marie
 

Pièces jointes

  • DateLimite.zip
    8.6 KB · Affichages: 22
  • DateLimite.zip
    8.6 KB · Affichages: 23
  • DateLimite.zip
    8.6 KB · Affichages: 20
J

jmps

Guest
Re Fab, Jean-Marie, bonjour hervé,

J'ai repris l'exemple de JM et ajouté ma méthode, comme ça tu as le choix.
Pardon JM d'avoir volé tes dates, j'avais le flemme de retaper.

A+

José
 

Pièces jointes

  • DateLimite.zip
    8.9 KB · Affichages: 23
  • DateLimite.zip
    8.9 KB · Affichages: 18
  • DateLimite.zip
    8.9 KB · Affichages: 20
F

Fab

Guest
Salut à tous et merci pour toutes ces suggestions.
Effectivement, je n'avais pas pensé aux formes conditionnelles. J'ai essayé, mais le problème est que le nombre de date dans le tableau est variable. Je lui définis donc toute une série de cellule pour la condition "si inférieur à la date d'aujourd'hui ...", mais toute les cellules sans date subissent alors cette condition.

Pour ma boucle, effectivement, la variable i était fausse, je l'ai remplacé par k. Ca ne suffit pas. J'ai changé l'approche :

Dim DateLimite As Date
Dim DelaiLimite
Dim k
Dim DateActuelle As Date

DateActuelle = Now

Sheets("ATTENTION").Select
' Colore en Gris les délais négatifs
For k = 3 To 25
' Test de la cellule selectionnée
Range("D" & k).Select
DateLimite = Range("D" & k).Value
DelaiLimite = (DateLimite - DateActuelle)
If (DelaiLimite < 0) Then
' Action
Range("D" & k).Select
Cell.Select
With Selection.Interior
.ColorIndex = 15
.Pattern = xlSolid
Else
Blanc = 0
End If

Next k

Mais en l'exécutant, il plante sur "Else" : "Erreur de compilation: Else sans If"

Je vais regarder les autres propositions faites.
Merci
 
J

jmps

Guest
Re tous,

Pour ton Else, il manque un End With je crois. Comme ça :

If (DelaiLimite < 0) Then
&nbsp;&nbsp;' Action
&nbsp;&nbsp;Range("D" & k).Select
&nbsp;&nbsp;Cell.Select
&nbsp;&nbsp;With Selection.Interior
&nbsp;&nbsp;&nbsp;&nbsp;.ColorIndex = 15
&nbsp;&nbsp;&nbsp;&nbsp;.Pattern = xlSolid
&nbsp;&nbsp;End With
Else
&nbsp;&nbsp;Blanc = 0
End If

Il me semble aussi que le Range.Select et le Cell.Select juste après font double emploi.

Autrement pour la mise en forme conditionnelle tu peux affiner en mettant en condition :
"La valeur de la cellule" "est comprise entre" "01/01/2004" "=AUJOURDHUI()"
Remplace "01/01/2004" par la date la plus petite que tu puisses avoir. Tout le reste ne rentrera pas dans ta condition.

Voilà, j'espère que ça t'aidera.

A+

José
 

Discussions similaires

Réponses
12
Affichages
566

Statistiques des forums

Discussions
312 176
Messages
2 085 967
Membres
103 070
dernier inscrit
jujulop