Offset avec VBA

Merci vraiment pour votre disponibilité.

Je confirme.

Merci!

Bonjour,

Je pense pouvoir tenir un mode de calcul pour les roulements 3 à 6... il reste à matérialiser et vérifier que ça marche. En principe un dispositif cyclique se poursuit ad -eternam... La durée d'un cycle est ici égale à un nombre de semaine correspondant aux "roulants" : 3 pour 3, 4 pour 4... 6 pour 6.

Il me semble que si tu tiens à l'afficher mois par mois, tu ne peux pas le construire comme si on démarrait chaque mois. Une continuité est nécessaire, chaque semaine doit prendre le relais de la semaine précédente sans rupture...

Et dans ce cadre, il me semble que ton problème principal sera de passer d'un roulement à l'autre : 3 à 4, 4 à 5, ...5 à 4, 4 à 3. Et qu'il doit falloir pouvoir le faire au jour le jour, soit passer d'un roulement à un autre en cours de semaine.

Il faudrait donc que tu puisses dire : roulement 4 à partir de telle date, et à partir de la date donnée le planning est rectifiée, si on passe de 3 à 4, c'est qu'on a un entrant, si c'est de 5 à 4 c'est un sortant...

Il faudrait savoir dans ce cadre si tu entends faire une feuille par mois (et conserver les feuilles sur l'année, ou non), si la semaine à cheval en fin de mois est reprise en début de mois suivant...

Si c'est le cas, dans la mesure où dans quelques cas tu pourras avoir une semaine à cheval en début de mois et une en fin, une harmonisation de l'affichage sur 6 semaines, avec reprise auto de la dermière semaine mois précédent, assurerait tous les cas.

Pour ce qui est du planning et de ses variations, on doit donc pouvoir mettre en place un dispositif automatique.

Mais je crois que cela ne règlera pas tous les problèmes de gestion de ce type de régime de travail !

Cordialement.

Bonjour,

Une continuité est nécessaire, chaque semaine doit prendre le relais de la semaine précédente sans rupture...

. Ça se passe exactement ainsi. L'affichage se fait pour chaque mois(avec une répartition).

Et dans ce cadre, il me semble que ton problème principal sera de passer d'un roulement à: 3 à 4, 4 à 5, ...5 à 4, 4 à 3. Et qu'il doit falloir pouvoir le faire au jour le jour, soit passer d'un roulement à un autre en cours de semaine.

Ce cas de figure pourra être envisagé en cas d'exception. En temps normal pour chaque service, en fonction du nombre d'agents il a son roulement qui ne change qu'en cas de force majeur(un agent absent ou en congé); on les doubles même pour éviter de casser le roulement.

Si c'est le cas, dans la mesure où dans quelques cas tu pourras avoir une semaine à cheval en début de mois et une en fin, une harmonisation de l'affichage sur 6 semaines, avec reprise auto de la dermière semaine mois précédent, assurerait tous les cas.

c'est cette option même; mais le soucis est qu'il y'a des mois qui n'ont pas

6 semaines. Donc si on peut commencer à janvier et passer au mois suivant directement mais sur une autre feuille(une feuille par mois).

Mais je crois que cela ne règlera pas tous les problèmes de gestion de ce type de régime de travail !

En effet, mais les autres problèmes pourront être résolus au fur et à mesure.

Merci beaucoup!

Bonjour, et bonne année 2018 !

Petite intervention pour ne pas laisser s'enfouir trop le sujet, et pour te signaler aussi que je n'ai pas complètement laissé de côté ton fichier, il m'a accompagné lors du passage d'une année à l'autre...

Je me suis quelque peu amusé avec, si l'on peut dire, dimanche, puis lundi fait quelques coupes drastiques (mais pas d'inquiétude, la feuille de QUART est toujours là !) , puis mardi n'était pas spécialement un bon jour : je devais me préparer pour une petite intervention aux fins d'analyse (stopper compètement les anticoagulants déjà remplacés sur la semaine, me mettre à la diète 12 h avant, arrêter de fumer 48 h avant, ce dont je me suis aperçu une trentaine d'heure avant, ayant l'habitude de m'aligner sur l'alimentation !... bref, tout ça ne m'a pas mis d'excellente humeur), et donc tout ce que j'ai pu faire sur le fichier mardi... il m'est apparu clairement hier qu'il était sage de le défaire pour tout reprendre posément !

