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
Bonjour le fil

@ReneDav14000
Il faudrait pouvoir y adjoindre un code pour accéder aux autres feuilles en cliquant sur la cellule du jour.
Je crois que tu n'as pas lu le préambule ni saisis le but de mon message qui est en résumé est
Le préambule à dit:
NB: La macro ne doit servir qu'à insérer les formules.


De réaliser un petit calendrier uniquement en formules et sans VBA

PS:
Je n'ai fait cette macro pour ne pas avoir à joindre de fichier Excel et pour te faciliter la tâche pour reproduire mon exemple

Sinon, pour le Numéro de semaine, Excel possède la fonction idoine
NO.SEMAINE.ISO
(que j'ai utilisé en VBA dans le message#22)

Et pour les MFC, c'est assez simple (avec la fonction MOIS)
Je te laisse cogiter sur cette formule de MFC

Tu devrais pouvoir obtenir quelque qui ressemblerait à ceci
(Ici ajout Liste de validation (pour les années), ajout d'une Toupie pour les mois, MFC pour masquer les jours et enfin utilisation de la formule citée ci-dessus pour le numéro de semaine)
Calendrier3.png
 

ReneDav14000

XLDnaute Occasionnel
Bonjour le fil

@ReneDav14000

Je crois que tu n'as pas lu le préambule ni saisis le but de mon message qui est en résumé est


De réaliser un petit calendrier uniquement en formules et sans VBA

PS:
Je n'ai fait cette macro pour ne pas avoir à joindre de fichier Excel et pour te faciliter la tâche pour reproduire mon exemple

Sinon, pour le Numéro de semaine, Excel possède la fonction idoine
NO.SEMAINE.ISO
(que j'ai utilisé en VBA dans le message#22)

Et pour les MFC, c'est assez simple (avec la fonction MOIS)
Je te laisse cogiter sur cette formule de MFC

Tu devrais pouvoir obtenir quelque qui ressemblerait à ceci
(Ici ajout Liste de validation (pour les années), ajout d'une Toupie pour les mois, MFC pour masquer les jours et enfin utilisation de la formule citée ci-dessus pour le numéro de semaine)
Regarde la pièce jointe 1154600
J'avais bien compris ton exemple, mon message n'était qu'une réflexion.
Je suis en train de terminer l'autre modèle et après je m'attèle à celui-ci, comme ça mon chez pourra faire son choix.
D'ailleurs j'essaie de mettre en place ce code mais ça bug, j'ai un message "Next" sans "for" alors qu'il est bien là.
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim N_SEM$
Dim MaPlage As Range, Cel As Range
Application.ScreenUpdating = False

Set MaPlage = Sheets("Calendrier").Range("K6:BK20")
For Each Cel In MaPlage 'pour toutes les cellules de la plage
    If Cel.Value = "" Then 'si cellule vide fin de la procédure
    Next
Exit Sub
     On Error Resume Next
If Not Intersect(Target, [K6:K11,T6:T11,AC6:AC11,AL6:AL11,AU6:AU11,BD6:BD11,K15:K20,T15:T20,AC15:AC20,AL15:AL20,AU15:AU20,BD15:BD20]) Is Nothing Then
N_SEM = CStr(Application.IsoWeekNum(Target))
Worksheets(N_SEM).Activate
End If
End If
Application.ScreenUpdating = True
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

Sur une macro évènementielle, normalement on se base sur Target
Exemple
Ici si la cellule n'est pas vide et appartient à la plage définie, alors une MsgBox s'affichera.
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, [B6:BK6]) Is Nothing Then
If Len(Target) Then
MsgBox Target.Address
End If
End If
End Sub
Il y aura un problème de logique dans ton classeur
Il n'y a que six onglets de 1 à 6
Donc si tu cliques une date qui appartient à la semaine 7 ou au dela, alors cela plantera, non ?
 

ReneDav14000

XLDnaute Occasionnel
Re

Sur une macro évènementielle, normalement on se base sur Target
Exemple
Ici si la cellule n'est pas vide et appartient à la plage définie, alors une MsgBox s'affichera.
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, [B6:BK6]) Is Nothing Then
If Len(Target) Then
MsgBox Target.Address
End If
End If
End Sub
Il y aura un problème de logique dans ton classeur
Il n'y a que six onglets de 1 à 6
Donc si tu cliques une date qui appartient à la semaine 7 ou au dela, alors cela plantera, non ?
Sur l'original il y en a 52. Les 6 sont pour le classeur exemple.La référence Target est donc k6:bk20
 

ReneDav14000

XLDnaute Occasionnel
Re

Et quid quand selon la norme ISO, il y a 53 semaines ?

52 onglets là où un seul suffirait...

Un classeur : deux onglets
onglet 1 : calendrier annuel
onglet 2: une semaine (celle correspond au clic sur la feuille calendrier)
Oui mais il faut que les annotations dans les agendas restent accessibles tout le temps pour des contrôles.
Entre 2022 et 2040 il n'y aura que 3 années à 53 semaines.
De toute façon, je n'ai pas trop le choix dans la construction du fichier, il y aura 53 feuilles (54 avec celle du calendrier)
Les feuilles seront cachées par défaut et seront visibles lorsqu'elles seront appelées par le clique sur la cellule de la feuille "Calendrier". Je sais que ce n'est pas la panacée, mais c'est le travail demandé, alors j'exécute.
 

Staple1600

XLDnaute Barbatruc
Re

[aparté]
mais c'est le travail demandé, alors j'exécute.
Personnellement moi, je n'éxécute pas, et je dis à mon N+1 avec un petit sourire intérieur
"OK, je ne conçois mes classeurs que selon ma propre méthodologie.
Alors reprends ton classeur, et pour afficher ton VBE, tu fais un ALT+F11"
Généralement, à ce moment-là, le N+1 me dit "Pour afficher mon quoi?"
Et finit par me dire "OK, fais selon ton idée, mais faut que cela marche!"
[/aparté]
Mais tu n'as sans doute pas la liberté de choix (hélas)

Donc en route pour les complications ;)

Juste le temps de me créer un classeur avec 53 feuilles
 

Staple1600

XLDnaute Barbatruc
Re

Donc en reprenant la trame de mon classeur par formule
Mon classeur de test contient une feuille Calendrier et 53 feuilles (nommées 1 à 53)
J'ai nommé TJOURS la plage des jours sur la feuille Calendrier
Et dans le module de cette feuille, j'ai ce code
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, [TJOURS]) Is Nothing Then
N_SEM = CStr(Cells(Target.Row, 1))
Worksheets(N_SEM).Activate
End If
End Sub
Et j'active la feuille "semaine" selon la date sélectionnée sur la feuille Calendrier.

