Accueil Fonctions Calc Menu Basic EDI OOo 1.x EDI OOo 2.x EDI LibO - OOo 3.x Affectation touche Affectation icône Etape par étape Macro débutant Fonctions Basic Dialogues OOo1-2 Dialogues LibO-OOo3 Quelques exemples Exemples dialogue Fonctions perso Définitions Recherche sur site


Fonctions personnalisées 2. DATE_DIF

 




Accès direct : page 1, page 2, page 3, page 4,


 

Voici un exemple d'application pratique avec une fonction DATE_DIF qui va calculer des écarts entre 2 dates. Suivant les options possibles, les résultats peuvent être combinés en jours, semaines, mois, années. La syntaxe sera :

DATE_DIF(DateDebut; DateFin; Unite1; Unite2; Unite3; [SemaineDebut; [AnneeDebut]])

Unité Commentaires
Y ou A Le nombre d'années entières comprises dans la période (Y pour compatibilité Excel)
M ou YM La différence entre les mois de DateDebut et DateFin. Les jours et les années des dates ne sont pas pris en compte. (YM pour compatibilité Excel)
D ou J ou MD La différence entre les jours de DateDebut et DateFin. Les mois et les années des dates ne sont pas pris en compte. (D ou MD pour compatibilité Excel)
YD La différence entre les jours de DateDebut et DateFin. Les années des dates ne sont pas prises en compte. (YD pour compatibilité Excel)
W Différences en semaines
WW Différences en semaines. L'option SemaineDebut a une action
SemaineDebut Option. Utile uniquement avec W ou WW
AnneeDebut Option. Utile uniquement avec WW et si SemaineDebut présent
SemaineDebut Commentaires
0 Valeur système par défaut
1 Dimanche (par défaut)
2 Lundi
3 Mardi
4 Mercredi
5 Jeudi
6 vendredi
7 Samedi

 

Cette fonction est librement utilisable et téléchargeable (10 ko) ici : http://christianwtd.free.fr/FicExemple/FonctionsPlus.ods
Il s'agit d'un classeur vide, mais qui contient un module macro intitulé : ModuleFonctionsPlus qui contient les fonctions INITIALES, SUPPRIME_ACCENTS et DATE_DIF
Restriction d'emploi : si un classeur circule entre différents utilisateurs et matériels, il faut soit que les fonctions accompagnent les classeurs, soit que tous les utilisateurs les aient installées.

 

