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

Fonction personnalisée s'exécute deux fois

19 réponses
Avatar
ThierryP
Bonjour le forum et Denis,

J'ai créé une fonction personnalisée qui calcule les N° de semaines d'un mois.

Dans le WorkBook_Open, j'ai :
Range("S_Sem_Mois") = "De la semaine " & Calcul_SemainesDuMois(Date).Premier & " Í  la semaine " & Calcul_SemainesDuMois(Date).Dernier

J'ai créé une structure :
Public Type Semaine
Premier As Integer
Dernier As Integer
End Type
Et ma fonction :
Function Calcul_SemainesDuMois(Jour) As Semaine
Mois = Month(Jour)
Calcul_SemainesDuMois.Premier = NumSemaine(DateSerial(Range("Année"), Mois, 1))
Select Case Mois
Case 1, 3, 5, 7, 8, 10, 12
J = 31
Case 2
J = IIf(Bissextile(Range("Année")), 29, 28)
Case 4, 6, 9, 11
J = 30
End Select
Calcul_SemainesDuMois.Dernier = NumSemaine(DateSerial(Range("Année"), Mois, J))
End Function
La fonction NumSemaine :
Function NumSemaine(D As Date) As Long
D = Int(D)
NumSemaine = DateSerial(Year(D + (8 - Weekday(D)) Mod 7 - 3), 1, 1)
NumSemaine = ((D - NumSemaine - 3 + (Weekday(NumSemaine) + 1) Mod 7)) \ 7 + 1
End Function
Mon souci est que la fonction Calcul_SemainesDuMois s'exécute deux fois.... et je ne sais pas pourquoi !
J'ai essayé de placer un Exit Function mais ça ne change rien.

Si quelqu'un a une explication, je prend !!!
Merci d'avance,

ThierryP

9 réponses

1 2
Avatar
MichD
Le 29/04/22 Í  15:29, Geo a écrit :
De MichD, le 29/04/2022 :
Si une fonction s'exécute 2 fois, c'est qu'elle est appelée 2 fois

ce qui parait bien le cas :
Range("S_Sem_Mois") = "... " & *Calcul_SemainesDuMois*.Premier & " ... "
& *Calcul_SemainesDuMois*.Dernier
C'est d'ailleurs sans doute la première fois que je vois ce type
d'appel, je n'aurais pas imaginé que cela fonctionne.

Bonjour Geo,
C'est une manière particulière d'écrire du code, ce qui compte c'est le
résultat, il doit être au rendez-vous. Dans Excel, il y a souvent
plusieurs formules différentes qui peuvent être appliquées pour un
problème, il en va de même pour une procédure.
SemainesDuMois*.Premier et SemainesDuMois*.Dernier font appel Í  la même
fonction, il y a seulement le paramètre de la fonction qui est changé.
Le créateur a toujours raison!
MichD
Avatar
MichD
Pour qu'un fonction retourne les 2 réponses, on fait comme ceci :
Personnellement, c'est que l'on doit saisir la fonction dans la feuille
de calcul comme une fonction matricielle.
Exemple : A1 = Une date
B2 = la formule : =PremierJourDuMois(A1)
Maintenant, sélectionne les cellules B1:B2 tout en ayant la cellule B1
comme cellule active, et tu valides par Ctrl+ Maj + Enter
Dans la déclaration de la fonction, j'ai ajouté "As Variant" afin de
pouvoir affecter le contenu du tableau T Í  la fonction.
Dans la procédure "PremierJourDuMois", j'ai déclaré T(1 To 2) comme un
tableau (array) pour contenir les 2 réponses attendues.
VoilÍ !
P.S. Je ne peux pas tester, je ne sais pas le résultat que tu veux obtenir!
'----------------------------------------
Function PremierJourDuMois(D As Date) As Variant
Dim T(1 To 2)
T(1) = NumSemaine(DateSerial(Year(D), Month(D), 1))
Select Case Month(D)
Case 1, 3, 5, 7, 8, 10, 12
j = 31
Case 2
j = IIf(Bissextile(Range("Année")), 29, 28)
Case 4, 6, 9, 11
j = 30
End Select
PremierJourDuMois = j
T(2) = NumSemaine(DateSerial(Year(D), Month(D), j))
PremierJourDuMois = T
End Function
'----------------------------------------
Function NumSemaine(D As Date) As Long
D = Int(D)
NumSemaine = DateSerial(Year(D + (8 - Weekday(D)) Mod 7 - 3), 1, 1)
NumSemaine = ((D - NumSemaine - 3 + (Weekday(NumSemaine) + 1) Mod
7)) 7 + 1
End Function
'----------------------------------------
Ce que je n'ai pas compris :
Est-ce possible que le premier jour du mois peut-être différent de 1 ?
Pour trouver le dernier jour du mois, on peut l'obtenir par cette ligne
de code. (La variable "D" est une date reconnue par Excel.
Msgbox DateSerial(Year(D), Month(D) + 1, 0)
Si tu veux trouver le lundi (début de semaine) d'une date donnée :
En A4 : une date
La formule : =SI(JOURSEM(A4;2)=1;A4;(A4-JOURSEM(A4-2)+7)-7)
Si la date saisie en A4 est un lundi, la date de A4 est retournée
Pour obtenir le vendredi de cette date en A4 dans laquelle se trouve
cette date :
=SI(JOURSEM(A4;2)=1;A4;(A4-JOURSEM(A4-2)+7)-3)
Cela en tenant compte du fait que la première journée de la semaine est
un lundi.
MichD
MichD
Avatar
ThierryP
Bonjour Geo,
Je ne date pas d'hier non plus :-):-) !!!!
ThierryP
Avatar
ThierryP
C'est la première fois qu'on me dit que j'ai imaginé un truc qui ne devrait pas fonctionner mais qui fonctionne quand même :-):-)
En fait, c'est tombé en marche !!!!!!!!!!!!
Merci pour tes remarques, je vais tester !
ThierryP
Avatar
ThierryP
Bonjour Denis,
OK, le créateur a toujours raison, mais seulement si il sait ce qu'il fait !!!
Et surtout, si il comprend ce qu'il fait ....... C'est lÍ  mon souci !
Encore merci du retour,
ThierryP
Le créateur a toujours raison!
MichD
Avatar
ThierryP
Bonjour Denis,
Je crois que ton idée d'Array est la bonne, je testerai ça dès lundi, pour l'instant je profite du week-end :-)
Merci encore pour ton suivi !
Thierry
Avatar
ThierryP
Bonjour Geo,
C'est bien ce que je disais, mes maigres connaissances en VBA sont un handicap !
Pourquoi n'y ai-je pas pensé par moi-même ???
Je vais tester ça dès lundi !
ThierryP
Avatar
Geo
De ThierryP, le 30/04/2022 :
Pourquoi n'y ai-je pas pensé par moi-même ???

Ben si tout le monde avait toutes les solutions, il n'y aurait plus de
forums.
Et ce serait bien triste.
Avatar
ThierryP
Bonjour Denis,
En fait, j'ai adapté cette fonction que j'avais créée il y a longtemps Í  un nouveau besoin et je n'ai pas assez réfléchi..... et tu as tout Í  fait raison, le premier jour du mois est forcément le 1 !!!
Comme dit Geo, l'intérêt des forums c'est aussi qu'un oeil extérieur regarde ce que l'on a pondu !
Merci pour ton temps... et ets explications !
ThierryP
1 2