XL 2013 Tableau de calcul d'intérêts de retard de paiement

Picro

XLDnaute Nouveau
Bonjour,

Ci-joint un tableau qui calcule les intérêts de retard. Il est constitué de 3 onglets : TxIM, IM, et Fer.

J'ai 2 soucis :
1er : sur le calcul du délai de paiement : ce délai commence à courir le 25/11/2015 par exemple et son terme arrive 30 jours plus tard, calendaires. Si la date d'arrivée est un jour férié, un samedi ou un dimanche, on repousse au 1er jour ouvrable suivant. Je suis obligé à mon niveau de m'y prendre en 2 temps :

Sur ma feuille IM :
=SI(JOURSEM(G8+G10)=7;G8+G10+2;SI(JOURSEM(G8+G10)=1;G8+G10+1;G8+G10))

et si jour férié :

=SI(NB.SI(Feries;G12)>0;SI(JOURSEM(G12)=6;G12+3;G12+1);"")

A mon avis, c'est perfectible, et ça ne me met pas à l'abri d'erreurs, outre le fait qu'il y a peut-être une solution pour tout réduire en une seule formule. Je n'ai pas réussi ; à chaque fois, nombre d'arguments trop élevés ou un truc du genre ...

2ème souci : j'ai un tableau dans ma feuille FAC. Ce tableau comprend 5 colonnes. Je voudrais dupliquer la feuille IM en autant de fois que de factures en retard figurant dans la feuille FAC, à partir de critères bien précis que j'ai pris soin de décrire dans le document joint et de données entrantes figurant dans l'onglet FAC.

L'onglet IM qui doit être dupliqué est scindé en 2 parties : les 5 premières cellules sont des données recueillies dans l'onglet FAC, le reste des cellules, c'est des formules de calcul qui doivent être maintenues dans l'opération de duplication.

Voilà, j'ai essayé d'être aussi clair que possible. J'avoue que là, ça me dépasse.

Merci d'avance,
 

Pièces jointes

  • TabIM.xlsm
    52.2 KB · Affichages: 240

Picro

XLDnaute Nouveau
Re : Tableau de calcul d'intérêts de retard de paiement

J'y ai pensé & ai dû écarter cette fonction qui ne tient compte que des jours travaillés; or, le calcul du délai de retard prend en compte les samedis et dimanches. Cdt,
 

Picro

XLDnaute Nouveau
Re : Tableau de calcul d'intérêts de retard de paiement

Pour la seconde question, j'ai recyclé ce code mais ai un problème avec la boucle ; je ne sais pas comment faire pour boucler sur plusieurs cellules :

Sub NommerOnglet()
Dim c As Range
Dim d As Range
Dim e As Range
Dim f As Range
Dim g As Range

Application.ScreenUpdating = False
'On crée les onglets qui sont listés à partir de la cellule
'A2 de l'onglet nommé Liste

Set c = Worksheets("Facture").Range("A4") 'cellule NUM FACTURE de départ
Set d = Worksheets("Facture").Range("B4") 'cellule CLIENT de départ
Set e = Worksheets("Facture").Range("C4") 'cellule DELAI PAIEMENT de départ
Set f = Worksheets("Facture").Range("D4") 'cellule MONTANTS de départ
Set g = Worksheets("Facture").Range("E4") 'cellule DATE RECEPTION de départ

Do Until IsEmpty(c) 'boucle tant que c est vide
Do Until IsEmpty(d)
Do Until IsEmpty(e)
Do Until IsEmpty(f)
Do Until IsEmpty(g)


'on copie le modèle en dernier
Worksheets("IM").Copy After:=Worksheets(ThisWorkbook.Sheets.Count)

With Worksheets(ThisWorkbook.Sheets.Count) 'avec l'onglet créé
.Name = c.Value 'on renomme
'on remplit notre modèle comme on veut...
.Range("D3") = c.Value
.Range("G3") = d.Value
.Range("G10") = e.Value
.Range("G6") = f.Value
.Range("G8") = g.Value

.Range("B25") = Date
End With

Set c = c.Offset(1, 0) 'prochaine ligne
Loop

Application.ScreenUpdating = True
End Sub
 

