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,
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
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é.
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
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
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.
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
ThierryP
Bonjour Geo, Je ne date pas d'hier non plus :-):-) !!!! ThierryP
Bonjour Geo, Je ne date pas d'hier non plus :-):-) !!!! ThierryP
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
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 !!!!!!!!!!!!
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
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
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,
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
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
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 :-)
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
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
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 !
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
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.
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.
Ben si tout le monde avait toutes les solutions, il n'y aurait plus de forums. Et ce serait bien triste.
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
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 !
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