XL 2016 Cliquer sur un jour du calendrier pour aller dans une autre feuille

ReneDav14000

XLDnaute Occasionnel
Bonsoir à tous,
Dans le fichier joint, il y a une feuille "Calendrier" dans laquelle se trouve un calendrier des douze mois de l'année.
Dans les autres feuilles il y a le détail du mois à plat. Ces feuilles serviront d'agenda de travail.
Je souhaiterai mettre en place un code qui me permettrait lorsque je clique sur un jour du calendrier des 12 mois, d'aller directement à ce jour dans une feuille du classeur.
Par exemple : Je clique sur le 15 mars, alors la feuille Mars s'affiche et on se positionne au 15.
Avez-vous une idée de comment réaliser cela ?
J'ai essayé de chercher mais ce n'est pas facile de trouver les bons mots à mettre dans les moteurs de recherche.
Merci par avance pour vos suggestions.
 

Pièces jointes

  • agenda_macro .xlsm
    85.3 KB · Affichages: 13
Solution
Re

@ReneDav14000
Donc finalement, c'était bien des points ;)

Une formule possible pour masquer les jours "hors mois"
Ici pour janvier
=MOIS(C7)<>MOIS(DATE($F$2;1;1))

NB: Ta formule ne fonctionnait pas car C2 ce n'est pas une date, mais un nombre
(l'année sur 4 chiffres)

PS: J'ai oublié de te dire bravo pour ta persévérance ;)
Je vois que tu as réussi à mettre toutes les formules et la liste de validation.

Il reste le problème de la semaine 52/53 à traiter car selon le mois, on ne sera pas dans le bon agenda.
Exemple: En 2023
Semaine 52 en B7 et en AQ20, sauf que ce n'est pas la même année ;)
Donc problème pour le VBA dans la procédure évènementielle.

Staple1600

XLDnaute Barbatruc
Re

@ReneDav14000
Voila à ma sauce et en respectant ton mode opératoire
1) J'ai masqué manuellement toutes les feuilles semaines
2) Dans ThisWorkbook
Code:
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
If Sh.Name <> "Calendrier" Then
Sh.Visible = False
End If
End Sub
3) Dans le code de la feuille Calendrier
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim vCol, N_SEM$
vCol = Array(1, 10, 19, 28, 37, 46)
If Target.Count > 1 Then Exit Sub
If Target.Row >= 6 And Target.Row <= 21 Then
ck = Target.Column Mod 53
If Not IsError(Application.Match(ck, vCol, 0)) Then Exit Sub
On Error Resume Next
N_SEM = CStr(Application.IsoWeekNum(Target))
Worksheets(N_SEM).Visible = True
Worksheets(N_SEM).Activate
Else
Exit Sub
End If
End Sub
Sur la feuille Calendrier, seules des formules sont utilisées
(Celles décrites plus dans le fil)
Reste à voir les MFC, la gestion des jours fériés etc..
Ci-dessous à quoi ressemble la feuille Calendrier (qui cette fois est annuel)
Cal4.png
PS: A tester plus avant . (Avant une utilisation "réelle")
 

ReneDav14000

XLDnaute Occasionnel
Bonjour Staple1600,
Merci beaucoup pour ton travail. Je vois que tu as travaillé sur des tableaux de 6 semaines, je l'avais proposé en réunion comme tu me l'avais déjà suggéré, mais il m'a rétorqué qu'un mois c'est 5 semaines.
Je vais tester un peu plus tard car je dois m'absenter (santé oblige) et il faut que je termine mon projet avant.
Je te tiens au courant.
Encore mille merci
 

Staple1600

XLDnaute Barbatruc
Bonjour

@ReneDav14000
Je vois que tu as travaillé sur des tableaux de 6 semaines
Non, j'ai repris ta trame, soit 42 cellules par mois (6*7) (cf le code dans ta feuille qui créé le calendrier)
Simplement comme ce n'est qu'une version de test, je n'ai encore implémenté les MFC
(Celles pour masquer les jours hors mois, celles pour distinguer SAM/DIM et jours fériés)

