Function PourLeMois(xMois As Date, xDebut As Range, xFin As Range, xMontant As Range)
Dim tdeb, tfin, tval, debmois As Date, finmois As Date, i&, j&, res#, aux, D As Date, F As Date
'>>>>>>>> initialisation des variables <<<<<<<<
tdeb = xDebut.Value ' array des dates de début des factures (si élément unique, on le convertit en array)
If Not IsArray(tdeb) Then aux = tdeb: ReDim tdeb(1 To 1, 1 To 1): tdeb(1, 1) = aux
tfin = xFin.Value ' array des dates de fin des factures (si élément unique, on le convertit en array)
If Not IsArray(tfin) Then aux = tfin: ReDim tfin(1 To 1, 1 To 1): tfin(1, 1) = aux
tval = xMontant.Value ' array des montants des factures (si élément unique, on le convertit en array)
If Not IsArray(tval) Then aux = tval: ReDim tval(1 To 1, 1 To 1): tval(1, 1) = aux
debmois = DateSerial(Year(xMois), Month(xMois), 1) ' date début du mois
finmois = DateSerial(Year(xMois), Month(xMois) + 1, 1) - 1 ' date fin du mois
'>>>>>>>> Calcul de Res = le total des montants des factures au prorata du mois xMois <<<<<<<<
For i = 1 To UBound(tdeb) ' pour chaque facture
' si le mois couvre une partie de la période de la facture
If Not (debmois > tfin(i, 1) Or finmois < tdeb(i, 1)) Then ' la période Facture et le mois se recouvrent
D = tdeb(i, 1): If debmois >= tdeb(i, 1) Then D = debmois ' borne inférieure de la plage de recouvrement
F = tfin(i, 1): If finmois <= tfin(i, 1) Then F = finmois ' borne supérieure de la plage de recouvrement
res = res + (F - D + 1) * tval(i, 1) / (tfin(i, 1) - tdeb(i, 1) + 1) ' ajout du montant de la période
End If ' (au prorata des jours communs)
Next i
PourLeMois = res ' on indique à la function quoi retourner
End Function