Fusion de cellule changeant en fonction des années

Bonjour à tous,

Je recherche la solution pour fusionner les Cases des mois pour quels correspondent avec les jours sur le calendrier.

Le souci que j'ai c'est quand je change d'année, les jours se décalent car le planning est fait en fonction des semaines.

J'ai testé des fonctions des recherche pour rechercher le premier et dernier jour du mois dans la plage, mais sans résultat.

Voici une capture pour illustrer mon souci

capture

Bonsoir,

fusionner les Cases des mois pour quels correspondent avec les jours sur le calendrier

Cela ne me paraît pas d'une clarté limpide pour identifier à coup sûr les cellules que tu veux fusionner.

S'agit-il de celles qui en ligne présentent la même coloration ?

Si c'est le cas, dans la mesure où la coloration identifiant un "statut" n'exclue pas les week-ends et jours fériés, il serait souhaitable que la coloration afférente à ces derniers résulte alors d'une MFC). Mais précise d'abord ce que tu veux obtenir car en l'état je ne saurais quelles cellules fusionner.

Cordialement,

Ferrand

Bonjour,

MFerrand, le mois se cache au-dessus des semaines.

Une proposition, mais avec 'centrer sur plusieurs colonnes' à la place de fusionner à éviter.

Il est dans Feuil1.

Par contre je ne sais pas ce qui est arrivé à ta feuille mais à partir de février le mois ne veux pas s'afficher (pourtant bien présent en AK10), et l'encadrement de droite non plus ( regarde encadrement de BM10).

Je ne pense pas que ce soit mon code qui fonctionne pour janvier mais comme j'ai les yeux fatigués...

eric

Edit : fichier corrigé

Wouah ! J'ai compris la phrase ! Merci Eriiic.

Quelques lignes de code à ajouter à réinitialisation annuelle. Si fusion, on efface, défusionne, refusionne (boucle repérant les 1er)...

Cela ne devrait pas être plus long que le centrage multicolonnes, et la fusion ne gêne pas sur cette ligne.

Bonne soirée à vous.

Ferrand

J'ai retrouvé février sur mon exemple. En JA10 !?!

Tu m'as mis sur la piste, en fait il restait des fusions sur cette ligne qui perturbaient.

Et comme il subsistait un pb pour la dernière cellule isolée qui ne s'encadrait pas du coup je suis passé en fusion.

Fichier corrigé.

eric

Merci pour votre aide, pour plus de précision.

Le réel souci que j'ai, c'est d'arriver à faire une recherche en VBA pour trouver le 1 er et le 31 du mois. Car les chiffres des dates ne sont pas des dates mais juste une incrémentation de +1 sur la formule du 1er jours de l'année :"=DATEREF+1-JOURSEM(DATEREF-1)."

Bonjour

Une étude à tester

Rebonsoir,

Je n'ai pas tiqué au départ, mais au 2e passage ta formule de calcul du lundi de la semaine 01 m'a intrigué.

Je l'ai donc testé rapidement sur les années 2008 à 2017.

Ta formule : 01/01 + 1 -JOURSEM(01/01 - 1) donne des résultats faux environ une année sur 2. Sur mon échantillon, c'est faux en 2010, 2011, 2012, 2016 et 2017.

Facile à voir pour 2016 : le 01/01 est un vendredi, la veille est donc un jeudi ; la formule : 01/01 + 1 - 5 = 01/01 - 4 = 28/12.

Une impossibilité car le lundi semaine 01 est obligatoirement entre le 29/12 et 04/01 inclus.

Et de fait, le 01/01 étant un vendredi ne laisse que 3 jours de sa semaine dans l'année 2016, semaine 01 commence donc le lundi 04/01.

La règle de base est que le 4 janvier est toujours dans la semaine 01. Le corrolaire est que le 28 décembre est toujours dans la dernière semaine (52 ou 53).