Je conserve par contre le travail précédent ! Il m'était apparu qu'on allait avoir besoin d'identifier les semaines sur l'année... En établissant dans les feuilles QUART mensuelles un affichage de 6 semaines, la première semaine du mois étant celle contenant le 1er du mois, il y aurait donc chevauchement d'une feuille à la suivante mais en numérotant on retrouvait facilement la continuité...

Une numérotation continue suffisait donc, mais se décaler de la numérotation officielle pour l'année en cours aurait pu entraîner des confusions. J'ai donc établi une fonction renvoyant le numéro de semaine d'une date dans l'année calendaire de cette date :

Function NSEMAN(ByVal d As Date) As Integer
    Dim dref, sref%
    Application.Volatile
    dref = DateSerial(Year(d), 1, 1)
    dref = dref - (Weekday(dref) + 5) Mod 7
    sref = IIf(dref > DateSerial(Year(d) - 1, 12, 28), 1, 0)
    NSEMAN = (d - dref) \ 7 + sref
End Function

Cette fonction calcule le numéro de semaine du 1er janvier : si le 1er janvier est dans la semaine 1 de l'année qui commence (comme c'est le cas en 2018) on débute la numérotation à 1, mais si le 1er janvier se trouve dans la dernière semaine de l'année précédente, on débute alors la numérotation à 0 (de façon à ne pas perturber la numérotation des semaines de l'année). On aura donc une numérotation de 0 à 52 ou 53, ou de 1 à 53 ou 54 [on déborde légèrement sur l'année suivante puisque affichant en décembre les 5 semaines qui suivent la semaine du 1er décembre.

Mais cette fonction servira en tant que telle relativement peu, elle nous servira surtout à calculer le numéro de la semaine débutant un mois. J'ai donc établi une fonction destiné à renvoyer ce numéro en fonction de l'année et du mois (laquelle utilisera la fonction précédente).

Function NSEMMOIS(a As Integer, m As Integer) As Integer
    Dim dm
    Application.Volatile
    dm = DateSerial(a, m, 1)
    NSEMMOIS = NSEMAN(dm)
End Function

Et dans la foulée, j'en ai ajouté une pour renvoyer, à partir de l'année et du numéro de semaine, les dates de la semaine concernée sous forme texte.

Function DATESSEM(a As Integer, s As Integer) As String
    Dim dref, df
    Application.Volatile
    dref = DateSerial(a - 1, 12, 28)
    dref = dref - (Weekday(dref) + 5) Mod 7
    dref = dref + s * 7: df = dref + 6
    DATESSEM = Format(dref, "dd-mmm") & " au " & Format(df, "dd-mmm yyyy")
End Function

NB- Les fonctions dont je mets les noms entièrement en majuscules sont destinées à fonctionner en feuille de calcul : de cette façon, la représentation graphique étant conservée par Excel (pas toujours, mais le plus souvent), cela les rapproche graphiquement des fonctions Excel. Mais ces fonctions restent utilisables en VBA. Par contre, pour les fonction destinées à une utilisation exclusive en VBA, les noms sont normalement composés (majuscules et minuscules)...

A la suite de ça, j'ai aménagé ta feuille MENU : je conserve les indications d'année et de mois (sur liste déroulante), un bouton Initialiser Mois (le mois sélectionné), procédure qui créera la feuille du mois (si elle n'existe pas déjà) et lancera dans la foulée la programmation du roulement en se basant sur le roulement antérieurement en cours (qu'on ira donc identifier en allant le chercher dans la semaine qui précède la 1re semaine du mois...) Ceci était destiné à répondre à ta première question relative à l'établissement automatique du roulement sur un mois...

S'il n'y a pas de semaine antérieure, il faut un point de départ ! J'y reviendrai maisj'ai prévu que l'on puisse démarrer automatiquement sans rien demander à personne !

Ceci étant, ce dispositif étant un peu trop rigide, j'ai donc envisagé de le doubler d'une possibilité de modifier le mois initialisé, à partir d'une semaine choisie, soit changement de roulement (par exemple passage de 3 à 4) et donc reprogrammation à partir de ladite semaine.

Cela permettra au moins une certaine souplesse, sachant que ce système pourra être réadapté pour que le changement puisse intervenir n'importe quel jour de la semaine... ce qui là offrirait le maximum de souplesse.

Laissons pour le moment ces points à une discussion ultérieure... J'ai donc ajouté une liste des semaines de l'année, en faisant appraître le début de chaque mois, et une colonne roulement qui sera utilisée lors des modifiications. Parallèlement, la feuille QUART est transformée en feuille modèle à partir de laquelle on génèrera les feuilles mensuelles. L'indication de l'année et du mois sur la feuille générée, l'initialisera pour le mois, et ceci fait il n'y aura qu'à y introduire la programmation selon le roulement en vigueur.

Si vérifier qu'une feuille existe ou non déjà, générer une feuille à partir d'un modèle, initialiser son affichage, sont des opérations rapidement faites, par contre indiquer les plages de travail selon un roulement donné est un peu plus compliqué... L'algorithme de succession cyclique étant défini, il reste à le traduire en tableaux hebdomaires : récupérer l'état programmé à la veille de la semaine où l'on doit poursuivre, le prolonger sur la nouvelle semaine, etc.

C'est là que ce que j'avais commencé m'a eu tendance à plutôt compliquer les choses, et qu'il m'est apparu sage de reprendre l'ensemble au départ... A suivre donc !

Cordialement.

Bonjour,

Merci infiniment!

Sans votre aide, je me demandais réellement si c'était vraiment faisable.

je voudrais vraiment aider mais je ne sais pas où commencer pour aider les autres.

Bonjour,

Comprendre ce que tu fais, cela t'aide toi, bien sûr ! mais cela te mettra en position d'en aider d'autres le moment venu...

Le problème de faisabilité se pose rarement avec Excel, c'est surtout le comment faire et comment on s'y retrouve dans ce qu'on fait qui se pose...

Note que dans ton sujet, on a passé beaucoup de temps au début parce que tu cherchais une solution partielle et ne posait pas le problème complet... on a avancé lorsque tu as défini de façon détaillé ce qui était commun et ce qui différait dans les différents cycles (roulements). Ce qui a permis de voir l'ensemble et comment à partir d'une position dans le cycle, pour un roulement donné, la suite pouvait se déduire, et qu'il était difficile d'arriver à une solution réelle sans la possibilité de pouvoir passer d'un roulement à un autre...

J'essaierai de te fournir un premier jet d'ici la fin de la semaine.

Ensuite on pourra sans doute affiner la façon de passer d'un roulement à un autre. Dans le cas d'un changement croissant, il y a un Entrant, là aucun problème d'insertion dans le cycle et pour le faire passer sur le roulement de niveau supérieur. C'est moins évident dans le cas inverse, où l'on a un Sortant et il y a variation selon la position du sortant au moment de la sortie... Je laisse ça de côté tant que je n'ai pas bâti la construction du tableau hebdo de base pour chaque roulement.

A+

Bonjour,

Comprendre ce que tu fais, cela t'aide toi, bien sûr ! mais cela te mettra en position d'en aider d'autres le moment venu...

Le problème de faisabilité se pose rarement avec Excel, c'est surtout le comment faire et comment on s'y retrouve dans ce qu'on fait qui se pose...

Note que dans ton sujet, on a passé beaucoup de temps au début parce que tu cherchais une solution partielle et ne posait pas le problème complet... on a avancé lorsque tu as défini de façon détaillé ce qui était commun et ce qui différait dans les différents cycles (roulements). Ce qui a permis de voir l'ensemble et comment à partir d'une position dans le cycle, pour un roulement donné, la suite pouvait se déduire, et qu'il était difficile d'arriver à une solution réelle sans la possibilité de pouvoir passer d'un roulement à un autre...

J'essaierai de te fournir un premier jet d'ici la fin de la semaine.

Ensuite on pourra sans doute affiner la façon de passer d'un roulement à un autre. Dans le cas d'un changement croissant, il y a un Entrant, là aucun problème d'insertion dans le cycle et pour le faire passer sur le roulement de niveau supérieur. C'est moins évident dans le cas inverse, où l'on a un Sortant et il y a variation selon la position du sortant au moment de la sortie... Je laisse ça de côté tant que je n'ai pas bâti la construction du tableau hebdo de base pour chaque roulement.

A+

Bien compris.

Merci!

Salut MrFerrand,

Si ça peut aider, on pourra laisser le soin a l'utilisateur de cocher le quart de la première semaine de l'année, puis à partir de là on pourra avoir une référence et continuer le cycle ...

Si cela peut mieux aider pour les formules. Je vois que juste le quart du 1 lundi du mois ne suffira pas quand on n'est plus dans le cas de roulement à trois, car par exemple avec roulement à 5 on ne sait pas qui des deux personnes en repos pendant cette journée devra reprendre le lendemain ou le sur le demain.

Pour éviter cela, on pourra manuellement faire pour la première semaine de l'année et continuer automatiquement sur les autres semaines.

Ce que j'avais prévu, pour rester dans un automatisme complet, c'est d'utiliser l'ordre dans lequel les participants sont listés au départ pour le démarrage. Quel que soit le roulement (3 minimum), il y en a toujours 1 qui démarrera au quart 3, 1 autre au quart 2 et 1 troisième au quart 1: je les codifie 3, 2, 1 pour identifier et les prend dans cet ordre.

Je codifie les suivants s'il y a lieu, 0, -1 et -2. S'ils n'apparaissent pas au démarrage, leur position est tout à fait identifiable. Car à chaque ajout tu ajoutes un jour de repos, et les 3 (max) en repos sont à un stade différent de repos.

Dans un roulement à 3, le 2e jour, le 3 sera en 2 ; le 2 sera en 1; et le 1 en 3 ; et ça continue ainsi: 3 > 2 > 1 >3... chacun étant en décalage d'un jour.

A 4, la position 0 correspond au jour de repos : le 3 passe en 2 ; le 2 passe en 1 ; mais le 1 là passe en 0(repos) et c'est le 0 qui passe en 3...

A5, le 0 est à son premier jour de repos, mais il y a un -1 qui en est à son 2e jour, donc : toujours 3 passe en 2, 2 passe en 1, 1 passe en 0(repos/1er jour) mais 0 passe en -1(repos/ 2e jour) et c'est -1 qui passe en 3...

A6, je redétaille pas, on a 3 jours de repos, donc 3 en repos mais qui en sont au premier, deuxième ou troisième jour de repos, et c'est alors le -2 se trouvant à son 3e jour de repos qui se retrouvera en position 3...

En prenant la question sous l'angle identification à partir de la semaine précédente, on considère une ligne de 28 cellule (7 jours x 4 quarts), prenons le cas d'un roulement 6 (pour voir l'ensemble) :

  • un X en cell 27 = termine au 3 donc reprend semaine suivante à 2
  • un X en cell 26 = termine au 2 donc reprend semaine suivante à 1 (NB- il aura aussi un X en cell 28 et le 1 de la semaine suivante (jour suivant) est dans la continuité !)
  • un X en cell 25 = termine au 1 donc passera en repos pour 3 jours (roulement 6) pour reprendre qu'en cell 15 (4 x 3jours = 12 + 3 (reprise au quart 3) = 15)
  • un X en cell 21 = a terminé au 1 le jour précédent et était 1er jour repos, passe donc en 2e jour repos pour reprendre en cell 11 (4 x 2jours + 3 = 11)
  • un X en cell 17 = a terminé 2 jours avant au 1 et était 2e jour repos, passe donc en 3e jour repos pour reprendre en cell 7 (4 x 1jour +3 =7)
  • un X en cell 13 = a termine 3 jours avant au 1 et était 3e jour repos, reprend donc en 3.
Tu remarqueras que lorsque l'on intercale un jour de repos cela crée un décalage de 4 (4 quarts)... on peut donc parfaitement les suivre et identifier la position de chacun...

Chapeau Mon cher,

Je n'avais jamais vu ça sous cet angle. Je comprends mieux maintenant.

Rien à dire. Vraiment Merci!!!!!

Salut !

Je voulais prendre de l'avance et essayer d'implémenter les codes VBA que vous avez fourni précédemment... Malheureusement je n'arrive pas à les implémenter.

A vrai dire je ne sais pas ou mettre ces codes.

De plus quand je mets des macros mon fichier devient anormalement très lourd(1 méga et quelques) alors que sans macro c'est quelque dizaine de kilo.

Merci!

Bonjour,

De quels codes parles-tu ?

J'ai fait hier toute la première partie qui doit aboutir à la constitution de la feuille mensuelle. J'en suis au débogage : 3 bogues levées jusqu'à présent, dont une concernait déjà un tableau préparatoire qui n'est toujours pas construit comme il devrait... à suivre...

Les macros ne font pas grossir un fichier ! C'est du texte, ça n'occupe pas plus de place que le texte en mémoire... Ton fichier fait 58 ko chez moi, il contient une douzaine de procédures actuellement, mais ce qui le fait fluctuer ce n'est pas ça, ce sont des créations-suppressions de feuilles...

Bonne journée.

Bonjour,

Merci et bonne journée à vous!

Bonjour,

De quels codes parles-tu ?

La dernière fois vous avez envoyé trois bouts de code VBA, je voulais voir par moi même ce que font ces codes...

C'est de ce code dont je parlais...

Je pense que c'est mieux que je patiente et attends la fin de ton implémentation..

Je m'excuse du dérangement...

Merci!!??

Re,

Il s'agissait de 3 fonctions destinées à une utilisation en feuille de calcul (comme les autres fonctions d'Excel). Elles le sont dans la feuille MENU PRINCIPAL.

Sur cette feuille :

L'année est mentionnée en I1. Le mois (liste déroulante) en I2. A gauche des mentions, un bouton : Initialiser Mois. On sélectionne le mois, on clique le bouton, et l'initialisation du mois se fait : production de la feuille mensuelle avec les Quarts...

En dessous, de H à L (H et I fusionnées), un tableau dont les en-têtes en ligne 6 sont : Dates, N° Sem, Roulement, Mois. Plus loin à droite sur la feuille : en Z7:Z18, la liste des mois (alimente la liste déroulante en I2). Dans la colonne qui précède (Y7:Y18), une formule :

=NSEMMOIS($I$1;LIGNE(1:1))

en Y7 : cette fonction renvoie le n° de semaine dans laquelle figure le 1er du mois. I1 est l'année, et LIGNE(1:1) s'incrémentera sur les lignes suivantes pour produire les numéros de mois de 1 à 12.

Ces deux colonnes peuvent être masquées, je les ai laissées visibles pour que tu les voies...

Revenons au tableau en H:L, dans la colonne N° Sem, en J8, figure la formule :

=NSEMAN(DATE(I1;1;1))

Cette fonction va renvoyer le n° de semaine de la semaine du 1er janvier de l'année indiquée en I1. Elle est conçue pour renvoyer 1 s'il s'agit de la semaine 1 de l'année, ou 0 s'il s'agit de la dernière semaine de l'année précédente.

A la suite, dans la colonne J une simple formule qui incrémente la succession des semaines (les numéros se suivent...). On débordera sur l'année suivante en affichant 6 semaines par mois (mais on poursuit la numérotation continue dans l'année). On aura donc toujours une semaine à la 53e ligne du tableau, qui pourra être 53 ou 52 et selon les années une à la ligne suivante (54 ou 53) : cette dernière dépendant de la position du 1er décembre, on utilise une formule en J60 :

