Parcourir colonne pour comparaison de date [Résolu]

kijx 45 Messages postés mercredi 30 décembre 2009Date d'inscription 2 avril 2014 Dernière intervention - 22 août 2013 à 15:28 - Dernière réponse : kijx 45 Messages postés mercredi 30 décembre 2009Date d'inscription 2 avril 2014 Dernière intervention
- 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
--
Afficher la suite 

11 réponses

Répondre au sujet
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 24 août 2013 à 12:13
+1
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Jack
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 22 août 2013 à 19:29
0
Utile
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 !
Commenter la réponse de ucfoutu
jordane45 20568 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - Modifié par jordane45 le 23/08/2013 à 03:54
0
Utile
3
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...
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 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
Oui c'est vrai. . Mais bon vu sa connaissance du vba, ça ne lui fera pas de mal de découvrir cette fonction. ...
C'est cool. ..sans s' enregisrer un user peut prendre le pseudo qu'il veut.
Jordane.
Commenter la réponse de jordane45
kijx 45 Messages postés mercredi 30 décembre 2009Date d'inscription 2 avril 2014 Dernière intervention - 23 août 2013 à 13:04
0
Utile
1
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 

--
jordane45 20568 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 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.)
Commenter la réponse de kijx
kijx 45 Messages postés mercredi 30 décembre 2009Date d'inscription 2 avril 2014 Dernière intervention - 27 août 2013 à 11:07
0
Utile
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 
 
--
 
Commenter la réponse de kijx
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 27/08/2013 à 11:27
0
Utile
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.
Commenter la réponse de ucfoutu
kijx 45 Messages postés mercredi 30 décembre 2009Date d'inscription 2 avril 2014 Dernière intervention - 27 août 2013 à 11:30
0
Utile
Alors la je n'ai aucune excuse c'est moi qui suis nul lol merci ucfoutu sa fonctionne bien.

Merci à tous pour votre aide

--
Commenter la réponse de kijx

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.