Je ne comprend pas l'erreur dans ma formule "DateDiff"

Résolu/Fermé
theo1222 - Modifié le 14 déc. 2020 à 21:43
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 - 14 déc. 2020 à 22:51
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
A voir également:

2 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
14 déc. 2020 à 21:25
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...


0
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 ?
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > theo1222
Modifié le 14 déc. 2020 à 22:28
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
0
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 !
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
14 déc. 2020 à 22:43
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 !
0
theo1222 Messages postés 11 Date d'inscription dimanche 29 novembre 2020 Statut Membre Dernière intervention 14 décembre 2020 > jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024
14 déc. 2020 à 22:45
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 !!
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > theo1222 Messages postés 11 Date d'inscription dimanche 29 novembre 2020 Statut Membre Dernière intervention 14 décembre 2020
14 déc. 2020 à 22:51
N'oublie pas de marquer la discussion en RESOLUE
0