Personnellement je préfère créer le calendrier par formules que par VBA avec une Worksheet_Change
Enrichi (BBcode):
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Firstday&, p As Range, r As Range, I&, NbJour&, J&
    Application.ScreenUpdating = False
    Set p = Range("K6,T6,AC6,AL6,AU6,BD6,K15,T15,AC15,AL15,AU15,BD15,K24")
    If Target.Address = "$K$2" Then
        If Not IsNumeric([K2].Value) Then Exit Sub
        Application.EnableEvents = False
        For I = 1 To 13
            Set r = p.Areas(I).Resize(6, 7)    'determine la plage du mois(i)avec sa cells(1)
            r.Value = "": r.NumberFormat = "dd"
            Firstday = Weekday(DateSerial([K2], I, 1), vbUseSystemDayOfWeek) - 1    'le jour de la semaine du premier du mois
            NbJour = Day(DateSerial([K2], I + 1, 0))    'le nombre de jour dans le mois
            For J = 1 To NbJour
                r.Cells(Firstday + (J)) = DateSerial([K2], I, J)
            Next
        Next
    End If
    Application.EnableEvents = True
    Range("K2").Select
End Sub

Maintenant tu choisis ou pas ce qui t'intéresses dans ce que je t'ai proposé.

Bonne continuation et ne désespère pas de finir de convaincre ton N+1 que pour l'utilisateur final moins il y a de VBA, mieux c'est.
;)
[tranche de vie]
(je parle d'expérience :mes collègues (de jadis) et des temps présents qui finissaient toujours par planter "mes applis" et restaient coi devant les messages d'erreur de VBE)
Avec des formules, ce risque est diminué.
[/tranche de vie]
 

ReneDav14000

XLDnaute Occasionnel
Bonjour

@ReneDav14000

Non, j'ai repris ta trame, soit 42 cellules par mois (6*7) (cf le code dans ta feuille qui créé le calendrier)
Simplement comme ce n'est qu'une version de test, je n'ai encore implémenté les MFC
(Celles pour masquer les jours hors mois, celles pour distinguer SAM/DIM et jours fériés)

Personnellement je préfère créer le calendrier par formules que par VBA avec une Worksheet_Change
Enrichi (BBcode):
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Firstday&, p As Range, r As Range, I&, NbJour&, J&
    Application.ScreenUpdating = False
    Set p = Range("K6,T6,AC6,AL6,AU6,BD6,K15,T15,AC15,AL15,AU15,BD15,K24")
    If Target.Address = "$K$2" Then
        If Not IsNumeric([K2].Value) Then Exit Sub
        Application.EnableEvents = False
        For I = 1 To 13
            Set r = p.Areas(I).Resize(6, 7)    'determine la plage du mois(i)avec sa cells(1)
            r.Value = "": r.NumberFormat = "dd"
            Firstday = Weekday(DateSerial([K2], I, 1), vbUseSystemDayOfWeek) - 1    'le jour de la semaine du premier du mois
            NbJour = Day(DateSerial([K2], I + 1, 0))    'le nombre de jour dans le mois
            For J = 1 To NbJour
                r.Cells(Firstday + (J)) = DateSerial([K2], I, J)
            Next
        Next
    End If
    Application.EnableEvents = True
    Range("K2").Select
End Sub

Maintenant tu choisis ou pas ce qui t'intéresses dans ce que je t'ai proposé.

Bonne continuation et ne désespère pas de finir de convaincre ton N+1 que pour l'utilisateur final moins il y a de VBA, mieux c'est.
;)
[tranche de vie]
(je parle d'expérience :mes collègues (de jadis) et des temps présents qui finissaient toujours par planter "mes applis" et restaient coi devant les messages d'erreur de VBE)
Avec des formules, ce risque est diminué.
[/tranche de vie]
Merci Staple1600, ta dernière version me plaît beaucoup et je vais l'utiliser.
Question : Je peux garder ma feuille "Calendrier" telle quelle ou bien il faut que je la refasse selon to modèle?
Mon cerveau marche au ralenti ce matin, le début de matinée a été difficile. :eek:
 