Qu'en penses-tu ?
 

Staple1600

XLDnaute Barbatruc
Re

Une version un peu plus aboutie
Et le code VBA modifié
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, [TJOURS]) Is Nothing Then
If Target.Count = 1 Then
If Target.DisplayFormat.Font.ColorIndex = 2 Then Exit Sub
N_SEM = CStr(Cells(Target.Row, 1))
'Worksheets(N_SEM).Activate 'décommenter pour sélection des feuilles et supprimer la ligne MsgBox
MsgBox "C'est la feuille: " & Worksheets(N_SEM).Name & " qui sera activée." 'pour test
End If
End If
End Sub
Dans cette version, seul un clic sur un jour "non vide" activera une feuille "semaine"
PS: J'ai mis le MsgBox juste pour le test.
Cal_test_ok.png
 

ReneDav14000

XLDnaute Occasionnel
Re

[aparté]

Personnellement moi, je n'éxécute pas, et je dis à mon N+1 avec un petit sourire intérieur
"OK, je ne conçois mes classeurs que selon ma propre méthodologie.
Alors reprends ton classeur, et pour afficher ton VBE, tu fais un ALT+F11"
Généralement, à ce moment-là, le N+1 me dit "Pour afficher mon quoi?"
Et finit par me dire "OK, fais selon ton idée, mais faut que cela marche!"
[/aparté]
Mais tu n'as sans doute pas la liberté de choix (hélas)

Donc en route pour les complications ;)

Juste le temps de me créer un classeur avec 53 feuilles
Je suis à quelques mois de la retraite, alors je n'ai pas envie de me prendre la tête avec un chefaillon sorti tout droit des bancs de l'école. J'ai essayé de lui expliquer, mais j'ai pris une volée d'arguments sans queue ni tête, alors je réalise et il verra après ce que cela donne en matière de gestion, je ne serai plus là pour voir.
 

ReneDav14000

XLDnaute Occasionnel
Re

