Comparaison des années

Bonjour,

Je ne comprends pas pourquoi mon boucle ne se lance pas.

For i = 156 To Cells(Rows.Count, "B").End(xlUp).Row

If ((Cells(i, "K").Value > 0) And (Cells(i, "K").Value < 1000)) And _

Format(Cells(i, "F").Value, "yyyy") < (Year(Now) - 1) Then

Cells(i, "I").Value = "PROBLEME"

ElseIf (Cells(i, "K").Value > 0 And Cells(i, "K").Value < 200) And _

Format(Cells(i, "F").Value, "yyyy") = (Year(Now) - 1) Then

Cells(i, "I").Value = "ATTENTE " & Year(Now) - 1

End If

Next i

Bonjour,

Le forum dispose d'une option de mise en forme du code (bouton </>), il ne faut pas s'en priver, ça facilite la lecture...

Concernant ton code, l'erreur vient de l'utilisation de la fonction "format()", qui renvoie un texte et non un nombre. Si ta cellule contient bien une date valide, utilise la fonction VBA "Year()". Ce qui donne :

For i = 156 To Cells(Rows.Count, "B").End(xlUp).Row
    If Cells(i, "K") > 0 And Cells(i, "K") < 1000)) And Year(Cells(i, "F")) < (Year(Now) - 1) Then
        Cells(i, "I") = "PROBLEME"
    ElseIf Cells(i, "K") > 0 And Cells(i, "K") < 200 And Year(Cells(i, "F")) = (Year(Now) - 1) Then
        Cells(i, "I") = "ATTENTE " & Year(Now) - 1
    End If
Next i

Bonjour,

Le forum dispose d'une option de mise en forme du code (bouton </>), il ne faut pas s'en priver, ça facilite la lecture...

Concernant ton code, l'erreur vient de l'utilisation de la fonction "format()", qui renvoie un texte et non un nombre. Si ta cellule contient bien une date valide, utilise la fonction VBA "Year()". Ce qui donne :

For i = 156 To Cells(Rows.Count, "B").End(xlUp).Row
    If Cells(i, "K") > 0 And Cells(i, "K") < 1000)) And Year(Cells(i, "F")) < (Year(Now) - 1) Then
        Cells(i, "I") = "PROBLEME"
    ElseIf Cells(i, "K") > 0 And Cells(i, "K") < 200 And Year(Cells(i, "F")) = (Year(Now) - 1) Then
        Cells(i, "I") = "ATTENTE " & Year(Now) - 1
    End If
Next i

Year(Cells(i, "F")) ne fonctionne pas. J'ai déjà essayé

Si ta cellule contient bien une date valide...

Le problème se situe peut-être à ce niveau... Plusieurs options pour tester ça :

  • Passer ta colonne au format numérique, si un nombre (>40000 en général) s'affiche bien, c'est bien une date
  • Tester la formule sous Excel sur quelques cas : =ANNEE(F157)
  • Décomposer tes conditions dans VBA et afficher le résultat obtenu avec un MsgBox
  • Utiliser l'exécution pas à pas (F8) et contrôler le déroulement du programme
  • Affecter un espion sur les variables à contrôler
  • Utiliser la fonction VBA IsDate(F157) pour contrôler que la valeur est une date

La liste est non exhaustive, mais Excel et VBA sont dotés d'un tas d'outil pour comprendre l'origine d'une erreur...

Comme tu préfères faire un nouveau sujet plutôt que répondre à celui-ci, je suppose que tu n'as pas résolu ton problème.

Merci de joindre un fichier représentatif de ton problème pour pouvoir avancer.

Voici un extrait

2classeur1.xlsx (20.83 Ko)

Chez moi ça fonctionne sans problème... Le format des dates est bon et la formule Year fonctionne, je te renvoie le fichier après avoir fait tourner la macro.

5ajigo-tim.xlsm (27.67 Ko)

Par contre, j'ai passé en commentaire la seconde partie du code, qui n'a pas de sens...

Sub Test()

Dim i As Long

For i = 114 To Cells(Rows.Count, "A").End(xlUp).Row
    If Cells(i, "K") > 0 And Cells(i, "K") < 1000 And Year(Cells(i, "F")) < (Year(Now) - 1) Then
        Cells(i, "I") = "PROBLEME"
    'ElseIf Cells(i, "K") > 0 And Cells(i, "K") < 200 And Year(Cells(i, "F")) = (Year(Now) - 1) Then
    '    Cells(i, "I") = "ATTENTE " & Year(Now) - 1
    End If
Next i

End Sub

En effet, tes conditions sont identiques (ou presque) à la première, ce qui fait que cette partie du code n'est jamais exécutée.

Je ne vois donc pas vraiment dans quel cas tu souhaiterais appliquer ce code.

ça marche lorsque la ligne de départ est non vide. For i=2 to Cells(Rows.Count, "A"). Sinon ça ne marche pas

Ok, mais là c'est un autre problème... Il suffit juste de contrôler que la cellule F contient une date.

Sub Test()

Dim i As Long

For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
    If Not IsEmpty(Cells(i, "F")) Then
        If Cells(i, "K") > 0 And Cells(i, "K") < 1000 And Year(Cells(i, "F")) < (Year(Now) - 1) Then Cells(i, "I") = "PROBLEME"
    End If
Next i

End Sub

Merci. J'ai déjà essayé cette méthode, mais il ne marche pas.

Merci. J'ai déjà essayé cette méthode, mais il ne marche pas.

Effectivement, tu as des espaces dans les cellules sans date, qui ne sont donc pas réellement "vides". Autre solution (testée et fonctionnelle dans ton fichier) :

Sub Test()

Dim i As Long

For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
    If IsDate(Cells(i, "F")) Then
        If Cells(i, "K") > 0 And Cells(i, "K") < 1000 And Year(Cells(i, "F")) < (Year(Now) - 1) Then Cells(i, "I") = "PROBLEME"
    End If
Next i

End Sub

Je précise que la fonction IsDate() faisait partie des possibilités que je t'avais précédemment proposées...

Rechercher des sujets similaires à "comparaison annees"