Fonction DATE_DIF (complet)

  1. Function Date_Dif(DateDebut As Variant, DateFin As Variant, Unite1 As String, Optional Unite2 As String, _
    Optional Unite3 As String, Optional SemaineDeb As Variant, Optional AnneeDeb As Integer) As String
  2.   '-----------------------------------
  3.   ' DATE_DIF Préversion Novembre 2006
  4.   ' Le tableur Calc par l'exemple
  5.   ' http://christianwtd.free.fr
  6.   '-----------------------------------
  7.   Dim Txt(3) As String
  8.   '
  9.   If IsMissing(Unite2) Then Unite2=""
  10.   If IsMissing(Unite3) Then Unite3=""
  11.   If IsMissing(SemaineDeb) Then SemaineDeb=0
  12.   If IsMissing(AnneeDeb) Then AnneeDeb=0
  13.   '
  14.   On Error Goto GestionErreurs
  15.   OK = False
  16.   '
  17.   For i = 1 To 3
  18.     If i = 1 Then Unite = Unite1
  19.     If i = 2 Then Unite = Unite2
  20.     If i = 3 Then Unite = Unite3
  21.     Gosub TraiteUnites
  22.   Next i
  23.   '
  24.   If OK = False Then 'aucun paramètre
  25.     Date_Dif = "Err:Date_Dif"
  26.     Exit Function
  27.   Endif
  28.   '
  29.   Dim A1 As Integer, A2 As Integer, AA As Integer
  30.   Dim M1 As Integer, M2 As Integer, MM As Integer
  31.   Dim J1 As Integer, J2 As Integer, JJ As Integer
  32.   '
  33.   A2 = Year(DateFin)
  34.   A1 = Year(DateDebut)
  35.   M2 = Month(DateFin)
  36.   M1 = Month(DateDebut)
  37.   J2 = Day(DateFin)
  38.   J1 = Day(DateDebut)
  39.   '
  40.   'Calcul YD différence en jours, une fois les années soustraites
  41.   Bissextile = ((A1 Mod 100 ‹› 0) And (A1 Mod 4 = 0)) Or (A1 Mod 400 = 0) 'Année début bissextile ?
  42.   YD = DateSerial(A2, M2, J2) - DateSerial(A2, M1, J1)
  43.   If YD0 Then
  44.     YD = (DateSerial(A1, 12, 31) - DateSerial(A1, M1, J1)) + (DateSerial(A2, M2, J2) - DateSerial(A2, 1, 1))
  45.   Endif
  46.   If Bissextile0 Then
  47.     If M12 Then
  48.       YD = YD - Bissextile
  49.     Endif
  50.   Endif
  51.   ' fin YD
  52.   '
  53.   If M2=1 Then
  54.     JourDansMoisFinPrec = 31
  55.   Else
  56.     JourDansMoisFinPrec = DateSerial(A2, M2, 1) - DateSerial(A2, M2-1, 1)
  57.   Endif
  58.   '
  59.   AA = A2-A1
  60.   '
  61.   If M2›=M1 Then
  62.     MM = M2 - M1
  63.   Else
  64.     MM = M2 - M1 + 12
  65.     AA = AA - 1
  66.   Endif
  67.   '
  68.   If (J2-J1)‹0 Then
  69.     JJ = J2 - J1 + JourDansMoisFinPrec
  70.     If MM1 Then
  71.       MM = MM + 11
  72.       AA = AA - 1
  73.     Else
  74.       MM = MM - 1
  75.     Endif
  76.   Else
  77.     JJ = J2 - J1
  78.   Endif
  79.   '
  80.   Assemblage = ""
  81.   For n = 1 to 3
  82.     If n = Jours Then
  83.       Assemblage = Assemblage & JJ & Txt(n)
  84.     Elseif n = Mois Then
  85.       Assemblage = Assemblage & MM & Txt(n)
  86.     ElseIf n = Annees Then
  87.       Assemblage = Assemblage & AA & Txt(n)
  88.     ElseIf n = CasYd Then
  89.       Assemblage = Assemblage & YD & Txt(n)
  90.     ElseIf n = CasW Or n = CasWW Then
  91.       If n = CasW Then Param = "w" Else Param = "ww"
  92.       Assemblage = Assemblage & DateDiff (Param, DateDebut, DateFin , SemaineDeb , AnneeDeb) & Txt(n)
  93.     Endif
  94.   Next n
  95.   '
  96.   Date_Dif = Assemblage
  97.   '
  98.   Exit Function
  99.   '
  100.   '---
  101. TraiteUnites:
  102.   If Unite‹›"" Then
  103.     Pv = Instr(Unite, ",")
  104.     If Pv = 0 Then
  105.       Pv = Instr(Unite, ";")
  106.     Endif
  107.     If Pv0 Then
  108.       TxtLu = Right(Unite, Len(Unite) - Pv)
  109.       UnProv = Ucase(Trim(Left(Unite, Pv-1)))
  110.     Else
  111.       UnProv = Ucase(Trim(Unite))
  112.     Endif
  113.     '
  114.     If UnProv = "Y" Or UnProv = "A" Then
  115.       Annees = i
  116.       Txt(i) = TxtLu
  117.       OK = True
  118.     ElseIf UnProv = "M" Or UnProv = "YM" Then
  119.       Mois = i
  120.       Txt(i) = TxtLu
  121.       OK = True
  122.     ElseIf UnProv = "D" Or UnProv = "J" Or UnProv = "MD" Then
  123.       Jours = i
  124.       Txt(i) = TxtLu
  125.       OK = True
  126.     ElseIf UnProv = "YD" Then 'Excel : diff. jours, une fois les années soustraites
  127.       CasYd = i
  128.       Txt(i) = TxtLu
  129.       OK = True
  130.     ElseIf UnProv = "W" Then
  131.       CasW = i
  132.       Txt(i) = TxtLu
  133.       OK = True
  134.     ElseIf UnProv = "WW" Then
  135.       casWW = i
  136.       Txt(i) = TxtLu
  137.       OK = True
  138.     Endif
  139.   Endif
  140. Return
  141.   '
  142.   '
  143. GestionErreurs:
  144.   'MsgBox "Erreur ligne " & Erl & chr(13) & "Erreur n°" & Err
  145.   If Err = 449 Then 'paramètre absent
  146.     Resume Next
  147.   ElseIf Err = 13 Then
  148.     MsgBox("Incompatibilité de type")
  149.     Exit Function
  150.   Endif
  151.   '
  152. End Function

 

Remarques

 

Cas particulier

Exemple : calcul de différence entre le 31/01/2006 et le 01/03/2006.
=DATE_DIF("31/01/2006"; "01/03/2006"; "a, ans "; " m, mois "; " j, jours") retourne :
0 ans 1 mois -2 jours
Pas simple, mais logique. Il y a bien 1 mois d'écart, mais comme le mois en question n'a que 28 jours, il y a un écart négatif de 2 jours.

Exemples Résultats
=DATE_DIF(A1; B1; "a, ans "; " m, mois "; " j, jours") 3 ans 5 mois 7 jours
=DATE_DIF("01/01/2006"; "01/03/2006"; "m") 2
=DATE_DIF("5/2/2001"; "20/10/2006"; "m") 8
=DATE_DIF("5/2/2001"; "20/10/2006"; "Y; an(s) "; "M; mois "; "D; jour(s)") 5 an(s) 8 mois 15 jour(s)
= DATE_DIF("01/01/2004"; "14/07/2004"; "ww";"";"";5) 27
= DATE_DIF("01/01/2004"; "14/07/2004"; "ww";"";"";2) 28

 

 


 


 

Ce site n'est plus mis à jour. Merci aux nombreux visiteurs depuis 2003. Consultez le Wiki LibreOffice.
   

Le tableur Calc par l'exemple : christianwtd@free.fr
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.0 France License.

  .

Site optimisé pour Firefox

Dernière modification : 29/08/2010 à 18h47


Déjà plusieurs visites sur ce site depuis quelque temps (au moins vous et moi)

Compteur non certifié