Macro/Fonction ou formule pour cpter le nbr de mois entre deux dates..si...

Christian0258

XLDnaute Accro
Bonsoir à tout le forum,

Je souhaiterais votre aide pour ce cas...lol...presque tout est dans le titre et le fichier joint est plus détaillé.

Je vous remercie pour le temps que vous voudrez bien vouloir m'accorder.

Bien amicalement,

Christian
 

Pièces jointes

  • Nbr de mois entre deux dates, si + 15 jrs travaillés dans mois ....xlsx
    10.9 KB · Affichages: 27

ROGER2327

XLDnaute Barbatruc
Re : Macro/Fonction ou formule pour cpter le nbr de mois entre deux dates..si...

Bonsoir Christian0258.


Essayez ceci :​
VB:
=(C3-FIN.MOIS(C3;-1)>15)+(FIN.MOIS(B3;0)-B3>14)
+12*(ANNEE(C3)-ANNEE(B3))+MOIS(C3)-MOIS(B3)-1


Bonne nuit.


ℝOGER2327
#7475


Vendredi 27 Gidouille 141 (Sainte Gandouse, hygiéniste - fête Suprême Quarte)
23 Messidor An CCXXII, 8,7742h - haricot
2014-W28-5T21:03:29Z
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro/Fonction ou formule pour cpter le nbr de mois entre deux dates..si...

Bonsoir le fil, bonsoir le forum,

Je viens de me taillader les veines avec ma souris et de mon sang noir j'ai écrit sur mon écran "Roger m'a tué"...

Mais bon, puisque j'y ai travaillé dessus, je t'envoie quand même une proposition, impressionnante de complexité, avec le code ci-dessous :

Code:
Sub Macro1()
Dim O As Object 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim D1 As Date 'déclare la variable D1 (Date 1)
Dim D1b As Date 'déclare la variable D1b (Date 1 bis)
Dim D1t As Date 'déclare la variable D1t (Date 1 ter)
Dim CP1 As Integer 'déclare la variable CP1 (ComPensation 1)
Dim D2 As Date 'déclare la variable D2 (Date 2)
Dim D2b As Date 'déclare la variable D2b (Date 2 bis)
Dim D2t As Date 'déclare la variable D2t (Date 2 ter)
Dim CP2 As Integer 'déclare la variable CP2 (ComPensation 2)
Dim DD As Date 'déclare la variable DD (Date Début mois)
Dim X As Date 'déclare la variable X (incrément)
Dim M As Integer 'déclare la variable M (Mois)

Set O = Sheets("Feuil1") 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit la dernière ligne éditée Dl de la colonne 2 (=B) de l'onglet O
Set PL = O.Range("B3:B" & DL) 'définit la plage PL
For Each CEL In PL 'boucle 1 sur toutes les cellules CEL de la plage PL
    'définit la date D1
    D1 = DateSerial(Year(CEL.Value), Month(CEL.Value), Day(CEL.Value)) 'date de Début de période
    'définit la date D1b
    D1b = DateSerial(Year(D1), Month(D1) + 1, 0) 'date du dernier jour du mois de la date D1
    'définit la date D1t
    D1t = D1b + 1 'date du premier jour du mois suivant de la date d1
    'si le nombre de jour dans le mois du début de période est supérieur à 15 alors CP1=1 sinon CP1 vaut 0
    If (D1b - D1) + 1 > 15 Then CP1 = 1 Else CP1 = 0
    'définit la date D2
    D2 = DateSerial(Year(CEL.Offset(0, 1).Value), Month(CEL.Offset(0, 1).Value), Day(CEL.Offset(0, 1).Value)) 'date de fin de période
    'définit la date D2b
    D2b = DateSerial(Year(D2), Month(D2), 1) 'date du premier jour du mois de la date D2
    'définit la date D2t
    D2t = DateSerial(Year(D2), Month(D2), 0) 'date du dernier jour du mois précédant de la date D2
    'si le nombre de jour dans le mois du fin de période est supérieur à 15 alors CP2=1 sinon CP2 vaut 0
    If (D2 - D2b) + 1 > 15 Then CP2 = 1 Else CP2 = 0
    M = 0 'initialise le mois M
    For X = D1t To D2t 'boucle 2 : du 1er au dernier jour de la prériode sans compter ni le mois de début ni le mois de fin de période
        DD = DateSerial(Year(D1t), Month(D1t) + M, 1) 'définit la date de début DD (avec la variable M du mois)
        If DD > D2t Then Exit For 'si la date de début DD est supérieure à la date de fin de boucle D2t, sort de la boucle
        'condition : si le mois de la date X est différent du mois de la date de début DD, incrémente M
        If Month(DateSerial(Year(X), Month(X) + M, Day(X))) <> Month(DD) Then M = M + 1
    Next X 'prochaine date de la boucle 2
    CEL.Offset(0, 2).Value = M + CP1 + CP2 'renvoie dans la colonne D le calcul du nombre de mois
