Tableau mensuel actualisation date
Bonjour à tous,
Une petite aide serait la bienvenue pour gagner du temps sur une tâche chronophage que je suis obligée de faire chaque mois...
EXCEL
Tableau avec date ( date longue) 1ère colonne.
2ème colonne une tâche à effectuée tous les mardi (symbolisée par une croix) de chaque mois.
Il faut que je fournisse ce tableau actualisé chaque mois ( donc réinsérer la date du 1er de chaque mois (avec le jour en écriture) et recocher ce fameux mardi.
Voila, donc ça pour environ une dizaine de tâches par mois a éxécuter les mêmes jours.
Je suis pas très à l'aise avec les macros mais je peux apprendre. J'attends vos astuces, si ça existe.....
Merci d'avance
Bon WE
Bonjour et bienvenue sur le forum
Avec ton fichier, ce serait plus commode...
Bye !
gmb a écrit :Bonjour et bienvenue sur le forum
Avec ton fichier, ce serait plus commode...
Bye !
Bonjour,
A vrai dire je n'ai pas le fichier vu que c'est professionnel....
Ma description du tableau est très abstraite je m'en rends bien compte ( surtout point de vue de l'intérêt :multiplier des fichiers identiques .... Mais c'est pour de la diffusion donc pas le choix...).
Du coup j'ai crée un petit fichier avec mois d'Avril + mois de Mai et trois interventions pour l'exemple.
Il faudrait que j'arrive à le reproduie par la suite car j'ai aussi d'autres travaux à réaliser sous le même genre de formats ( récurrence et date).
Je joins l'exemple
Merci.
Bonsoir,
Ta demande m'a paru bien anodine après ton premier post... mais je me fais peut-être des idées...
En tout cas, voici un dispositif de reproduction de ta feuille pour produire celle du mois suivant. On procède par copie pour conserver les formats et on met à jour après effacement... Pas compliqué donc. Tu as un bouton pour lancer la procédure.
Le bouton sera recopié avec la feuille et continuera de fonctionner pour produire le mois suivant, et ainsi de suite...
Cordialement.
Bonjour MFerrand,
C'est SUPER, le résultat est nikel....
En revanche je voudrais pas paraître ingrate, mais il faut que j'arrive à reproduire ce même système sur mes fichiers au boulot!
Car celui ci n'était qu'un tout petit exemple de tout ce que je dois faire...
Éventuellement est il possible d'avoir le tuto ?
Merci en tout cas !
Bon j'ai parlé un peu trop vite, c'est bon j'ai vu la macro et en ai fais un copié collé que je m'envoi au boulot !
Donc pas besoin de tuto c'est à peu près clair, après j'imagine que c'est de l'entrainement ( pour moi des copiés collés évidemment puisque je ne connais pas ce langage étrange)
Merciii !
Je vais donc clôturer la demande
Vraiment sympa grâce à vous je vais gagner au moins trois jours par mois ....
Bonjour,
Tu as tous les éléments en main, en analysant la macro, qui se trouve dans Module1 (un module standard) et est affectée au bouton ou forme que tu définira sur ta feuille de départ. Par la suite il sera recopié et toutes les copies pointeront sur la même macro...
En guise de tuto, je peux te refournir la macro assortie de commentaires explicatifs détaillés.
Je n'en mets pas ou très peu dans mes macros, considérant que c'est plus une gêne pour la lecture ultérieure qu'une aide, ils portent généralement sur des éléments qu'on maîtrisera assez vite à l'usage, et qu'on n'aura nul besoin de voir reproduits partout en permanence ou ne sont jamais assez explicatifs pour fournir tous les détails à prendre en compte dans une opération déterminée...
Ici, en n'étant pas tout à faire sûr que les explications soient vraiment exhaustives, elles dépassent déjà largement le volume de la macro !
Sub MoisSuivant()
'Déclarations de variables : mois pour définir le nom de la feuille à ajouter,
'd pour la date du 1er jour du mois suivant, dj pour calculer le quantième du
'dernier jour du mois, j servira à calculer les lignes où mettre les "X" et i
'sert de variable compteur pour toutes les boucles.
'Le type des variables est déclaré en utilisant le caractère de déclaration de
'type : % = Integer, $ = String, d qui n'a rien est de type Variant.
Dim mois$, d, i%, j%, dj%
'A partir de la feuille de laquelle on lance la procédure pour produire la feuille
'du mois suivant, on calcule la date du 1 du mois suivant (en ajoutant un mois au
'mois actuel) et on définit le nom de la feuille du mois suivant à partir de cette
'date. Puis on copie la feuille en positionnant la copie juste après.
With ActiveSheet
d = DateAdd("m", 1, .Range("C2").Value)
mois = Format(d, "mmmm yyyy")
.Copy after:=Worksheets(.Name)
End With
'La feuille copiée était la feuille active jusqu'à la copie, mais en copiant la
'copie devient automatiquement la feuille active. On profite de cette faculté pour
'la nommer.
ActiveSheet.Name = mois
'[NB- L'instruction With... End With a pour effet de placer en mémoire un objet pour
'permettre de s'y référer tant qu'on se trouve entre les deux termes de l'instruction.
'Pour toute expression commençant par un point, le point réfère à l'objet déclaré avec le
'With qui précède immédiatement. Plusieurs instructions With... End With peuvent
'être imbriquées.]
'On commence par apprêter la nouvelle feuille : on met la date dans la cellule
'd'en-tête, on efface les 31 lignes du 'calendrier' (sur les 4 colonnes), on suppprime
'également les bordures des 4 dernières lignes (le mois se terminant du 28 au 31, on
'les reconstruira par la suite en fonction du dernier jour...) mais on ne touche pas
'aux formats de cellules (pour éviter d'avoir à les redéfinir), et enfin on calcule
'le quantième du dernier jour (on ajoute un mois à la date du 1, on retranche un jour,
'et on extrait le jour de cette date).
With Worksheets(mois)
.Range("C2") = d
.Range("C4:F34").ClearContents
.Range("C31:F34").Borders.LineStyle = xlLineStyleNone
dj = Day(DateAdd("m", 1, d) - 1)
'On poursuit en plaçant ensuite les dates dans le calendrier au moyen d'une boucle de
'1 à dj (dernier jour). On tient compte pour définir la ligne que le 'calendrier'
'commence ligne 4 (donc i+3) et que la date d est celle du 1, donc qu'il faudra
'affecter à chaque ligne la date d ajustée par +(i-1).
For i = 1 To dj
.Cells(i + 3, 3) = d + i - 1
Next i
'On ajuste dj de façon que sa valeur corresponde à la dernière ligne du 'calendrier'
dj = dj + 3
'On reconstruit les bordures à partir de la ligne 31 (correspondant à la date du 28).
'[Noter les With... End With imbriqués (pour raccourcir le code à écrire)]
'On définit d'abord l'ensemble des bordures sur le style intérieur, puis on reprend
'les bords latéraux et bas pour en redéfinir l'épaisseur.
With .Range("C31:F" & dj)
With .Borders
.LineStyle = xlContinuous
.Weight = xlThin
End With
.Borders(xlEdgeLeft).Weight = xlThick
.Borders(xlEdgeRight).Weight = xlThick
.Borders(xlEdgeBottom).Weight = xlThick
End With
'Il s'agit maintenant de cocher les lundis en colonne D. On va donc calculer la
'ligne où se trouve le premier lundi du mois : si le 1 est un lundi, ce sera la 1re
'(donc la ligne 4), si c'est un dimanche, ce sera la 2e, si c'est un samedi, ce sera
'la 3e..., la ligne du 1er lundi avancera de 1 au fur et à mesure que le jour du 1 du
'mois recule du lundi au mardi précédent.
'Weekday (équivalent à JOURSEM) renvoie 1 à 7 pour les jours du dimanche au samedi,
'il faut donc ramener cette suite de 0 à 6 du lundi au mardi mais en inversant l'ordre
'de la suite (mardi renvoyant 6, mercredi 5, jeudi 4... dimanche 1 et lundi 0).
'Et au nombre trouvé, il suffira d'ajouter 4 pour obtenir la ligne du lundi.
'Si le 1 est un lundi, Weekday(d) renverra 2. Pour transformer les valeurs renvoyées
'en une suite de 0 à 6 (0 pour le lundi) on doit faire (Weekday(d)-2) Mod 7 ou
'(Weekday(d)+5) Mod 7. En effet, en ôtant 2 la valeur du lundi est ramenée à 0 et en
'en ajoutant 5 (complément à 7) le modulo de 7 renvoie également 0. Mais on aurait une
'suite non inversée (de 0 à 6 du lundi au dimanche). Pour l'inverser, il faut déduire
'la valeur renvoyée par Weekday d'un nombre constant, choisi de façon que le modulo 7
'de cette différence renvoie 0 pour le lundi.
'Weekday renvoyant 2 pour le lundi, en le retranchant de 9 on obtiendra 7 pour lequel
'modulo 7 renverra 0. On peut vérifier que la suite s'en trouvera bien inversée:
'pour mardi, 9-3=6 (renvoyé), pour mercredi, 9-4=5 (renvoyé... pour samedi, 9-7=2
'(renvoyé), pour dimanche, 9-1=8 (1 renvoyé).
'On calcule donc ainsi la ligne où se trouve le 1er lundi.
'Par une boucle de 0 à 21, assorti d'un pas de 7, on coche les 4 lundis.
'Et on vérifie la présence d'un 5e lundi pour le cocher s'il y a lieu.
j = (9 - Weekday(d)) Mod 7 + 4
For i = 0 To 21 Step 7
.Cells(j + i, 4) = "X"
Next i
If j + 28 <= dj Then .Cells(j + 28, 4) = "X"
'Il n'y a plus qu'à renouveler cette opération pour cocher le mardi en colonne F.
'On détermine la ligne du 1er mardi selon le même principe, en modifiant la valeur
'constante de laquelle déduire Weekday(d) en fonction de la valeur renvoyée par cette
'expression pour le mardi. On retiendra donc 10 (10-3=7)...
'Même opération donc que pour le lundi.
j = (10 - Weekday(d)) Mod 7 + 4
For i = 0 To 21 Step 7
.Cells(j + i, 6) = "X"
Next i
If j + 28 <= dj Then .Cells(j + 28, 6) = "X"
'Enfin pour le jeudi on fait de même. Weekday(d) ranvoyant 5 pour jeudi, on le
'déduira d'une constante établie à 12 (12-5=7)...
'Seuls les deux premiers jeudis étant à cocher en colonne E, on réduit la boucle
'en conséquence.
j = (12 - Weekday(d)) Mod 7 + 4
For i = 0 To 7 Step 7
.Cells(j + i, 5) = "X"
Next i
End With
End SubCordialement