Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 VBA Test de dates dans une colonne par rapport à la date du jour

alexanbat

XLDnaute Junior
Bonjour

Je suis a écrire ma 1ère macro... et je bloque sur un élèment et je ne trouve pas la solution sur les forums.

Mon problème pour faire simple:
J'ai une colonne (Disons "D") dans un onglet rempli de date que je souhaite tester avec la date du jour ("aujourd'hui()").

SI date testé dans colonne "D" > à date d'aujourd'hui, ALORS valeur a renseigner (en colonne "E") : "Date future"
OU
SI date testé dans colonne "D" <= à date d'aujourd'hui, ALORS valeur a renseigner (en colonne "E") : "Date passée"
AUTREMENT
Si cellule testé = Vide Alors rien ("")


Je me suis aventuré avec un SELECT CASE.

Dim End_date As Date, Today As Date, Result As String
End_date = Range("D")
Today = Date

Select Case End_date
Case Is > Today
Result = "Date future"

Case Is <= Today
Result = "Date passée"

Case Else
Result = ""

End Select

Mais j'ai un bug dés le début que je ne sais pas identifier.

Qu'est ce qui n'est pas correct dans ma syntaxe ?
Merci de votre aide.

AL
 

LopiK

XLDnaute Nouveau
Bonjour,

A peine inscrit je me lance dans la résolution . N'hésitez pas à me faire vos remarques pour le fond et la forme.

Je partage ce que je fais en général dans ce cas.

D'abord si tu commences le VBA, je te conseille (ma propre vision) de te familiariser plutôt avec les fonctions condition type IF THEN plutôt que le SELECT CASE.
SELECT CASE est intéressant quand tu as beaucoup de conditions. Ici tu as en réalité 3 possibilités ="", >= ou <.
Donc avec 2 IF THEN tu peux t'en sortir (un peu ce que l'on fait habituellement dans les formules excel avec des "Si dans Si" comme je les appelle)

Il faut également incrémenter tes lignes pour vérifier chacune d'elles. (ici via la variable ligne)

Enfin il te faut une boucle d'incrémentation, ici un NEXT FOR.
J'ai aussi pris l'habitude pour ma part de faire des boucles type DO LOOP quand j'ai une colonne avec des données à chaque ligne et dont la dernière ligne peut varier et dans ce cas je boucle jusqu'à la dernière ligne non vide.

Voici ce que je ferais => les commentaires sont dans le code, tu peux les supprimer pour plus de lisibilité.

VB:
Dim ligne As Integer
Dim Today As Date

Today = Date

' créa Boucle For Next
For ligne = 1 To 50 'les chiffres dépendent de tes n° de ligne à contrôler

' double condition
'1ere condition
If Sheets("Feuil1").Range("D" & ligne).Value = "" Then 'condition si vide
' on ne fait rien
Else 'si différent de vide
'2eme condition intégré dans le Else de la 1ere
If Sheets("Feuil1").Range("D" & ligne).Value > Today Then 'si supérieure à la date actuelle
Sheets("Feuil1").Range("E" & ligne).Value = "Date future" 'date future
Else
Sheets("Feuil1").Range("E" & ligne).Value = "Date passée" 'sinon date passée
'fin boucle test > Today
End If
'fin boucle test si vide ""
End If

'boucle pour prochaine ligne
Next

End Sub
 

Jacky67

XLDnaute Barbatruc
Mon problème pour faire simple:
Bonjour à tous
Dans ce cas une formule est plus rapide qu'une boucle
En Vba
VB:
Sub test()
    With Sheets("feuil1")    ' adapter le nom de la feuille
        With .Range("e1:e" & .Cells.Find("*", , , , xlByRows, xlPrevious).Row)
            .Formula = "=IF(ISNUMBER(d1),IF(d1<=TODAY(),""Date passée"",""Date future""),"""")"
            .Value = .Value    ' supprime la formule
        End With
    End With
End Sub

Sans VBA
En E1
=SI(ESTNUM(D1);SI(D1<=AUJOURDHUI();"Date passée";"Date future");"")
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…