XL 2016 convertir une formule en VBA (calcul de la durée entre 2 dates en jours)

dindin

XLDnaute Occasionnel
Bonjour le forum,

j'essaye depuis ce matin de convertir cette formule en VBA sans succès.

VB:
=SI(ET(B2<>"";C2="");"manque date de fin";SI(ET(B2="";C2="");"";(C2-B2)+1&" jour(s)"))

mon souhait est de calculer la durée selon les conditions suivantes :

1637055266725.png

voici mon code qui a du mal à fonctionner :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Dat1 As Date
Dim Dat2 As Date
Dim nbr_jr As Integer
Dim i As Integer
For i = 1 To 10000
Dat1 = Range("B" & i)
Dat2 = Range("C" & i)

If Not Intersect(Target, Columns("C")) Is Nothing Then
nbr_jr = Dat2 - Dat1
Range("D" & i) = nbr_jr
Cells(Target.Row, 1) = nbr_jr

End If
Next i

End Sub

je joins le fichier

Merci pour votre aide
 

Pièces jointes

  • entre 2 dates.xlsm
    20.4 KB · Affichages: 8

Dranreb

XLDnaute Barbatruc
Bonjour.
VB:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
   Dim L As Long, Dat1 As Variant, Dat2 As Variant
   L = Target.Row
   If Target.Rows.Count > 1 Or L < 2 Or Intersect(Target, [B:C]) Is Nothing Then Exit Sub
   Dat1 = Cells(L, "B").Value
   Dat2 = Cells(L, "C").Value
   If IsDate(Dat1) Then
      If IsDate(Dat2) Then
         Cells(L, "D").Value = Dat2 - Dat1 + 1 & " jour" & IIf(Dat2 > Dat1, "s", "")
      Else
         Cells(L, "D").Value = "Manque date fin"
         End If
   Else
      If IsDate(Dat2) Then
         Cells(L, "D").Value = "Manque date début"
      Else
         Cells(L, "D").Value = Empty
         End If
      End If
   End Sub
 

Phil69970

XLDnaute Barbatruc
Bonjour @dindin

Pourquoi du VBA alors qu'une simple formule fait l'affaire
En D2 mettre cette formule et tirer vers le bas
=SI(B2="";"Manque date en B" & LIGNE(B2);SI(C2="";"Manque date en C" & LIGNE(B2);DATEDIF(B2;C2;"d") & " jour(s)"))

Pour info chez moi entre le 15/12/2021 et le 18/12/2021 cela fait 3 jours :rolleyes: et pas 4 jours
1637059081370.png


Si tu veux absolument que cela fasse 4 jours alors il faut ajouter 1 à ma formule ;)
=SI(B2="";"Manque date en B" & LIGNE(B2);SI(C2="";"Manque date en C" & LIGNE(B2);DATEDIF(B2;C2;"d") +1 & " jour(s)"))

*Merci de ton retour

@Phil69970
 

dindin

XLDnaute Occasionnel
Bonjour.
VB:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
   Dim L As Long, Dat1 As Variant, Dat2 As Variant
   L = Target.Row
   If Target.Rows.Count > 1 Or L < 2 Or Intersect(Target, [B:C]) Is Nothing Then Exit Sub
   Dat1 = Cells(L, "B").Value
   Dat2 = Cells(L, "C").Value
   If IsDate(Dat1) Then
      If IsDate(Dat2) Then
         Cells(L, "D").Value = Dat2 - Dat1 + 1 & " jour" & IIf(Dat2 > Dat1, "s", "")
      Else
         Cells(L, "D").Value = "Manque date fin"
         End If
   Else
      If IsDate(Dat2) Then
         Cells(L, "D").Value = "Manque date début"
      Else
         Cells(L, "D").Value = Empty
         End If
      End If
   End Sub
Bonjour,
Merci pour ton aide.
Je vais essayer de décortiquer ce code un peu complexe pour moi.
 

dindin

XLDnaute Occasionnel
Bonjour @dindin

Pourquoi du VBA alors qu'une simple formule fait l'affaire
En D2 mettre cette formule et tirer vers le bas


Pour info chez moi entre le 15/12/2021 et le 18/12/2021 cela fait 3 jours :rolleyes: et pas 4 jours
Regarde la pièce jointe 1121747

Si tu veux absolument que cela fasse 4 jours alors il faut ajouter 1 à ma formule ;)


*Merci de ton retour

@Phil69970
Bonjour,
je suis d'accord qu'une simple formule suffit, mais c'est la magie du VBA qui m'intéresse et afin que je puisse m'améliorer et apprendre d'avantage.

Par contre entre le 15/12/2021 et le 18/12/2021, c'est bien 4 jours et non pas 3 ( 15, 16 , 17 et 18 ) donc on fait la différence et ajoute 1 au résultat.
Exemple une personne qui travaille du lundi 15 au vendredi 19, on lui paye ses 5 jours et non pas ses 4 jours.
 

Phil69970

XLDnaute Barbatruc
Re

Pour excel datedif ne prends pas en compte le dernier jour car pour excel la journée n'est pas fini le 18/12 dans ton exemple.
Tout dépends de ce que tu veux calculer c'est bien pour ça que j'ai mis la formule avec +1 si tu veux rajouter le dernier jour.
Si tu veux absolument que cela fasse 4 jours alors il faut ajouter 1 à ma formule
De même tu as rajouter +1 à ta formule pour compter le dernier jour.
=SI(ET(B2<>"";C2="");"manque date de fin";SI(ET(B2="";C2="");"";(C2-B2)+1&" jour(s)"))

Voir ici ou ils expliquent bien à la fin de l'article :

==> https://excel-malin.com/tutoriels/excel-fonctions/datedif/

Autrement tu peux aussi faire une formule en VBA comme cela tu auras et du VBA et une formule
[D2].FormulaLocal = "=SI(B2="""";""Manque date en B"" & LIGNE(B2);SI(C2="""";""Manque date en C"" & LIGNE(B2);DATEDIF(B2;C2;""d"") +1 & "" jour(s)""))"

@Phil69970
 

dindin

XLDnaute Occasionnel
Re

Pour excel datedif ne prends pas en compte le dernier jour car pour excel la journée n'est pas fini le 18/12 dans ton exemple.
Tout dépends de ce que tu veux calculer c'est bien pour ça que j'ai mis la formule avec +1 si tu veux rajouter le dernier jour.

De même tu as rajouter +1 à ta formule pour compter le dernier jour.


Voir ici ou ils expliquent bien à la fin de l'article :

==> https://excel-malin.com/tutoriels/excel-fonctions/datedif/

Autrement tu peux aussi faire une formule en VBA comme cela tu auras et du VBA et une formule


@Phil69970
Merci à toi
 

Discussions similaires

Réponses
6
Affichages
202