=SI(NSEMMOIS(I1;12)=J55;J59+1;"")

C'est à dire que si en J55 figure le numéro de la semaine contenant le 1er décembre, cette ligne correspond à la 6e semaine de la feuille Décembre, donc on la porte, sinon c'est que la 6e semaine est la précédente et celle-ci n'est pas affichée.

Dans la colonne Mois (L) de ce tableau figure une formule (classique) destinée à afficher le nom du mois en regard de la semaine contenant le 1er du mois (qui sera la première portée sur la feuille mensuelle. Cette formule utilise les indications des colonnes Y et Z...

Dans la colonne Dates (H), un formule en H8 :

=DATESSEM($I$1;J7)

En I1, l'année, en J7 le numéro de semaine tel qu'on l'a calculé (dans l'année), la formule est tirée jusqu'à la ligne 60, les semaines s'incrémenteront au fil des lignes.

Cette fonction renvoie l'identification de la semaine sous forme texte, exemple : 01-janv au 07-janv 2018. Pour la ligne 60, elle est mise sous condition que J60 contienne un numéro (ainsi qu'on l'a vu plus haut).

Je lâche déjà ça avant de poursuivre...

Tu pourras donc voir dans le détail l'utilisation de ces fonctions personnalisées...

Sur la feuille MENU PRINCIPAL, j'ai placé en outre une zone de texte contenant les explications relatives au démarrage sans feuille mensuelle précédente.

