Mise en mémoire

Bonjour, bonjour,

Dans le fichier en PJ vous verrez que mon calendrier est changeable grâce aux boutons Mois et Année.

On peut aussi changer la couleur d'une case en sélectionnant un des boutons (Vert/Rouge/Clear/Day off) lorsque l'on se trouve sur la case à changer.

Ma question est : Est-il possible de garder les calendriers en mémoire ?

Imaginons, nous sommes en Juin 2018, lorsque je vais en Juillet 2018, le calendrier de Juin est mis en mémoire et si je reviens en Juin 2018 après, je retrouve toutes les couleurs mises.

Merci ^^

29azkaet.xlsm (30.54 Ko)

Oui c'est faisable, il y a plein de façon de faire, dur de savoir quelle est la plus simple et/ou la meilleure

Tu veux garder en mémoire que le mois en cours et pas ceux du passé? tu veux pouvoir renseigner des days off spéciaux comme fermeture de ta boite à l'avance (je ne sais pas non plus si le calendrier prend bien en compte tous les jours fériés, à voir)?

Sinon je pense que la solution est de créer un double de ton calendrier sur une feuille spéciale ou comme pour tes dates sur la première ligne invisible au pire

=> ouverture du classeur: si on a la bonne année et mois de sélectionné on boucle sur la première ligne invisible ou on a stocké les couleurs et on les recopies dans le calendrier (ce process permet au passage que l'utilisateur ferme le classeur sur un autre mois/année que celui en cours sans que cela pose soucis lors de la réouverture)
Je te laisse méditer la dessus mais il faudra garder en mémoire aussi dans une case à quel mois/année correspondent les codes couleurs enregistré car à l'ouverture si le mois/année actuels ne sont plus identiques c'est qu'on est le 1er d'un autre mois ou d'une année et donc qu'il faut effacer tous ce qu'on avait en mémoire avant de continuer mais c'est une autre histoire :P
=> quand on appuies sur les boutons si le choix n'est pas sur l'année actuelle et le mois actuel on ne fait rien sinon on modifie le calendrier et on stock la modif sur la ligne invisible
=> quand on change de mois/d'année on efface le calendrier directement puis si on est dans le mois/année qu'il faut on reprends le code couleur

Après on peut stocker autrement les codes couleurs(voir même juste en variable de macro mais il faut faire attention lors de la fermeture du classeur à ce que l'on fait, par exemple si on change de mois et qu'on efface le calendrier et on garde en variable les valeurs puis que ça plante, tout est perdus)

C'est aussi possible de mettre sur une feuille caché en stock les mois/années précédemment et de les afficher quand on navigue

Bref tellement de choix possible comme je disais, cela dépend de toi

En espérant être clair

ECG

Merci de me répondre

Je n'ai pas tout compris désolée mais j'ai saisi l'idée.

Je pense que ce qui est le mieux, c'est d'avoir un bouton proposant à l'utilisateur de garder en mémoire le calendrier affiché avec le mois et l'année correspondants (ce qu'il pourra faire en fin de mois).

Je n'ai pas forcément besoin de pouvoir l'afficher. J'ai juste besoin des couleurs, parce que comme tu l'as vu dans une autre discussion sur ce forum, mon grand S change de couleur en fonction de la couleur de la case de la veille dans le calendrier.

Donc, si je pouvais enregistrer les calendriers, je pourrais avoir mon changement de couleur même si nous sommes le 1er du mois.

J'espère moi aussi être claire...

Du coup on peut voir facilement ce qu'il y a comme macro à faire en algorithme je pense:

un bouton d'enregistrement (ou dès qu'on valide une couleur avec les différents bouton)

=> si on est dans le mois en cours (pour éviter d'écraser des mois passé ou mettre en avance des mois futur), lance une macro qui boucle sur chaque jour et note dans une autre feuille la date dans une colonne et la couleur dans une deuxième (en vérifiant avant que si la date existe alors on remplace la couleur)

Quand on entre dans les ComboBox mois/année

=> si on est dans le mois/année actuel : lance la macro ci dessus qui enregistre

Quand il y a un changement de mois/année

=> pour toute les dates du mois, on parcours la feuille avec les dates, si on trouve une correspondance on charge la bonne couleur sinon la case est en couleur de base (on peut faire un test déjà de base si le mois/année est supérieur à celui en cours ça sert à rien de boucler sur toute les dates en stock, on mets tout en couleur de base)

ECG

Bonsoir,

Je me suis intéressé à ton fichier... En regardant comment il fonctionnait cela m'a entraîné à apporter quelques petites modifications... puis de proche en proche j'en suis arrivé au fichier ci-joint dont je ne sais s'il te conviendra...

Il reste la mise en forme du calendrier et de ses accessoires, sauf la Combo année que j'ai remplacée par une TextBox + un SpinButton, histoire de ne plus limiter les années à une liste : on ne descend pas en dessous de 2018 mais c'est pratiquement illimité dans l'autre sens (le max du Spin est à 100 mais il est facile de l'augmenter...) sauf capacité d'Excel et de la machine !

J'ai modifié les formules, réécrit la MFC et lui ai ajouté les fériés.

Il ne reste plus rien du code initial. Et les modifications apportées par boutons sont mémorisées, les couleurs affectées sur un mois sont rétablies lorsqu'on y revient...

Il me reste à provoquer l'affichage du mois en cours à l'ouverture, je l'ai oublié au passage, et plus envie de reprendre le Workbook_Open. Le jour en cours est encadré par MFC.

Cordialement.

47azkaet.xlsm (45.80 Ko)

Bonjour MFerrand,

Malheureusement, je ne comprends pas votre code.

Est-il possible de l'expliquer à une débutante comme moi ?

Bonjour,

Economie du système :

Les divers adressages à opérer prennent leur source dans des noms de plages :

Cald : qui nomme le calendrier (B26:H30)

Memo : qui nomme la cellule A1 de la feuille masquée que j'ai ajoutée, destinée à conserver les actions sur le calendrier, de façon à pouvoir les restituer.

Incidences fonctionnelles de ce dispositif : pour cibler le calendrier on utilisera donc la plage Cald, sa cellule supérieure gauche (B26) est la cellule (1, 1) de la plage, on déduit des coordonnées internes à la plage en utilisant .Row et .Column qui renvoient une position en ligne et colonne dans la feuille, en appliquant un correctif consistant à ôter le nombre de colonnes à gauche du calendrier (1) et le nombre de lignes au-dessus (25).

Ce système de coordonnées du jour dans le calendrier permet de cibler le même jour sur la feuille de stockage où l'on aura virtuellement 12 calendriers mensuels occupant les 7 premières colonnes pour 2018 (A à G) et se succédant toutes les 5 lignes. Les 7 colonnes suivantes seront pour 2019, et ainsi de suite...

On peut donc calculer la position de la la première cellule du calendrier de chaque mois sur la feuille de stockage. Si l'on ajoute cette position en ligne et colonne (en ôtant 1) à la position d'un jour dans le calendrier affiché, on obtient sa position sur la feuille de stockage. Ce qu'il faut pour aller mémoriser l'action de l'utilisateur (coloration ou décoloration et couleur de police).

Lorsque l'on changera de mois affiché, une procédure ira chercher l'emplacement de stockage de ce mois et pourra rétablir la situation qu'y avait définie antérieurement l'utilisateur.

L'avantage des noms de plage est qu'on atteindre directement la plage sans passer par la feuille ! On ignore donc les feuilles, qui peuvent changer de noms à volonté puisqu'on n'a pas à utiliser ces noms. On peut atteindre la feuille lorsqu'il en est besoin en passant par la plage (la feuille étant l'objet parent) et deux propriétés de l'objet Range la renvoient (.Worksheet et .Parent).