Next CEL 'prochaine cellule de la boucle 1
End Sub
Au passage, tu t'étais planté dans la ligne 4 qui donne 9 mois comme résultat et 10 mois si année bissextile...
Ton fichier :
 

Pièces jointes

  • Christian_v01.xlsm
    22.4 KB · Affichages: 29
  • Christian_v01.xlsm
    22.4 KB · Affichages: 31
  • Christian_v01.xlsm
    22.4 KB · Affichages: 29
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Macro/Fonction ou formule pour cpter le nbr de mois entre deux dates..si...

Suite... (Bonjour Robert !)


Une autre proposition par VBA :​
VB:
Function toto(d1 As Date, d2 As Date)

    If d2 >= d1 And d1 * d2 Then toto = 12 * (Year(d2) - Year(d1)) + Month(d2) - Month(d1) - (d2 - DateSerial(Year(d2), Month(d2), 0) > 15) - (DateSerial(Year(d1), Month(d1) + 1, 0) - d1 > 14) - 1 Else toto = ""
End Function

Sub tata()
Dim c&, i&, v()
Const Adr$ = "B2" 'Entête de la première colonne de données.
'Avec Adr = "B2", les résultats sont dans la colonne D, à partir de la ligne 3.

    c = Cells(Rows.Count, Range(Adr).Column).End(xlUp).Row
    If c > Range(Adr).Row Then
        v = Range(Cells(Range(Adr).Row + 1, Range(Adr).Column), Cells(c, Range(Adr).Column + 1)).Value
        For i = 1 To UBound(v)
            If IsDate(v(i, 1)) And IsDate(v(i, 2)) Then v(i, 1) = toto(CDate(v(i, 1)), CDate(v(i, 2))) Else v(i, 1) = Empty
        Next
        Range(Cells(Range(Adr).Row + 1, Range(Adr).Column + 2), Cells(c, Range(Adr).Column + 2)).Value = v
    End If

End Sub


Bonne nuit.


ℝOGER2327
#7476


Samedi 28 Gidouille 141 (Poche du Père Ubu - Vacuation)
24 Messidor An CCXXII, 0,3808h - orcanète
2014-W28-6T00:54:50Z
 

Pièces jointes

  • Christian_v01.xlsm
    30.5 KB · Affichages: 39
  • Christian_v01.xlsm
    30.5 KB · Affichages: 41
  • Christian_v01.xlsm
    30.5 KB · Affichages: 40

job75

XLDnaute Barbatruc
Re : Macro/Fonction ou formule pour cpter le nbr de mois entre deux dates..si...

Bonjour Christian, Roger, Robert,

Eh oh les amis Christian a écrit :

le mois et considéré entier si plus de 15 jours travaillées...

Nulle part je ne vois traiter les week-ends et les jours fériés :confused:

Cela me paraît nécessaire pour le 1er et le dernier mois...

A+
 

job75

XLDnaute Barbatruc
Re : Macro/Fonction ou formule pour cpter le nbr de mois entre deux dates..si...

Re,

Formule en D3 utilisant NB.JOURS.OUVRES :

Code:
=SI(C3<B3;"";12*(ANNEE(C3)-ANNEE(B3))+MOIS(C3)-MOIS(B3)+SI(12*(ANNEE(C3)-ANNEE(B3))+MOIS(C3)-MOIS(B3);(NB.JOURS.OUVRES(B3;DATE(ANNEE(B3);MOIS(B3)+1;0);Fériés)>15)+(NB.JOURS.OUVRES(DATE(ANNEE(C3);MOIS(C3);0)+1;C3;Fériés)>15);NB.JOURS.OUVRES(B3;C3;Fériés)>15))
Avec des jours fériés "normaux" tous les mois comportent plus de 15 jours ouvrés.

A+
 

ROGER2327

XLDnaute Barbatruc
Re : Macro/Fonction ou formule pour cpter le nbr de mois entre deux dates..si...

Bonjour à tous.

Re...


Certes l'énoncé est ambigu. Mais les exemples donnés par Christian0258 dans son classeur montrent clairement qu'il n'y a pas lieu de s'embarrasser avec des vieilleries. Tout le monde sait que l'économie de ce pays (c'est comme ça qu'on dit car l'appeler par son nom serait une grossiéreté) ne saurait s'encombrer de subtiles distinctions entre samedis, dimanches, fêtes et autres jours.

Ne soyons pas crispés sur des concepts d'un autre âge et entrons dans la "modernité" : il en va de notre survie !​


Bon dimanche.


ℝOGER2327
#7478


Hunyadi 29 Gidouille 141 (hunyadi gras - Nom d’Ubu - fête Suprême Seconde)
25 Messidor An CCXXII, 3,8857h - pintade
2014-W28-7T09:19:32Z
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 450
Messages
2 109 730
Membres
110 553
dernier inscrit
loic55