Calcule du nombre de jours par mois de présence

Bonjour

On me demande de calculer le nombre de jours de présence des résidents par mois de présence :

NomPrénomDate de naissanceDate d'arrivéeDate de départNombre de jours de présenceJanvierFévrierMars
DA I10/06/0227/07/1811/03/201 ans 7 mois 13 jours312911
CS31/12/0212/10/18 1 ans 10 mois 0 jours312931
BK K 30/11/1815/01/201 ans 1 mois 16 jours1500
SL31/11/0230/11/1817/01/201 ans 1 mois 18 jours1700
BM Y 30/11/1814/02/201 ans 2 mois 15 jours31140
BB10/12/0230/11/1806/04/201 ans 4 mois 7 jours312931
MA24/12/0130/11/1827/05/201 ans 5 mois 27 jours312931
BT02/04/0430/11/1807/07/201 ans 7 mois 7 jours312931

Sauf qu'il y a bon nombre de personne. Je pensais utiliser datedif mais comment le placer pour ne pas avoir un écart total entre l'arrivée et le départ mais le nombre de jour pour chaque mois, sachant que les résident peuvent arriver n'importe quel jour?

Merci d'avance

Bonjour Theyoshi,

Voyez si la solution proposée dans les fichier joint peut vous aider

376theyoshi.xlsx (7.08 Ko)

Bonjour à tous

Tu n'as pas précisé si c'est par Année et mois ou juste par mois en mélangeant les années

Solution PowerQuery qui fait les 2 (PowerQuery est intégré à Excel à partir de 2016 et en add on à partir de 2010)

Bonjour à tous,

Une autre proposition Power Query à adapter !

Le résultat est sous forme de TCD.

Cdlt.

107theyoshi.xlsx (36.18 Ko)

Bonjour

Malheureusement la version d'excel est 2013 sur un serveur, je ne peux ajouter d'add on.

Pour ajouter des précisions, je voudrais les jours d'occupation sur l'année en cours, sachant que certains résidant peuvent arriver cette année. Dans ce cas la formule de njhub est incomplète

Bonjour Theyoshi,

Pour ajouter des précisions, je voudrais les jours d'occupation sur l'année en cours, sachant que certains résidant peuvent arriver cette année. Dans ce cas la formule de njhub est incomplète

Voyez si la solution proposée pour pallier l'imprécision de votre demande initiale, concernant le total des jours pour l'année en cours, peut vous aider

=SI(DATEDIF(DATE(ANNEE(E2);1;1);E2;"m")>=1;DATEDIF(DATE(ANNEE(E2);1;1);E2;"m")&" mois "&DATEDIF(DATE(ANNEE(E2);1;1);E2;"md")+1&" jours";DATEDIF(DATE(ANNEE(E2);1;1);E2;"md")+1&" jours")

Merci de votre patience.

Je suis désolé, je ne suis vraiment pas clair. Je recommence. Votre première proposition était bonne mais par manque de données incomplète.

Je voudrais la même pour ce tableau plus complet (les mois sont ceux de l'année en cours):

NomPrénomDate de
naissance
Date d'
arrivée
Date de
départ
Nombre de jours
de présence
janvierfévriermarsavrilmaijuinjuilletaoûtseptembreoctobrenovembredécembre
DA I10/06/0227/07/1811/03/20
CS31/12/0230/01/18
BK K30/01/1915/01/20
SL30/11/0230/01/19
BM Y30/01/2014/02/20
BB10/12/0231/01/2006/04/20

J'avais commencé cela mais ça devient illisible :

=SI(ANNEE($D3)<ANNEE(G$1);SI(ESTVIDE($E3);JOUR(DATE(ANNEE(G$1);MOIS(G$1)+1;0));SI($E3>FIN.MOIS(G$1;0);DATEDIF(G$1;FIN.MOIS(G$1;0);"d")+1;SI(MOIS($E3)=MOIS(G$1);DATEDIF(G$1;$E3;"d")+1;SI($E3<G$1;""))));SI(ESTVIDE($E3);"après 2020 sans départ";"après 2020 avec départ"))

Re,

Une proposition VBA à étudier avec un résultat sous forme TCD (tableau croisé dynamique).

ALT F8 et exécuter la procédure main.

Cdlt.

Public Sub Main()
Dim pt As PivotTable
Dim lo As ListObject
Dim tbl, arr()
Dim r As Range, rngGroup As Range
Dim endDate As Long, startDate As Long
Dim I As Long, J As Long, k As Long

    tbl = Range("Input").Value
    Set lo = Range("Output").ListObject
    Set pt = Worksheets("Output").PivotTables(1)

    With lo
        If Not .DataBodyRange Is Nothing Then .DataBodyRange.Delete
        Set r = .InsertRowRange.Cells(1)
    End With

    For I = LBound(tbl) To UBound(tbl)
        If IsDate(tbl(I, 4)) And VBA.Year(tbl(I, 4)) < VBA.Year(Date) Then
            startDate = CLng(DateSerial(VBA.Year(Date), 1, 1))
        Else
            startDate = CLng(tbl(I, 4))
        End If
        If IsDate(tbl(I, 5)) And VBA.Year(tbl(I, 5)) > VBA.Year(Date) Then
            endDate = CLng(DateSerial(VBA.Year(Date), 12, 31))
        ElseIf IsDate(tbl(I, 5)) And VBA.Year(tbl(I, 5)) = VBA.Year(Date) Then
            endDate = CLng(tbl(I, 5))
        Else
            endDate = CLng(VBA.DateAdd("d", -1, Date))
        End If
        For J = startDate To endDate
            ReDim Preserve arr(2, k + 1)
            arr(0, k) = tbl(I, 1) & ", " & tbl(I, 2)
            arr(1, k) = J
            k = k + 1
        Next J
    Next

    If k > 0 Then r.Resize(k, 2).Value = Application.Transpose(arr)

    With pt
        .PivotCache.Refresh
        Set rngGroup = .PivotFields("Dates").DataRange
        rngGroup.Cells(1).Group Periods:=Array(False, False, False, False, True, False, False)
    End With

End Sub

Du très bon travail, bien que je ne sois pas à même de bien évaluer puisque je ne connais pas les tableaux croisés.

J'ai déplacer la feuille Output et Input sur mon tableur de base, et la l'erreur

la méthode range de l'objet _global a échoué

sur la ligne

    tbl = Range("Input").Value

Pouvez vous m'aider sur cette erreur, je ne connais pas ce codage

Bonjour,

Input et Output sont 2 tableaux structurés. Voir le gestionnaire de noms.

Cdlt.

Merci Jean Eric pour votre aide, un arrêt de travail inopiné m'a empêché de vous répondre avant.

J'ai essayé d'adapter cotre code, mais j'ai une erreur code 13. Je vous mets la feuille excel utilisée si vous avez le temps d'y jeter un œil.

Merci beaucoup

Bonjour,

La procédure Main est fonctionnelle.

Ce sont les données du tableau archives qui posent problème. Supprime les lignes en jaune et lance la procédure.

Cdlt.

Pour ajouter des précisions, je voudrais les jours d'occupation sur l'année en cours, sachant que certains résidant peuvent arriver cette année. Dans ce cas la formule de njhub est incomplète

Autre solution

=MAX(0;MIN(FIN.MOIS(F$1;0);$E2)-MAX(FIN.MOIS(F$1;-1);$D2-1))
75theyoshi.xlsx (10.75 Ko)

quand on peut faire simple ... sauf si un élément m'échappe !

Rechercher des sujets similaires à "calcule nombre jours mois presence"