Staple1600

XLDnaute Barbatruc
Re

@ReneDav14000
Tu fais ce qui te sied le mieux ;)
(*) Comme je l'ai dit, moins il y a de VBA dans un classeur, moins celui-ci aura de chance de planter

Dans ton fichier exemple, le calendrier est créé à la volée en VBA quand la valeur de la cellule K2 change

Dans mon exemple, la création du calendrier se fait par formules.
(Pour éviter les soucis, je protège la feuille)
Donc en théorie, je limite les potentiels soucis liés à un méusage de l'utilisateur final.

(*) Ce n'est là que mon opinion personnelle.
 

Staple1600

XLDnaute Barbatruc
Re

@ReneDav14000
Si tu veux créer le calendrier par formule, voici la formule "générique"
Ici en B6
={0;1;2;3;4;5}*7+{1.2.3.4.5.6.7}+DATE($D$2;1;1)-JOURSEM(DATE($D$2;1;1);2)
Il faut la saisir matriciellement en ayant sélectionner les 42 cellules
Donc pour le mois de janvier (dans mon exemple)
B6:H11 puis valider par CTRL+SHIFT+ENTER

et refaire la même chose pour les 11 mois suivant en adaptant la formule à ce niveau
DATE($D$2;1;1)-JOURSEM(DATE($D$2;1;1);2)
Ici le nombre en rouge correspond au mois.
et D2 correspond à l'année du calendrier.

Pour le numéro de semaine : =NO.SEMAINE.ISO(B6)
(là aussi faire ensuite les adaptations nécessaires pour les autres mois)
 

ReneDav14000

XLDnaute Occasionnel
Re

@ReneDav14000
Tu fais ce qui te sied le mieux ;)
(*) Comme je l'ai dit, moins il y a de VBA dans un classeur, moins celui-ci aura de chance de planter

Dans ton fichier exemple, le calendrier est créé à la volée en VBA quand la valeur de la cellule K2 change

Dans mon exemple, la création du calendrier se fait par formules.
(Pour éviter les soucis, je protège la feuille)
Donc en théorie, je limite les potentiels soucis liés à un méusage de l'utilisateur final.

(*) Ce n'est là que mon opinion personnelle.
Ok merci pour l'explication. C'est certain que moins il y a de codes mieux c'est.
D'autant plus que lorsque je serai parti, personne (pour le moment) ne sera capable de corriger les erreurs de manipulation. Même si je fais un mode d'emploi, si ça plante, ça ne fonctionnera plus.
Je vais passer outre les ordres et faire à ma convenance selon tes suggestions, si il gueule et bien tant pis, de toute façon le travail sera fait (pas comme il le souhaitait soit), de plus il sera incapable de faire mieux.
Tu as raison de dire que c'est celui qui fait qui détient les rênes (c'est ma traduction). Aller, j'y vais....
 

Staple1600

XLDnaute Barbatruc
Re

@ReneDav14000
C'est normal, non ?
Que contient la cellule D2 dans ta copie d'écran ?
Et qu'avais-je écrit dans le message#51 à propos de la cellule D2 ? ;)

PS: je pense que tu peux supprimer tes quatres ! et nettoyer tes lunettes ;)

Sinon, plus bas dans le fil, je t'avais fourni une macro pour simplifier l'insertion des formules
Il suffisait de l'adapter un chouia ;)
 

ReneDav14000

XLDnaute Occasionnel
Re

@ReneDav14000
C'est normal, non ?
Que contient la cellule D2 dans ta copie d'écran ?
Et qu'avais-je écrit dans le message#51 à propos de la cellule D2 ? ;)

PS: je pense que tu peux supprimer tes quatres ! et nettoyer tes lunettes ;)

Sinon, plus bas dans le fil, je t'avais fourni une macro pour simplifier l'insertion des formules
Il suffisait de l'adapter un chouia ;)
Quel andouille je suis, je me suis empressé sans bien lire. Je n'ai pas appliqué ton principe.
 