Le nom Memo joue le même rôle pour atteindre la feuille de stockage. En nommant la cellule A1 (NB- une seule cellule suffit pour adresser n'importe quelle cellule de la feuille), l'adressage relatif par rapport à la plage nommée se confond avec l'adressage absolu dans la feuille...

Sont nommées également pour les besoins fonctionnels, des plages de la feuille Autres : la liste des mois (Mois) et la liste des fériés (Fériés). Les fériés sont calculés sur l'année du calendrier, ils se modifieront si l'année du calendrier change.

L'affichage est commandé par une ComboBox pour ce qui est des mois, le mois sélectionné dans la Combo est répercuté sur la cellule liée B23 et en C23 une formule le transforme en numéro de mois [cela préexistait, j'ai juste simplifié la formule si je me souviens bien). Un SpinButton (bouton Toupie) (minimum 1, maximum 100 qui peut être modifié !!) répercute cette valeur sur la cellule liée G23 et en F23 une formule la transforme en année en ajoutant 2017 (d'où l'année minimale est définie à 2018). La TextBox ne sert qu'à afficher l'année. Le système antérieur avec Combo faisait l'inverse... je l'ai modifié pour faire sauter la limite des années accessibles liée à une liste : On peut aller à plus de 2000 ans dans l'avenir et les mois considérés tiendront encore sur la feuille de stockage sans modifier le système de positionnement !

Pour le calendrier, affichage par formules utilisant F23 (année) et C23 (mois), j'ai juste simplifié les formules...

Les MFC : coloration en gris des samedis et dimanches. Elle préexistait, j'ai juste simplifié la formule et l'ai complétée pour qu'il en soit de même pour les fériés.

L'intervention de l'utilisateur n'a pas changé : il colore en vert ou en rouge ou en gris ou décolore, le ou les jours sélectionnés. Le gris est associé avec police à Blanc, les autres couleurs police à Noir.

J'ai renommé les boutons en Bt 1 à Bt 4 et remplacé les macros antérieures par une seule affectée à tous les boutons : c'est la macro BoutonClic qui détermine le bouton appelant et agit en conséquence pour opérer l'action du bouton, elle répecute la même action sur la feuille de stockage en définissant la position de la cellule au moyen de la fonction CoordJ.

Les coordonnées du mois affiché sont calculées par la procédure InitXY qui les affecte à deux variables module X et Y.

L'initialisation de ces variables intervient à l'ouverture du classeur, et ensuite lorsqu'on change de mois. (Il faut que je me souvienne de mettre un dispositif de sécurisation en cas de vidage intempestif des variables...)

Lors d'un changement de mois, les macros associées à la Combo et au Spin déclenchent en outre une procédure RéinitCald qui va chercher le mois sur la feuille de stockage pour le rétablir sur le calendrier.

Voilà pour la vue d'ensemble. Le code se partage entre module ThisWorkbook (pour l'ouverture du classeur), module de la feuille Sheet1 (pour les contrôles de changement de mois), module Standard Buttons (pour les autres procédures).

Si besoin, d'explication détaillée de tel ou tel fragment de code, le demander...

Cordialement.

Super, merci beaucoup pour ces explications.

Cela va énormément m'aider !

Bonne continuation à vous.

Rechercher des sujets similaires à "mise memoire"