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

10 réponses

1 2
Avatar
MichD
Le 29/04/22 Í  04:36, ThierryP a écrit :
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

Bonjour,
A ) les fonctions vont dans un module standard. Tu peux les placer dans
un module feuille, si une procédure de ce module requiert exclusivement
cette fonction.
B ) je ne comprends pas ce que tu veux obtenir, tu utilises des
"expressions" dans les fonctions qui n'ont rien Í  voir avec le VBA.
Une fonction pour déterminer si une année est bissextile ou non :
Pour qu'une année soit bissextile, elle doit respecter 2 conditions :
Le mois de cette année doit avoir 29 jours.
L'année 1900 n'est pas bissextile, on le teste par :
Application.mod(Année, 400) = 0
'---------------------------
Function EstBissextile(MaDate As Date) As Boolean
Dim Année As Long, Mois As Long
Année = Year(MaDate)
Mois = Month(MaDate)
If Day(DateSerial(Année, Mois + 1, 0)) = 29 Then
If Right(Année, 2) = "00" Then
If Application.mod(Année, 400) = 0 Then
EstBissextile = True
Else
EstBissextile = True
End If
Else
EstBissextile = True
End If
End If
End Function
'---------------------------
Pour connaÍ®tre la semaine d'une date dans l'année, tu fonction :
Pour une version Microsoft Office 2016 ou plus récent :
'---------------------------
Function NumSemaine(MaDate As Date)
NumSemaine = Application.IsoWeekNum(MaDate)
End Function
'---------------------------
Pour toutes les versions d'Excel :
'---------------------------
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
'---------------------------
Ces 2 fonctions peuvent être appelées par une procédure en VBA ou
directement dans une cellule de la feuille de calcul.
Le paramètre "MaDate" ou "D" peuvent être le contenu d'une cellule ayant
une date reconnue comme telle par Excel.
Ces fonctions seront appelées seulement si le contenu de la cellule
passée en paramètre est modifié.
MichD
Avatar
MichD
Le 29/04/22 Í  07:47, MichD a écrit :
Le 29/04/22 Í  04:36, ThierryP a écrit :
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

Bonjour,
A ) les fonctions vont dans un module standard. Tu peux les placer dans
un module feuille, si une procédure de ce module requiert exclusivement
cette fonction.
B ) je ne comprends pas ce que tu veux obtenir, tu utilises des
"expressions" dans les fonctions qui n'ont rien Í  voir avec le VBA.
Une fonction pour déterminer si une année est bissextile ou non :
Pour qu'une année soit bissextile, elle doit respecter 2 conditions :
Le mois de cette année doit avoir 29 jours.
L'année 1900 n'est pas bissextile, on le teste par :
Application.mod(Année, 400) = 0
'---------------------------
Function EstBissextile(MaDate As Date) As Boolean
Dim Année As Long, Mois As Long
Année = Year(MaDate)
Mois = Month(MaDate)
If Day(DateSerial(Année, Mois + 1, 0)) = 29 Then
    If Right(Année, 2) = "00" Then
        If Application.mod(Année, 400) = 0 Then
            EstBissextile = True
        Else
          EstBissextile = True
        End If
    Else
        EstBissextile = True
    End If
End If
End Function
'---------------------------
Pour connaÍ®tre la semaine d'une date dans l'année, tu fonction :
Pour une version Microsoft Office 2016 ou plus récent :
'---------------------------
Function NumSemaine(MaDate As Date)
NumSemaine = Application.IsoWeekNum(MaDate)
End Function
'---------------------------
Pour toutes les versions d'Excel :
'---------------------------
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
'---------------------------
Ces 2 fonctions peuvent être appelées par une procédure en VBA ou
directement dans une cellule de la feuille de calcul.
Le paramètre "MaDate" ou "D" peuvent être le contenu d'une cellule ayant
une date reconnue comme telle par Excel.
Ces fonctions seront appelées seulement si le contenu de la cellule
passée en paramètre est modifié.
MichD

La fonction NumSem() est Í  la norme européenne.
MichD
Avatar
MichD
Le 29/04/22 Í  04:36, ThierryP a écrit :
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

Fonction pour déterminer la semaine d'une date particulière du mois:
'-------------------------
Function SemaineDuMois(D As Date) As Long
SemaineDuMois = Int((Day(Date) - 1) / 7) + 1
End Function
'-------------------------
MichD
Avatar
ThierryP
Bonjour Denis,
Je n'ai pas de souci avec mes fonctions personnalisées, mon souci c'est que quand j'appelle ma fonction Calcul_SemainesDuMois, elle s'exécute deux fois et ce même si j'ajoute un Exit Function juste avant le End Function : en pas Í  pas, je passe sur le "Exit Function" mais la fonction s'exécute une deuxième fois et seulement après ça je retourne sur la macro appelante.
En soi, ce n'est pas très gênant mais j'aime bien comprendre les choses !
ThierryP
Avatar
MichD
Le 29/04/22 Í  04:36, ThierryP a écrit :
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