ReneDav14000

XLDnaute Occasionnel
Re

Donc tu as réussi à créer le mois de janvier désormais ?
Désolé d'avoir tardé à répondre, j'étais sur autre chose, une demande "urgente" comme toujours.
Oui j'ai créé le mois de janvier avec ce code que tu m'as donné. Toutefois, lorsque je veux changer de format de date et bien ça plante, j'ai les mêmes dates partout.
J'avoue l'avoir fait sans trop regarder le code. (c'est pas K.I.S.S.)
VB:
Sub Calendrier_Formule_MAT()
[B3:H3] = [{"L","M","M","J","V","S","D"}]: [B1] = "2022": [F1] = "12": [E1] = "=(""1-""&RC[1])*1"
[I1] = "=DATE(RC[-7],RC[-3],1)-WEEKDAY(DATE(RC[-7],RC[-3],1),2)": [B4:H9].FormulaArray = "={0;1;2;3;4;5}*7+{1,2,3,4,5,6,7}+R[-3]C[7]"
[B4:H9].NumberFormat = "d/mm": [E1].NumberFormat = "mmmm": [I1].NumberFormat = ";;;": [A1] = "ANNEE": [D1] = "MOIS"
[B3].CurrentRegion.Borders.Value = 1: [B1,F1].Interior.Color = vbYellow: [B1,F1].Font.Bold = -1
End Sub
 

ReneDav14000

XLDnaute Occasionnel
quand j'essaie avec la formule "générique" ça donne ça.
J'ai mis des points virgules car ce sont les seuls caractères que la formule accepte.
Tu vois d'où vient le problème ?

Code:
={{0;1;2;3;4;5}*7+{1;2;3;4;5;6;7}+DATE($D$2;1;1)-JOURSEM(DATE($D$2;1;1);2)}
1667916139640.png
 

Staple1600

XLDnaute Barbatruc
Re

Je crois que pas plus tard que tout à l'heure¸ c'est moi qui à dit:
Sinon, plus bas dans le fil, je t'avais fourni une macro pour simplifier l'insertion des formules
Il suffisait de l'adapter un chouia ;)
Ce qui voulait dire changer l'adresse des formules dans le code VBA

Donc la version modifiée (pour juste créer janvier) eut été
Code:
Sub Test_Insertion_FORMULES()
[D2] = "2022"
'mois de janvier
Range("B6:H11").FormulaArray = "={0;1;2;3;4;5}*7+{1,2,3,4,5,6,7}+DATE(R2C4,1,1)-WEEKDAY(DATE(R2C4,1,1),2)"
'formatage jour
Range("B6:H11").NumberFormat = "dd"
'petit bonus
Range("B5:H5").Value = Split("L M M J V S D")
Range("B4").FormulaR1C1 = "=UPPER(TEXT(DATE(R2C4,1,1),""mmmm""))"
End Sub
 

ReneDav14000

XLDnaute Occasionnel
Re


Ce qui voulait dire changer l'adresse des formules dans le code VBA

Donc la version modifiée (pour juste créer janvier) eut été
Code:
Sub Test_Insertion_FORMULES()
[D2] = "2022"
'mois de janvier
Range("B6:H11").FormulaArray = "={0;1;2;3;4;5}*7+{1,2,3,4,5,6,7}+DATE(R2C4,1,1)-WEEKDAY(DATE(R2C4,1,1),2)"
'formatage jour
Range("B6:H11").NumberFormat = "dd"
'petit bonus
Range("B5:H5").Value = Split("L M M J V S D")
Range("B4").FormulaR1C1 = "=UPPER(TEXT(DATE(R2C4,1,1),""mmmm""))"
End Sub
[/QUOTE]
o_O là ça dépasse mes capacités, je n'aurai jamais trouvé
 

Discussions similaires

Réponses
5
Affichages
181

Statistiques des forums

Discussions
312 199
Messages
2 086 159
Membres
103 147
dernier inscrit
tubaman