Voilà, ce problème est réglé, juste une petite ligne de code en plus.
L'utilisation de la Function :
- J'ai fait le calcul des adresses de cellules pour la fusion (rendu possible par la régularité de ton tableau) car il était trop compliqué de chercher comment greffer ce calcul dans ton code.
Le calcul se fait sur les différences de dates en se repositionnant par rapport à la valeur de C12. Une fois l'algorithme de décalage lignes-colonnes établi, il fallait partir du 1er janvier d'un côté et de la valeur de C12 de l'autre et j'ai donc voulu utiliser DATEREF et C12. Là j'ai commencé à obtenir des valeurs complètement irrationnelles et j'ai pas mal galéré ! VBA ne voulait pas digérer cet appel de constante de date quelles que soient les modalités d'appel, il y a un cas où j'ai dû réussir par une double conversion en Long à partir d'une conversion en Date... mais là c'est C12 qui (curieusement car il s'agit d'une plage) me renvoyait invariablement 0 ou une erreur d'incompatibilité de type [et pourtant j'avais bien la différence : 3 en testant à part dans une macro test].
Pour que la fonction soit utilisable, il fallait la raccorder à une variable de changement d'année de ton classeur. En remontant le fil je suis arrivé à an, plage nommée de façon classique, VBA n'a plus rechigné et j'ai donc rebranché tous les calculs à partir de an.
La fonction est donc relativement autonome puisqu'elle se raccorde en amont des autres calculs sur la feuille. Si une erreur survient ailleurs, elle a des chances de ne pas en être affectée (et l'inverse aussi, si elle rencontre une erreur cela ne devrait pas avoir d'effet ailleurs).
Il te suffit donc de la placer dans le module (standard) que tu veux, elle pourra être appelée de n'importe où.
- La macro FusionMois opère la fusion, elle appelle la fonction, récupère le tableau renvoyé, le parcours pour en extraire les adresses de plages à fusionner et inscrire les noms de mois, et encadrer les plages fusionnées.
Tu peux, si tu décides d'utiliser ce dispositif, soit l'utiliser de façon autonome, c'est à dire en appelant cette macro à partir de la procédure qui réalise les mises à jour pour initialiser une nouvelle année : le nom de la macro (que tu peux d'ailleur changer) suffit dans ton code à l'emplacement où tu souhaites voir cette opération se dérouler.
Tu peux aussi intégrer le code de la macro dans ta procédure d'initialisation annuelle à l'emplacement que tu souhaites. Prévoir dans ce cas les déclarations de variables nécessaires en tête de la procédure (ça marche quand même si la déclaration n'est pas vraiment mal positionnée mais je trouve que c'est plus sûr de savoir où les trouver toutes sans chercher) : une que j'ai appelée tpm [pour tableau de positionnement des mois] est indispensable (tu peux changer le nom mais sans oublier de le changer aussi dans le code), i est une variable compteur que tu peux éventuellement remplacer par une variable déjà existante dans ton code et non utilisée à ce moment (mais faudra aussi aligner le code...), enfin une variable-feuille d'abord parce que j'ai trouvé le nom de la feuille long (j'ai une préférence pour les noms courts dans le code !) et à la réflexion j'ai noté qu'avec 2015 dans le nom ce ne serait pas un nom durable, du coup j'ai appelé à partir du nom de code (qu'en principe tu n'as aucune raison de changer). J'ai tout de même maintenu la variable objet qui là se justifiait moins mais... (si tu la supprimes, la remplacer partout par Feuil1 qui est le CodeName de la feuille).
Le tout est fait. Bonne continuation, que tu utilises ou non ces éléments.
Cordialement,
Ferrand