Je te propose volontiers la mienne qui décale le calcul au 3 janvier (qui est un dimanche si le 4 est un lundi, ce qui [JOURSEM renvoyant 1 pour le dimanche] simplifie la formule : 03/01 - JOURSEM(03/01) + 2

Pour toi, cela donnerait : (DATEREF+2)-JOURSEM(DATEREF+2)+2

Ou plus commodément : DATEREF-JOURSEM(DATEREF+2)+4

Cordialement

Ferrand

Bonjour,

non, rien

eric

Bonjour,

A propos de ton problème de détection du 1er de chaque mois (et du dernier jour) :

Si on appelle Orig la valeur de ta cellule C12, 1M la date du premier du mois, la cellule correspondant à la date du 1er se définit par les formules suivantes :

  • ligne : ENT((1M-Orig)/63)*24+10
  • colonne : MOD(1M-Orig;63)+3

Il y a une irrégularité de ton tableau à corriger : supprimer la ligne 82 pour rétablir à 24 l'écart avec le bloc au-dessus (sinon pb avec toute formule répétée ou boucle).

Dans la foulée, j'ai monté une fonction qui calcule les lignes et colonnes pour chaque plage à fusionner et renvoie un tableau dans lequel chaque plage à fusionner est définie par : ligne ; col. début ; col. fin ; chaîne mois (si mois à inscrire).

Elle est assortie d'une procédure qui l'utilise : elle efface les valeurs antérieures, défusionne, refusionne.

Tu peux tester ça dans le classeur en retour apprêté pour (en espérant ne pas t'avoir mis le "mauvais" des deux... ! ). Tu lances la macro FusionMois et tu vérifies le résultat.

Les macros sont dans Module2. A toi de voir le cas échéant comment tu peux utiliser dans ton programme.

Cordialement,

Ferrand

Je te remercie grandement pour le travail que tu as fais sur mon souci. Je viens d'essayer et ça fonctionne parfaitement sauf pour 2016 qui renvoi un erreur sur la ligne.

 .Cells(tpm(0, i), tpm(1, i)).Value = tpm(3, i)

Je n'ai pas bien compris comment utiliser la fonction : " Function PositMois() ".

Je vais prendre le temps pour comprendre comment fonctionne ton code je pense que ça va être très enrichissant .

Bonjour

Et sur le fichier que j'ai fait aucune remarque ?

Si je suis à côte du problème, il faut le dire

Salut,

En cours de vérification : pas d'erreurs sur 2015. Mais tu as une erreur en AH60 qui repart à 1 après 3. Il faut recopier AH59 sur AH60 pour rétablir la continuité. Mais le calcul pour fusion se fait indépendamment de ces cellules, donc (tant que je n'ai pas fait d'erreur) la fusion est bonne...

A suivre

Vraiment désolé Banzai je n'avais pas vue ton message. Je viens juste de regardé et je vois qu'il me reste énormément de chose à apprendre pour travailler correctement en VBA.

Banzai ton fichier fonctionne parfaitement, j'ai juste un souci quand je change la formule en C12 pour calculer les dates avec la formule

DATEREF-JOURSEM(DATEREF+2)+4 de MFerrand ça ne correspond plus du tout .

Je vais prendre quelques heures pour bien comprendre les codes que vous m'avez fourni. En tout cas merci beaucoup c'est vraiment encouragent d'avoir de l'aide et d'apprendre de vos codes bien structurés .

Tu as bien fait de tester sur 2016, qui commence le 4 janvier. Après mon discours sur la première semaine, et sachant que tu démarres le 1er lundi, j'ai omis ce cas ! Je suppose que l'erreur vient de là car elle intervient sur la première entrée. Je vois ça.

On n'a en principe pas de problème de ce type sur la fin d'année, il reste de la marge après le 31 (puisqu'on était au max avec 2015).

A+

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

Bonjour

Bonjour MFerrand

Une nouvelle version qui tient compte de la formule de MFerrand

Merci beaucoup c'est parfait ça fonctionne je peux placer le sujet en résolu.

Je vais essayer de bien comprendre le fonctionnement du code pour pouvoir si besoin m'en inspirer pour la suite.

Bon courage. N'hésite pas à demander...

Ferrand

Rechercher des sujets similaires à "fusion changeant fonction annees"