Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Fonction inverse de JOURS360

4 réponses
Avatar
2buches
Bonjour,
Excel propose une fonction « JOURS360 » qui renvoie le nombre de jours entre 2 dates en considérant tous les mois à 30 jours.

Exemple : JOURS360(30/01/2015 ; 02/02/2015 ;1)= 2 ( =01/02 et 02/02, le 31/01 n’étant pas compté)
je souhaiterais créer la fonction inverse sous macro qui me renverrait une date donnée si en entrée, je lui donnais une date et un nombre de jours (toujours en considérant des mois de 30 jours)

Je souhaiterais dénommer cette fonction INVERSE360. Ainsi INVERSE360 (30/01/2015 ;2) donnerai la date du 02/02/2015. Autre exemple, INVERSE360 (28/02/2015 ; 3) renverrai le 01/03/2015.

La macro pourrait s’articuler comme cela :

Function INVERSE360(Date, Nombre)

Dim iCas
If JOURS360(Date, iCas, 1) = Nombre Then INVERSE360 = iCas

End Function

Mais il me manque certaines notions de syntaxe pour terminer ce petit programme ?
Quelqu'un pourrait-il m'assister pour inclure les qqes lignes manquantes?
Merci d'avance,

Cordialement

4 réponses

Avatar
MichD
Bonjour,

Copie cette fonction personnalisée dans un MODULE STANDARD

'---------------------------------------------------------------------
Function INVERSE360(D As Date, Nbjours As Long)
Dim M As Long, X As Long, A As Long
M = Month(D + Nbjours) - Month(D)

For A = 1 To M
X = Day(DateSerial(Year(D), Month(D) + A, 0))
Select Case X
Case 28
Nbjours = Nbjours - 2
Case 29
Nbjours = Nbjours - 1
Case 31
Nbjours = Nbjours + 1
End Select
Next
INVERSE360 = DateSerial(Year(D), Month(D), Day(D) + Nbjours)
End Function
'---------------------------------------------------------------------

Et dans la cellule de ton choix, tu saisis la formule suivante,
La cellule contenant la formule doit être au format "DATE" de ton choix
=INVERSE360(A1;C4)

A1 est un format date reconnue par Excel
C4 la cellule contenant le nombre de jours
Avatar
MichD
OUPS ! Il en manque un petit bout à la fonction :

'--------------------------------------------------------------------------------------------------
Function INVERSE360(D As Date, Nbjours As Long)
Dim M As Long, X As Long, A As Long
M = Month(D + Nbjours) - Month(D)


For A = 1 To M
X = Day(DateSerial(Year(D), Month(D) + A, 0))
Select Case X
Case 28
Nbjours = Nbjours - 2
Case 29
Nbjours = Nbjours - 1
Case 31
Nbjours = Nbjours + 1
End Select
Next
If Day(DateSerial(Year(D), Month(D), Day(D) + Nbjours)) = 31 Then
INVERSE360 = DateSerial(Year(D), Month(D), Day(D) + Nbjours + 1)
Else
INVERSE360 = DateSerial(Year(D), Month(D), Day(D) + Nbjours)
End If
End Function
'--------------------------------------------------------------------------------------------------

"MichD" a écrit dans le message de groupe de discussion : mu0oh2$169$

Bonjour,

Copie cette fonction personnalisée dans un MODULE STANDARD

'---------------------------------------------------------------------
Function INVERSE360(D As Date, Nbjours As Long)
Dim M As Long, X As Long, A As Long
M = Month(D + Nbjours) - Month(D)

For A = 1 To M
X = Day(DateSerial(Year(D), Month(D) + A, 0))
Select Case X
Case 28
Nbjours = Nbjours - 2
Case 29
Nbjours = Nbjours - 1
Case 31
Nbjours = Nbjours + 1
End Select
Next
INVERSE360 = DateSerial(Year(D), Month(D), Day(D) + Nbjours)
End Function
'---------------------------------------------------------------------

Et dans la cellule de ton choix, tu saisis la formule suivante,
La cellule contenant la formule doit être au format "DATE" de ton choix
=INVERSE360(A1;C4)

