Parcourir colonne pour comparaison de date

Résolu
kijx Messages postés 45 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 2 avril 2014 - 22 août 2013 à 15:28
kijx Messages postés 45 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 2 avril 2014 - 27 août 2013 à 11:30
Bonjour à tous,

Je débute en macro Excel et j'aimerai avoir quelques conseils.
On peut dire que j'ai le syndrome de la page blanche en ce qui concerne comment commencer une macro.

Mon problème est que j'ai une colonne avec une liste de date et j'aimerai comparé ces dates à la date d'aujourd'hui.
Si la date dans la liste est inférieur de la date d'aujourd'hui de 32mois j'aimerai passer la case en orange et si la date de la liste est inférieur de 36 mois à la date d'aujourd'hui alors la case passerai en rouge.

Il me semble qu'il faut initialiser une variable avec la date du jour.
Faire une boucle qui parcours la colonne avec les dates et comparé chaque case avec la date d'aujourd'hui.

Voila ce que j'ai :

Public Sub MAJ()
'Coloration de la colonne (E) Date de création, Orange si date de création plus ancienne que 32mois, Rouge si date de création plus ancienne que 36mois

'Définition des variables
Date = aujourdhui
 
If ActiveCell.Column = 1 Then

    For i = 1 To 4  ' pour ce placer sur colonne E
        ActiveCell.Next.Select
    Next

    if Activecell.Value >= 32 date then
    ActiveCell.Interior.ColorIndex = 36 '  Couleur orangé
    End If

End If


Bien évidement sa ne fonctionne pas et je ne vous demande pas de me pondre un code tout fait mais au moins de m'aiguiller.

D'avance merci
--

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
24 août 2013 à 12:13
Salut

Comme il s'agit de comparer chaque cellule de ta colonne à une date = Maintenant - 32 mois, pourquoi ne pas calculer cette limite en premier et faire les tests avec ce calcul ?
Dim maDateLimite As Date
maDateLimite = DateAdd("m", -32, Now)

Ensuite, pour parcourir les cellules d'une colonne, mieux vaut reprendre le genre de code que tu trouyveras dans n'importe quelle source :
Dim monRange As Range
For Each monRange In ActiveSheet.Range("E:E")
    ' On sort de la boucle dès qu'on rencontre une cellule vide
    If IsEmpty(monRange) Then Exit For
    ' Sinon, on fait la comparaison
    If monRange.Value < maDateLimite Then
        ' ici ton code
    End If
Next

Il te reste à être certain que chaque cellule de la colonne "E" est bien de type "Date".
Voir dans l'aide les différences entre Range.Value, Range.Value2 et Range.Text.

Je te conseille fortement de mettre en service la "déclaration obligatoire des variables" (voir options).
Ca peut paraitre emmerdant au début, mais cela évite certains bugs, mais surtout, cela t'oblige à réfléchir :
- à l'étendue de ta variable (visible depuis la sub/function uniquement, ou dans toute la feuille, ou dans tout le classeur)
- au type de la donnée, et donc aux diverses méthodes de comparaison + méthodes de conversion de type, si besoin.
C'est 50% du boulot de débogage en moins.

Vala
Jack [MVP VB]
NB : Je ne répondrai pas aux messages privés
1
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 août 2013 à 19:29
Bonjour,
On parcourt ainsi (exemple) la collonne D, de la ligne 3 à la ligne 10
for i = 3 to 10
  ladate = range("D" & i).value ' ===>>> affiche la date
next

On vérifie ainsi la différence entre ladate et la date du jour :
différence = ladate - date

Tout cela est bien trop simple pour que je ne te laisse pas t'y mettre seul !
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
Modifié par jordane45 le 23/08/2013 à 03:54
Bonjour,

- aujourd'hui se traduit par now()
-¨Pour se "placer" sur une colonne, pas besoin de boucle, il suffit de lui dire où aller.
La manipulation des cellules peut se faire via "cells" ou "range".
par exemple, pour aller sur la cellule 'E1' , tu peux ecrire :
' avec range:
Range("E1")
' avec cells :
cells(5,1)


Maintenant, vu que tu as une plage de cellule avec les dates (dans ta colonne E ) tu pourrais directement parcourir chaque cellule de cette plage avec la commande ( FOR EACH )

un truc du genre :
dim maPlage as date
set maPlage = Range("E1:E20")
For each cell in MaPlage
LaDate = cell.value
'etc...

Next




Pour ce qui est de la comparaison de dates, tu regardes du côté des fonctions : DateDiff, dateAdd...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 août 2013 à 11:11
Bonjour, Jordane,
S'agissant d'une différence à calculer en jours, même pas besoin de DateDiff. Date2-Date donne le nombre de jours entre la date du jour et la date Date2
0
Oui c'est vrai. . Mais bon vu sa connaissance du vba, ça ne lui fera pas de mal de découvrir cette fonction. ...
0
C'est cool. ..sans s' enregisrer un user peut prendre le pseudo qu'il veut.
Jordane.
0
kijx Messages postés 45 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 2 avril 2014
23 août 2013 à 13:04
Merci pour votre aide, même si je sens une pointe de sarcasme dans ce que dit ucfoutu :)

J'ai testé ton code, mais voila que pour "difference" il me renvoi une incompatibilité de type.

'Parcours la colonne D de la ligne 7à15
For i = 7 To 15
  ladate = Range("E" & i).Value ' ===>>> affiche la date
    difference = ladate - Date

Next 

--
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
23 août 2013 à 14:04
Que vaut "date" dans ton code ?
Fait un debug.print ou un msgbox dans ta boucle pour connaitre la valeue de tes variables ( ou en mode pas a pas mets ton curseurdessus.)
0

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

Posez votre question
kijx Messages postés 45 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 2 avril 2014
27 août 2013 à 11:07
Bonjour cs_jack,

J'ai modifié un peu le code mettant Date à la place de now et en rajoutant ce que je voulais comme couleur dans les cellules suite à la comparaison.

J'ai maintenant un autre soucis, j'ai défini le Range de E6 à E100.

Quand j'execute la macro manuellement dans l'onglet developpeur sa ne fonctionne pas les cellules ne change pas de couleur.
Et quand j'execute la macro via un bouton sur la feuille qui appel la macro il me change de couleur la cellule qui est selectionné au moment présent, pourquoi ne commence t-il pas a E6 comme défini ?

Public Sub MAJ()

Dim maDateLimite As Date
maDateLimite = DateAdd("m", -32, Date)

Dim monRange As Range

For Each monRange In ActiveSheet.Range("E6:E100")

    ' On sort de la boucle dès qu'on rencontre une cellule vide
    If IsEmpty(monRange) Then Exit For
    
    ' Sinon, on fait la comparaison
    If monRange.Value < maDateLimite Then
    
        ' ici ton code
        
        ActiveCell.Interior.ColorIndex = 36 '  Couleur orangé
        Else
        ActiveCell.Interior.ColorIndex = 3 '  Couleur rouge
    End If

Next

End Sub 
 
--
 
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 27/08/2013 à 11:27
Ce n'est pas ActiveCell, mais MonRange, qu'il faut colorier !

et par ailleurs : la feuille à colorier doit être celle active !
ou alors : forcer par la syntaxe WorkSheets(". nom de la feuille...").Range(" ....") plutôt que ActiveSheet.Range(" ....")

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
kijx Messages postés 45 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 2 avril 2014
27 août 2013 à 11:30
Alors la je n'ai aucune excuse c'est moi qui suis nul lol merci ucfoutu sa fonctionne bien.

Merci à tous pour votre aide

--
0
Rejoignez-nous