Je ne comprend pas l'erreur dans ma formule "DateDiff" [Résolu]

Signaler
-
Messages postés
31072
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 janvier 2021
-
Bonjour,
J'essaye de faire une formule pour la calculer la date de différence entre deux date et si celle ci est supérieur à 30 jours le résultat doit être "non" et si c'est inférieur à 30 jours le résultat doit être "oui" mais le problème c'est que vba m'indique à chaque fois "erreur d'incompatibilité" 13

Pouvez-vous m'aider à résoudre ce léger soucis ?

Public Sub SubDatteDif30J()
Dim DateDeDebut As Date
Dim DateDeFin As Date
Dim resultat As String
Sheets("Contrats").Select

For ligne = 2 To 9
DateDeDebut = Cells(ligne, 2).Value
DateDeFin = Cells(ligne, 3).Value
resultat = DateDiff("D", DateDeDebut, DateDeFin)
Next ligne

Sheets("Comptes utilisateurs").Select
For ligne = 2 To 9
    If resultat > 30 Then
    Cells(ligne, 6).Value = "Non"
    Else
    Cells(ligne, 6).Value = "Oui"
    End If

Next ligne

End Sub



Configuration: Windows / Opera 71.0.3770.456

2 réponses

Messages postés
31072
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 janvier 2021
3 187
Bonjour

Je vois plusieurs erreurs dans ton code...
Déjà tu boucles sur les lignes 2 à 9 sur une première feuille pour trouver la différence sur chaque ligne mais tu n'utilise pas ta variable....

Ta seconde boucle le prenant en compte que la dernière valeur retourner dans ta variable le résultat de ta première boucle..

Ensuite, la fonction DATEDIF Renvoie une Variant (Long) qui spécifie le nombre d’intervalles de temps entre deux dates données.... sauf que toi tu as déclaré ta variable résultats en tant que string... d'ou, je suppose, ton message d'erreur...


Tout d'abord merci de réponse,
Je ne suis que débutant en VBA donc que vous dites que je n'utilise pas la variable pour la boucle que voulez-vous dire ?
Messages postés
31072
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 janvier 2021
3 187 > theo1222
Le problème c'est que tu fais deux boucles...

Déjà tu fais
For ligne = 2 To 9
DateDeDebut = Cells(ligne, 2).Value
DateDeFin = Cells(ligne, 3).Value
resultat = DateDiff("D", DateDeDebut, DateDeFin)
Next ligne

Donc, tu boucles de 2 à 9 ... et à chaque tour, tu modifies la valeur de ta variable résultat....
Une fois ta boucle terminée ( donc arrivée à 9 ) ta variable resultat a une valeur qui correspond à cette ligne...

Puis tu refais une seconde boucle
For ligne = 2 To 9
    If resultat > 30 Then
    Cells(ligne, 6).Value = "Non"
    Else
    Cells(ligne, 6).Value = "Oui"
    End If

Next ligne

Sauf que.. dans cette seconde boucle.. ta variable résultat n'a qu'une seule valeur.... celle correspondant à la fin de ta première boucle....


En gros, il faut que tu modifies ton code pour ne faire qu'une seule boucle !
un truc du genre
Public Sub SubDatteDif30J()
  Dim DateDeDebut As Date
  Dim DateDeFin As Date
  Dim resultat As Long
  Sheets("Contrats").Select

  For ligne = 2 To 9
    DateDeDebut = CDate(Sheets("Contrats").Cells(ligne, 2).Value)
    DateDeFin = CDate(Sheets("Contrats").Cells(ligne, 3).Value)
    resultat = DateDiff("D", DateDeDebut, DateDeFin)

    If resultat > 30 Then
      Sheets("Comptes utilisateurs").Cells(ligne, 6).Value = "Non"
    Else
      Sheets("Comptes utilisateurs").Cells(ligne, 6).Value = "Oui"
    End If

  Next 

End Sub
Merci de votre réponse, mais pouvez m'expliquer plus en détail pourquoi deux boucles ne fonctionnent pas alors que c'est une boucle par feuille différente ?
Pour moi c'est logique de faire une boucle pour une feuille et d'en faire une autre pour une autre feuille ?

Je demande pour ne plus faire l'erreur et mieux comprendre, merci vraiment de prendre le temps pour m'aider !
Messages postés
31072
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 janvier 2021
3 187
Imagine que tu as deux boites...
Dans la première tu as 10 pièces.

Tu dois prendre une première pièce, la lancer (et la ratrapper dans ta main ) puis regarder si elle fait pile ou face ...
puis, une fois que tu as regardé de quelle côté elle est tombée.. la poser dans la boite n¨2.

Si on reprend ta logique (le code que tu avais écrit...) ...
tu prends bien les pièces... les lances... regarde leur valeur.... mais au lieu de les poser dans la boite N°2 tu la jette par terre.....jusqu'à la dernière ....
Cette dernière, tu la pose dans la seconde boite .... puis... tu la poses à nouveau dans cette seconde boite... puis encore...
Bref.. à la fin tu n'auras posé (10 fois) que la dernière pièce... toutes les autres étant par terre.....


Je ne vois pas trop comment te l'expliquer autrement.....
Je pense que le plus simple serait que tu exécutes ton code en mode pas à pas et que tu regarde ce qui se passe....
Puis tu fais la même chose avec le code que je t'ai donné .... et là... tu devrais avoir un déclic !
Messages postés
11
Date d'inscription
dimanche 29 novembre 2020
Statut
Membre
Dernière intervention
14 décembre 2020
>
Messages postés
31072
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 janvier 2021

AAaaahhh cette explication beaucoup simpliste est vraiment facile à comprendre, je vois mieux pourquoi c'était pas bon, merci beaucoup !!
vraiment !!
Vous avez-pris tout votre temps pour m'expliquer !!
Messages postés
31072
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 janvier 2021
3 187 >
Messages postés
11
Date d'inscription
dimanche 29 novembre 2020
Statut
Membre
Dernière intervention
14 décembre 2020

N'oublie pas de marquer la discussion en RESOLUE