Une version un peu plus aboutie
Et le code VBA modifié
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, [TJOURS]) Is Nothing Then
If Target.Count = 1 Then
If Target.DisplayFormat.Font.ColorIndex = 2 Then Exit Sub
N_SEM = CStr(Cells(Target.Row, 1))
'Worksheets(N_SEM).Activate 'décommenter pour sélection des feuilles et supprimer la ligne MsgBox
MsgBox "C'est la feuille: " & Worksheets(N_SEM).Name & " qui sera activée." 'pour test
End If
End If
End Sub
Dans cette version, seul un clic sur un jour "non vide" activera une feuille "semaine"
PS: J'ai mis le MsgBox juste pour le test.
Regarde la pièce jointe 1154670
Ton projet est plus que bien. J'avais présenté cette approche lors d'une réunion, ce ne fût pas l'enthousiasme, mais bon, je vais (on va pour être plus clair) lui démontrer qu'il est possible de faire autrement, après il fera son choix.
Merci beaucoup pour ton investissement, j'apprécie ta participation.
 

Staple1600

XLDnaute Barbatruc
Re

Heureusement que je n'étais pas à ta réunion (lol)

Sinon j'ai repris la trame de ton projet
Une feuille Calendrier et N feuilles semaine

J'ai juste pris le parti d'avoir un calendrier dynamique au lieu d'afficher toute l'année. (*)
(*) ce qui oblige à alourdir le code dans la procédure évènementielle)

On pourrait aussi faire en sorte quand on ouvre le classeur, le calendrier affiche le mois en cours
et mettre en évidence le jour courant.
 

ReneDav14000

XLDnaute Occasionnel
Voilà où j'en suis dans mon agenda. Cependant je rencontre un petit soucis avec la semaine 53.
Lorsque je clique dessus, je suis dirigé vers la feuille 1 pas la 53.
Je dois également mettre en couleur les jours fériés dans les feuilles agendas. Les feuilles sont cachées à l'ouverture du fichier à part la feuille "Calendrier"
Voici mon fichier
 

Pièces jointes

  • Agenda_Hebdo1.xlsm
    595.7 KB · Affichages: 12

ReneDav14000

XLDnaute Occasionnel
Re

Heureusement que je n'étais pas à ta réunion (lol)

Sinon j'ai repris la trame de ton projet
Une feuille Calendrier et N feuilles semaine

J'ai juste pris le parti d'avoir un calendrier dynamique au lieu d'afficher toute l'année. (*)
(*) ce qui oblige à alourdir le code dans la procédure évènementielle)

On pourrait aussi faire en sorte quand on ouvre le classeur, le calendrier affiche le mois en cours
et mettre en évidence le jour courant.
Ah oui ça c'est pas mal comme idée ta dernière suggestion. Je n'y avais pas pensé (et lui non plus 😉 )
 

Staple1600

XLDnaute Barbatruc
Re

@ReneDav14000
Toujours avec mes formules mais en gardant ta présentation sur la page Calendrier
(ici dans cet exemple de test: seuls six mois sont fonctionnels
(Dans de semaine 1 à 27)
NB: Le calendrier est construit par formules
EDITION: Parfois, j'ai le neurone qui flanche ;)
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim N_SEM$
If Target.Count > 1 Then Exit Sub
On Error Resume Next
N_SEM = CStr(Application.IsoWeekNum(Target))
Worksheets(N_SEM).Activate
End Sub
Le seul VBA est celui-ci:
=> pour sélectionner la feuille Semaine selon la cellule sur la feuille Calendrier
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim mois As Range, sem
sem = Array("A", "J", "S", "AB", "AT", "AK")
Set mois = Union([M_01], [M_02], [M_03], [M_04], [M_05], [M_06])
If Intersect(Target, mois) Is Nothing Then Exit Sub
    If Target.Count = 1 Then
        For I = 1 To 6
        If Not Intersect(Target, mois.Areas(I)) Is Nothing Then
        N_SEM = CStr(Cells(Target.Row, sem(I - 1)))
        Worksheets(N_SEM).Activate
    End If
Next
End If
End Sub
CalF3.png
 
Dernière édition:

Discussions similaires

Réponses
5
Affichages
164

Statistiques des forums

Discussions
312 023
Messages
2 084 716
Membres
102 636
dernier inscrit
TOTO33000