A1 est un format date reconnue par Excel
C4 la cellule contenant le nombre de jours
Avatar
2buches
Le jeudi 24 Septembre 2015 à 11:59 par 2buches :
Bonjour,
Excel propose une fonction « JOURS360 » qui renvoie le nombre de
jours entre 2 dates en considérant tous les mois à 30 jours.

Exemple : JOURS360(30/01/2015 ; 02/02/2015 ;1)= 2 ( /02 et 02/02, le 31/01
n’étant pas compté)
je souhaiterais créer la fonction inverse sous macro qui me renverrait
une date donnée si en entrée, je lui donnais une date et un
nombre de jours (toujours en considérant des mois de 30 jours)

Je souhaiterais dénommer cette fonction INVERSE360. Ainsi INVERSE360
(30/01/2015 ;2) donnerai la date du 02/02/2015. Autre exemple, INVERSE360
(28/02/2015 ; 3) renverrai le 01/03/2015.

La macro pourrait s’articuler comme cela :

Function INVERSE360(Date, Nombre)

Dim iCas
If JOURS360(Date, iCas, 1) = Nombre Then INVERSE360 = iCas

End Function

Mais il me manque certaines notions de syntaxe pour terminer ce petit programme
?
Quelqu'un pourrait-il m'assister pour inclure les qqes lignes manquantes?
Merci d'avance,

Cordialement


Bonjour

Merci pour la réactivité!

J'ai testé la macro. Elle fonctione correctement dans l'ensemble mais présente une erreur lorsque le résultat est le 29 février
Ex : INVERSE360 (01/01/2015; 58) = 01/03/2015 au lieu du 28/02/2015
Idem INVERSE360(01/02/2015; 28) = 27/02/2015 au lieu du 29/02/2015.

C'est pour cela que j'aurai eu tendance à créer la fonction sur la base d'une récurrence autour de la fonction JOURS360 (qui quant à elle fonctionne correctement) en testant 1 à 1 les solutions jusqu'à l'obtention de la bonne réponse.

Mais peut être n'est ce pas possible?

Stéphane
Avatar
MichD
A ) INVERSE360(01/02/2015; 28) = 27/02/2015 au lieu du 29/02/2015.
**** L'an 2015 n'est pas bissextil et par conséquent la date du 29/02/2015 n'existe pas

B ) INVERSE360 (01/01/2015; 58) = 01/03/2015 au lieu du 28/02/2015
**** J'ai modifié la fonction pour tenir compte de ce cas d'exception.
Soustrait de 58, 29 jours pour les additionner à 01/01/2015 = 30/01/2015
les autres 29 jours vont au mois de février et comme dans l'exemple précédent
le mois de février de 2015 ne peut pas avoir plus de 28 jours. Par conséquent
la réponse devrait être 01/03/2015. Non? Explique...

Teste cette fonction à fond dans une feuille et s'il y a des problèmes, publie ton
classeur en utilisant le site Web Cjoint.com et tu nous retransmets l'adresse ici.

'----------------------------------------------------------------
Function INVERSE360(D As Date, Nbjours As Long)
Dim M As Long, X As Long, A As Long

M = Month(D + Nbjours) - Month(D)
If Month(D) = 2 And Day(D) + Nbjours = 29 And _
Day(DateSerial(Year(D), Month(D), 0)) <> 29 Then
Nbjours = Nbjours + 2
End If

For A = 1 To M
X = Day(DateSerial(Year(D), Month(D) + A, 0))
Select Case X
Case 28
Nbjours = Nbjours - 2
Case 29
Nbjours = Nbjours - 1
Case 31
Nbjours = Nbjours + 1
End Select
Next
If Day(DateSerial(Year(D), Month(D), Day(D) + Nbjours)) = 31 Then
INVERSE360 = DateSerial(Year(D), Month(D), Day(D) + Nbjours + 1)
Else
INVERSE360 = DateSerial(Year(D), Month(D), Day(D) + Nbjours)
End If
End Function
'----------------------------------------------------------------