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

XL 2013 formule Excel pour soustraire 2 dates

onyirimba

XLDnaute Occasionnel
Supporter XLD
Bonjour,

J'ai une question : dans le but d'obtenir une durée entre 2 dates, je souhaite réaliser une soustraction entre 2 dates ci dessous "=V2-U2".
  1. en V2 il s'agit du numéro de semaine et le numéro d'année
  2. en U2 il s'agit de l'une date
Cependant en W2 j'ai une réponse d'erreur,

est-ce que vous avez une solution ?

Merci de votre aide

 

Pièces jointes

  • 1721393762441.png
    2.4 KB · Affichages: 2
Solution
Bonjour,
Si le format de semaine est toujours de 2 chiffres (2024 / 01, 2024 / 15...)
Peut-être ainsi :
Code:
=7*DROITE(V2;2)+DATE(GAUCHE(V2;4);1;3)-JOURSEM(DATE(GAUCHE(V2;4);1;3))+1-U2

Le dernier +1 donne le dimanche, dernier jour de la semaine. Si tu veux le vendredi, tu mets -1
Bonne apm

Dranreb

XLDnaute Barbatruc
Bonjour.
Zut! encore une erreur dans mon poste #13: Year(Date) au lieu de Year(Dt)
Je réécris tout un peu différemment :
VB:
Function AnSemJSDate(ByVal Dt As Date, Optional ByVal Sép As String = "|") As String
   Dim TSpl(): TSpl = ArrayASJ(Dt): TSpl(1) = Format(TSpl(1), "00")
   AnSemJSDate = Join(TSpl, Sép)
   End Function
Function DateAnSemJS(ByVal Z As String, Optional ByVal Sép As String = "|") As Date
   Dim TSpl() As String: TSpl = Split(Z, Sép)
   DateAnSemJS = DateASJ(TSpl(0), TSpl(1), TSpl(2))
   End Function
Function ArrayASJ(ByVal Dt As Date) As Variant()
   ArrayASJ = Array(Year(Dt), WorksheetFunction.IsoWeekNum(Dt), Weekday(Dt, vbMonday))
   End Function
Function DateASJ(ByVal An As Integer, ByVal Sem As Integer, ByVal JS As Integer) As Date
   Dim Dt As Date: Dt = DateSerial(An, 6, 31): Dt = Dt - WorksheetFunction.Weekday(Dt, 3)
   DateASJ = Dt + 7 * (Sem - WorksheetFunction.IsoWeekNum(Dt)) + JS - 1
   End Function
 

Dranreb

XLDnaute Barbatruc
Et encore une erreur dans le calcul de la forme année|semaine|jour de semaine car l'année à y porter n'est pas forcément celle de la date. En effet le 31/12/2024 sera déjà pour 2025 et à l'inverse le 1/1/2027 fera encore partie de 2026. Corrigé :
VB:
Function ArrayASJ(ByVal Dt As Date) As Variant()
   Dim An As Integer, Sem As Integer, JS As Integer
   JS = Weekday(Dt, vbMonday): Sem = WorksheetFunction.IsoWeekNum(Dt): An = Year(Dt + IIf(Sem = 1, 7, 1) - JS)
   ArrayASJ = Array(An, Sem, JS)
   End Function
Edition. Dernière version :
Code:
Function ArrayASJ(ByVal Dt As Date) As Variant()
   Dim Sem As Integer, JS As Integer, An As Integer
   Sem = WorksheetFunction.IsoWeekNum(Dt): JS = Weekday(Dt, vbMonday)
   An = Year(Dt) + (Month(Dt) = 12) * (Sem = 1) - (Month(Dt) = 1) * (Sem > 50)
   ArrayASJ = Array(An, Sem, JS)
   End Function
 
Dernière édition:

Discussions similaires

Réponses
4
Affichages
300
Réponses
10
Affichages
404
Réponses
23
Affichages
908
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…