Il faudra alors porter un code position (dans le cycle) correspondant à la position occupée le lundi de la semaine qui débute le tableau mensuel à produire.

J'ai déjà parlé de ces codes position : 3 (en Quart3), 2 (en Quart2), 1 (en Quart1) qu'on retrouvera pour tous les roulements de 3 à 6. S'y ajoute 0 (roulements 4 à 6) qui est la position de repos ou 1er jour de repos, -1 (roulements 5 et 6) qui est la position de 2e jour de repos) et -2 (roulement 6) qui est la position de 3e jour de repos.

Ces indication ne servent qu'en cas d'absence de feuille mensuelle antérieure, si cette dernière existe elles seront ignorées. Si elles sont utilisées, le programme vérifie qu'elles sont conformes et s'interrompt si ce n'est pas le cas...

Le déroulement du programme est le suivant : le clic sur le bouton Initialiser Mois lance une procédure InitMois. Cette dernière récupère les indication année et mois, reconstitue le nom de la feuille, soit : QUART2018-01 (utilisant une fonction NomFeuilMois), teste si cette feuille existe (à l'aide d'une fonction FeuilExiste), et s'interrompt si la feuille existe car l'initialisation du mois a alors eu lieu.

Sinon elle constitue le nom de la feuille du mois antérieur (pour janvier 2018, ce sera QUART2017-12, même fonction utilisée avec un paramètre différent) et teste son existence. Si la feuille existe, elle va calculer la semaine qui précède celle du mois à initialiser qui contient le 1 du mois. Dans le cas général on fait -1 sur le numéro de la première semaine du mois, mais lorsqu'il s'agit de l'année précédente, on calcule le numéro de la dernière semaine de l'année précédente (soit celle qui contient le 28/12) et on retranche éventuellement 1 s'il se trouve que le 1er janvier figure également dans cette dernière semaine (pour cibler la semaine qui précède effectivement celle que l'on prend en compte pour débuter le mois).

