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

1721393809656.png
 

Pièces jointes

  • 1721393762441.png
    1721393762441.png
    2.4 KB · Affichages: 2
Solution
Bonjour.
Deux fonctions perso en VBA pour retrouver une date d'après un texte de la
forme Année|Semaine|JourSem et vice versa :
VB:
Function DateAnSemJs(ByVal Z As String, Optional ByVal Sép As String = "|") As Date
   Dim TSpl() As String, An As Long, Sm As Integer, Js As Integer
   TSpl = Split(Z, Sép): An = TSpl(0): Sm = TSpl(1): Js = TSpl(2)
   DateAnSemJs = DateSerial(An, 1, 1)
   DateAnSemJs = DateAnSemJs - WorksheetFunction.Weekday(DateAnSemJs, 3)
   DateAnSemJs = DateAnSemJs + 7 * (Sm - 1) + Js - 1
   End Function
Function AnSemJsDate(ByVal Dt As Date, Optional ByVal Sép As String = "|") As String
   AnSemJsDate = Year(Date) & Sép & WorksheetFunction.IsoWeekNum(Dt) & Sép & Weekday(Dt, vbMonday)
   End Function
Il vous suffira...

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
23
Affichages
730
Réponses
7
Affichages
524

Membres actuellement en ligne

Statistiques des forums

Discussions
313 769
Messages
2 102 234
Membres
108 181
dernier inscrit
Chr1sD