GerardCalc

XLDnaute Occasionnel
Re : Tableau de calcul d'intérêts de retard de paiement

J'y ai pensé & ai dû écarter cette fonction qui ne tient compte que des jours travaillés; or, le calcul du délai de retard prend en compte les samedis et dimanches. Cdt,

La formule que je t'ai donné répond exactement à ce que tu souhaites :
Si la date d'arrivée est un jour férié, un samedi ou un dimanche, on repousse au 1er jour ouvrable suivant
Regarde bien les arguments de ma formule...
 

Nazim

XLDnaute Junior
Re : Tableau de calcul d'intérêts de retard de paiement

Bonjour,

Pour ton premier problème, voici une macro que j'utilise pour déterminer les jours fériés et les week-end:

Function nb_jours_ouvrés(date_début, date_fin) As Integer

' contrôle dates ------------------------------
If Not IsDate(date_début) Then
MsgBox "la date début n'est pas une date "
Exit Function
End If
If Not IsDate(date_fin) Then
MsgBox "la date fin n'est pas une date "
Exit Function
End If
If date_fin < date_début Then
MsgBox "la date fin n'est pas supérieure à la date début "
Exit Function
End If

' nb jours calendaires ------------------------------
nb_jours_calendaires = date_fin - date_début

' détection jours non ouvrés ------------------------------
nb_jours_non_ouvrés = 0
For date_i = date_début To date_fin
If DatePart("w", date_i, vbMonday) = 6 _
Or DatePart("w", date_i, vbMonday) = 7 _
Or date_i = premier_jour_année(Year(date_i)) _
Or date_i = lundi_Paques(Year(date_i)) _
Or date_i = premier_mai(Year(date_i)) _
Or date_i = huit_mai(Year(date_i)) _
Or date_i = jeudi_Ascension(Year(date_i)) _
Or date_i = lundi_Pentecote(Year(date_i)) _
Or date_i = fête_nationale(Year(date_i)) _
Or date_i = onze_novembre(Year(date_i)) _
Or date_i = noël(Year(date_i)) Then
nb_jours_non_ouvrés = nb_jours_non_ouvrés + 1
End If
Next
'---------------------------------------------------------------

' nb jours ouvrés ------------------------------
nb_jours_ouvrés = nb_jours_calendaires - nb_jours_non_ouvrés

End Function


Function premier_jour_année(année As Integer) As String

premier_jour_année = DateSerial(année, 1, 1)

End Function



Function premier_mai(année As Integer) As String

premier_mai = DateSerial(année, 5, 1)

End Function



Function huit_mai(année As Integer) As String

huit_mai = DateSerial(année, 5, 8)

End Function


Function fête_nationale(année As Integer) As String

fête_nationale = DateSerial(année, 7, 14)

End Function


Function onze_novembre(année As Integer) As String

onze_novembre = DateSerial(année, 11, 11)

End Function
Function noël(année As Integer) As String

noël = DateSerial(année, 12, 25)

End Function


Function lundi_Paques(année As Integer) As String

lundi_Paques = DateAdd("d", 1, date_Paques(année))

End Function



Function jeudi_Ascension(année As Integer) As String

jeudi_Ascension = DateAdd("d", 39, date_Paques(année))

End Function




Function lundi_Pentecote(année As Integer) As String

lundi_Pentecote = DateAdd("d", 50, date_Paques(année))

End Function




Function date_Paques(année As Integer) As String

Dim a, b, c, d, e, f, g, h, i, k, l, m, r, mois, jour
a = année Mod 19
b = année \ 100
c = année Mod 100
d = b \ 4
e = b Mod 4
f = (b + 8) \ 25
g = (b - f + 1) \ 3
h = (19 * a + b - d - g + 15) Mod 30
i = c \ 4
k = c Mod 4
l = (32 + 2 * e + 2 * i - h - k) Mod 7
m = (a + 11 * h + 22 * l) \ 451
r = (114 + h + l - 7 * m)
mois = r \ 31
jour = r Mod 31 + 1

date_Paques = DateSerial(année, mois, jour)

End Function
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 925
Membres
101 841
dernier inscrit
ferid87