Dans le cas où la feuille n'existe pas, on appelle une fonction

VérifManu

qui va tester les indications de démarrage dans la liste des agents. Si celles-ci manquent ou ne sont pas conformes, cela est signalé et la procédure s'interrompt.

Si la procédure se poursuit, elle appelle une fonction PositMois dans tous les cas (mais les paramètres seront différents selon qu'on recherche sur la feuille antérieure ou que l'on prend les informations manuellement définies dans la liste des agents), qui lui renverra le roulement (mais ceci est accessoire) et qui va surtout constituer un tableau TbPos déclaré au niveau Module, lequel tableau (d'indices mini. 0) comprendra autant de lignes qu nécessitées par le roulement +1, et 7 colonnes. L'élément (0, 0) gardera en mémoire le roulement en vigueur. Les ligne 1 à ... en colonne 0 les noms des agents, en colonne 1 les codes position pour la 1re semaine du mois, et dans les colonnes suivantes (2 à 6) les codes position pour démarrer chaque semaine affichée dans le mois.

Cette fonction va opérer diversement selon qu'on opère avec la feuille mois précédent ou non.

Dans le premier cas, elle va chercher la semaine sur la feuille (la semaine figure en B3, B13, B23... jusqu'à B53, police à blanc donc non visible). Une fois trouvée, elle récupère le roulement en vigueur cette semaine (figurant en A3, A13, etc. également avec police à blanc) et dimensionne le tableau en fonction du roulement. Elle appelle également une fonction PosDiCycle qui lui renvoie un tableau de référence en fonction du roulement indiquant dans quelle colonne du planning chercher une mention de travail significative de la position occupée le dernier jour de la semaine (dimanche). Ce tableau comporte autant d'éléments que le roulement et les indications renvoyées sont classées dans l'ordre des codes position : 3, 2, 1, et éventuellement 0, -1, -2 (le tableau renvoyé sera : 27, 26, 25, et éventuellement 21, 17, 13). La recherche est opérée sur chaque ligne en utilisant ce tableau de référence et le code position trouvé mentionné en col. 1 du tableau TbPos. Ce tableau est ensuite repris pour transformer cette mention en code position pour débuter la première semaine du mois (en utilisant une fonction PosSuiv qui renvoie la position du jour suivant selon le roulement.

Dans le 2e cas, la fonction va récupérer les noms des agents dans la liste à prendre en compte avec la position indiquée en colonne D. Elle en constitue une chaîne en séparant le nom du code position par un "|" et chaque couple par ";". Elle définit le roulement par le nombre de couples (après tansformation de la chaîne en tableau sur la base du ";"), dimensionne le tableau TbPos, et y affecte les noms en col. 0 et les positions en col.1

A la suite de ces opérations différenciées, elle complète le tableau pour les colonnes 2 à 6 en utilisant la fonction PosSemSuiv qui lui renvoie la position du début de semaine en fonction de celle de la semaine précédente et du roulement.

La proc. InitMois se poursuit : elle stocke le numéro de semaine débutant le mois en TbPos(0, 1), et procède à la création de la feuille par copie de la feuille modèle QUART masquée. Elle initialise la feuille : nom, mentions en AD1 du n° de mois et AE1 de l'année (police à blanc pour les masquer), indication du roulement en A3, A13... A53.

Elle passe la main à une procédure InitRoulSem qui va compléter les tableaux plannings avec des "X" aux endroits voulus... (utilisant un tableau déclaré niveau Module : TbRS, qui ne justifie pas d'un tel traitement pour l'instant, et qui sera ramené au niveau variable locale si les compléments à apporter ne le justifient pas non plus). Elle constitue chaque tableau hebdo en utilisant les indications de TbPos et l'affecte à la feuille.

InitMois termine en laçant une autre procédure PosInitMoisEnCours qui indique le roulement en col. K sur la feuille MENU, en regard des semaines figurant sur le mois initialisé, et met à jour les indication de la colonne Roulement en cours de la liste agents pour les aligner sur le démarrage de la feuille du mois initialisé (dans le cas où celles-ci ont été utilisées, elle ne fait que remettre les mêmes !)

Elle vide le tableau TbPos et la feuille initialisée s'affiche.

C'est presque fini !

En l'état, pour tester, après avoir pris connaissance de l'ensemble, tu sers des codes en colonne D de la liste, sélectionne un mois (mais autant laisser janvier, il n'est pas prévu de revenir en arrière...), tu cliques sur Initialiser Mois, et tu verras un premier mois... Tu sélectionnes Février, tu cliques à nouveau et tu auras le second mois...

Pour tester plusieurs roulements, il faut supprimer toutes les feuilles créées précédemment et recommencer avec le nouveau roulement.

Tu n'as donc ici que la première partie qui consiste à initialiser sans sortir des rails sur lesquels on était... Ce qui est pour le moins rigide. Pour que l'on puisse fonctionner, il faut l'assortir d'une 2e partie qui se matérialisera par un bouton Modifier Mois qui doit permettre d'introduire des modifications ou de changer de rails (soit de roulement).

Mais il fallait établir cette base avant de voir comment la modifier. Il me faut un supplément de réflexion pour lister les différents cas de modifications et cerner les procédures qu'ils impliquent... Quelques éléments sont déjà introduits dans ce programme en prévision, comme le fait de dissocier la constitution des tableaux hebomadaires de la création de la feuille, car la procédure qui les constitue sera également utilisée par la suite, mais des modifications à ce programme seront certainement à apporter (on voit par exemple que si une modification était introduite sur la semaine qui sera la 1re semaine du mois suivant, le programme actuel n'en tiendrait pas compte pour l'initialisation de ce mois... il faut donc modifier : peut-être en basculant la recherche directement sur la semaine qui sera la 1re du mois initialisé, que l'on devrait toujours avoir le mois précédent (j'aurais sans doute dû déjà le faire, mais absorbé par les calculs de cycle, je n'ai vu cet aspect qu'ensuite...)

Enfin voilà déjà de quoi tester l'établissement de feuilles avec planning...

Cordialement.

Bonjour MFerrand,

C'est un boulant de génie que vous avez fait là!!!

Excel est fabuleux......

Je n'ai jamais su que Excel est capable de faire autant de choses et à la fois.

Il fallait juste trouver l'expert génie.

Je ne sais que dire......a part Merci!

Vraiment Merci MFerrand le génie de Excel!!!?

Salut!

Je viens de l'exécuter et ca marche parfaitement bien!!!

Je vais étudier les codes et essayer d'apprendre de leurs contenus pour avancer dans la suite du projet...

Comme je l'ai dit, mon premier post était assez flou, donc j'étais obligé de scinder et la première partie(la partie difficile) je pense vient d'être résolu.

Je vais apprendre comment créer une feuille puis comment créer des tableaux a l'intérieur tout en introduisant une formule.

Et je te rejoins avec ce que j'aurai ajouter...

Sans trop demander, est il possible de limiter le tableau des semaines du mois a la dernière semaine du mois(la semaine comportant le dernier jour du mois) ?

Vraiment Merci!

Je reviendrai pour la suite avec un nouveau poste mais avec le même fichier que vous venez de charger...

Merci!!!!

Merci... mais c'est pas fini ! J'avais pensé, comme je l'avais indiqué, introduire la possibilité de modification au niveau semaine, mais en fait il faudrait que tu puisses modifier à partir d'un jour quelconque...

Cela modifierait un peu la façon de calculer, mais si je dois modifier le calcul pour l'initialisation en me basant sur le lundi même semaine, au lieu du dimanche semaine précédente, cela fera déjà une modification sur laquelle je devrais pouvoir greffer un décalage jour pour trouver la situation sur n'importe quel jour. Il ne resterait donc qu'à définir une signalisation du jour à partir duquel appliquer une modification...

Laissons ce point de côté pour l'instant. La préanalyse que j'avais faite des modifications (que j'ai envisagée jusqu'ici sous l'angle modification du roulement, mais il y a aussi la possibilité d'un entrant et d'un sortant simultanés, ce qui en fait ne modifie pas le roulement et pourrait se régler par l'entrant prend la place du sortant, à vérifier tout de même selon les situations), la préanalyse donc me montrait que dans le sens croissant, un entrant, l'insertion dans le nouveau roulement pouvait être tout à fait automatique, il entrait en position de travail sur le quart3, et c'est celui qui se trouvait en position de reprendre sur ce quart qui se voyait décalé en repos, les autres suivant automatiquement...

On a un petit cycle de travail qui demeure quel que soit le roulement, sur 3 jours : quart3--quart2 et 4--quart1. Et un grand cycle dépendant du roulement qui intercale ou supprime des jours de repos entre deux petits cycles. Ce qui fait qu'un entrant démarrant sur un petit cycle au quart3 ne perturbe nullement les cycles des autres et permet l'introduction du repos correspondant en douceur...

Ce qui devrait exclure que deux entrants puissent entrer le même jour : un entre un jour et le second le lendemain.

Dans l'autre sens, c'est un peu plus compliqué. On peut sans difficulté prévoir qu'un sortant ne sort pas le jour où il serait de quart1, en effet, la veille il était de quart2, a enchaîné sur le quart4 et termine logiquement sur le quart1 qui prolonge le quart4 de la veille. On sort donc dans les autres cas : pas de problème si on était en repos la veille, on tombe selon le roulement sur un jour où on reprenait en quart3 ou l'on était encore en repos, ce qui peut d'ailleurs se ramener au jour où l'on aurait repris en quart3, le réajustement est là aussi automatique, celui qui n'aurait repris que le lendemain reprend un jour plus tôt dans le nouveau roulement et aucun cycle n'est perturbé.

Seul le cas où quelqu'un sort en cours de petit cycle, soit après avoir fait son quart3, le jour où il aurait été de quart2, oblige à des modifications car quelqu'un devra le remplacer sur son quart2 qui n'est plus fait...

On aurait donc des paramètres de modifications :

  • entrant : il faut indiquer qui entre, le reste est automatique
  • sortant : il faut indiquer qui sort, le reste peut être automatique dans certains cas, mais pour le cas indiqué, on ne peut que suggérer la modification logique pour rétablir un cycle fonctionnel pour tous, il conviendra de la valider car elle a un impact sur les cycles en cours...
  • et dans la suite logique, ouvrir une modification qui n'est plus automatique, et devient donc manuelle en indiquant les démarrages de cycles à la date du changement
  • et encore, comme il est toujours des éléments qui échappent aux mathématiques, il faut prévoir qu'une modification manuelle peut être introduite...

Je te livre tout ça pour ta réflexion, car c'est toi qui voit les impacts réels... et je laisse mijoter pour voir comment je vais pouvoir harmoniser le tout dans une procédure globale.

Cordialement et bonne fin de dimanche.

C'est bien reçu!

Je vais cogiter dessus....

Merci!

Je vous ferai part de ce que j'ai pu réaliser ou n'arrive pas à réaliser..

Bon dimanche à vous !

Je m'excuse du fait que j'ai gâché votre fin d'année avec un travail assez complexe ... Prochainement je veillerai à ne poster les jours de fête ou de fin d'année...

Merci!

Rechercher des sujets similaires à "offset vba"