Explique-moi ces expressions :
Calcul_SemainesDuMois(Date).Dernier
Calcul_SemainesDuMois.Premier
J = IIf(Bissextile(Range("Année")), 29, 28)
Dans ta fonction, tu appelles 2 fois la même fonction
Calcul_SemainesDuMois.Premier = NumSemaine(DateSerial(Range("Année"),
Mois, 1))
et
Calcul_SemainesDuMois.Dernier = NumSemaine(DateSerial(Range("Année"),
Mois, J))
Il n'y a rien Í  comprendre, la fonction s'exécute 2 fois par que tu
l'appelles 2 fois dans la même fonction. Moi, pas savoir pourquoi tu
l'appelles 2 fois.
À chaque fois qu'un contenu de cellule est mis a jour, la fonction
s'exécute.
MichD
Avatar
ThierryP
Re-bonjour,
Ce n'est pas simple Í  expliquer de manière succinte !
J'ai besoin de connaÍ®tre le N° de la première et de la dernière semaine du mois en cours. Mon idée était de créer une fonction qui me renvoie d'un coup ces deux valeurs.
Donc, j'ai créé un Type :
Public Type Semaine
Premier As Integer 'Le N° de la première semaine du mois
Dernier As Integer 'Le N° de la dernière semaine du mois
End Type
Dans le WorkBook_Open, j'ai ceci :
Range("S_Sem_Mois") = "De la semaine " & Calcul_SemainesDuMois.Premier & " Í  la semaine " & Calcul_SemainesDuMois.Dernier, qui appelle effectivement deux fois la fonction, mais je sais pas comment faire autrement !
Ma fonction :
Function Calcul_SemainesDuMois() As Semaine
Mois = Month(Date)
Calcul_SemainesDuMois.Premier = NumSemaine(DateSerial(Range("Année"), Mois, 1)) 'NumSemaine est la fonction de Laurent Longre qui calcule le N° de semaine ISO d'une date donnée
' Je passe 1 en argument pour le premier jour du mois
Select Case Mois
Case 1, 3, 5, 7, 8, 10, 12
J = 31
Case 2
J = IIf(Bissextile(Range("Année")), 29, 28) 'Bissextile est une fonction qui détermine si l'année est bissextile
Case 4, 6, 9, 11
J = 30
End Select
Calcul_SemainesDuMois.Dernier = NumSemaine(DateSerial(Range("Année"), Mois, J)) 'Je passe J en argument pour le dernier jour du mois
End Function
Quand je fais un pas Í  pas :
- J'arrive sur Function Calcul_SemainesDuMois() As Semaine
- La ligne Calcul_SemainesDuMois.Premier appelle ma fonction NumSemaine
- Je calcule le dernier jour du mois (J)
- Calcul_SemainesDuMois.Dernier = NumSemaine(DateSerial(Range("Année"), Mois, J)) appelle de nouveau ma fonction NumSemaine avec l'argument J
- Je passe sur le End Function
Et lÍ , le pas Í  pas repasse sur Function Calcul_SemainesDuMois() As Semaine et la fonction s'exécute une deuxième fois ?????
Et je ne vois pas du tout pourquoi..... C'est sͻr que mes maigres connaissances en VBA ne m'aident pas, mais j'aimerais comprendre o͹ est-ce que j'ai commis une erreur ?
Merci Í  toi, bon week-end,
ThierryP
Avatar
Geo
De ThierryP, le 29/04/2022 :
Range("S_Sem_Mois") = "De la semaine " & Calcul_SemainesDuMois.Premier & " Í 
la semaine " & Calcul_SemainesDuMois.Dernier, qui appelle effectivement deux
fois la fonction, mais je sais pas comment faire autrement ! Ma fonction :

A la limite, ce n'est pas grave, vous devez avoir le résultat attendu.
Sinon, je ferais un truc du genre (pas essayé) :
Dim maSemaine as Semaine
maSemaine = Calcul_SemainesDuMois
Range("S_Sem_Mois") = "De la semaine " & MaSemaine.Premier & " Í  la
semaine " & MaSemaine.Dernier
Avatar
Geo
De ThierryP, le 29/04/2022 :
NumSemaine est la fonction de Laurent Longre

Woah ! ça ne date pas d'hier.
Avatar
MichD
Tu pourrais avoir quelque chose comme ceci.
Chacune des fonctions peut être appelée dans une
procédure vba ou dans une cellule de la feuille de calcul.
Désolé, mais je n'ai sÍ»rement pas compris ton propos.
Si une fonction s'exécute 2 fois, c'est qu'elle est appelée 2 fois ou la
cellule contenant la date a été modifiée. As-tu d'autres macros dans ton
projetVBA...
'----------------------------------------
Function PremierJourDuMois(D As Date)
Dim T As Long
T = 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
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
'----------------------------------------
Function DerJourDuMois(D As Date)
j = PremierJourDuMois(D)
DerJourDuMois = NumSemaine(DateSerial(Year(D), Month(D), j))
End Function
'----------------------------------------
MichD
Avatar
Geo
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.
1 2