Microsoft 365 Compter les WE libres

Aloha

XLDnaute Accro
Bonsoir,
Dans le document ci-attaché se trouvent les données (heures) en rapport avec le contrat de travail de DUPONT Marie et DURAND Germaine.
Dans la ligne en haut les 24 heures de la journée + nuit
Colonne A: Date
Colonne B: Jour semaine
Colonne C: Nom et prénom de l'agent
Colonne D: le service dans lequel l'agent travaille
Colonnes E à AB: les heures en rapport avec le contrat de travail

Signification des symboles rencontrés:
X = 1 heure de travail
C = 1 heure de congé
RS = 1 heure réunion de service comptée comme heure de travail
T = Tutorat
HS = heure supplémentaire
...et il y en a d'autres

Double problème:

* le premier:

La règle: le repos ininterrompu hebdomadaire de 44 heures doit coïncider avec le week-end au moins 20 fois par an. Le week-end s’étend sur une période de deux jours consécutifs situés entre 6 heures le samedi matin et 6 heures le mardi matin.

Les périodes samedi 6h à mardi 6h sont en jaune.

Il s'agit donc de vérifier quand la personne avait un WE de libre suivant les règles ci-dessus
et de les mettre dans un compteur pour faire le bilan à la fin de l'année.

* le second:

Chaque salarié a droit à un repos ininterrompu de 44 heures par semaine. Dès la fin d’un repos hebdomadaire, le prochain repos hebdomadaire doit intervenir endéans les prochains sept jours. Les salariés qui n’ont pas pu jouir dudit repos auront droit à un jour de congé supplémentaire pour chaque période entière de 8 semaines, successives ou non, pendant laquelle le repos ininterrompu de 44 heures par semaine n’est pas accordé.

Il faut donc compter les périodes de 7 jours où la condition est remplie (donc pas 44 heures libres consécutives)

Je ne sais pas si ces poblèmes sont résolubles par seules formules ou s'il faut du VBA. La base de données retraçant chaque heure de chaque jour de l'année pour quelque 130 salariés (qui n'existe pas encore; les données sont disponibles dans des fichiers mensuels par service regroupant tous les salariés travaillant dans ce service; il faudra copier les données par VBA) sera assez importante: 130 * 365 = beaucoup de lignes

Quelqu'un parmi vous entrevoit-il/elle comment résoudre ce double problème?
Merci d'avance pour tout tuyau et toute aide!

Bien à vous
Aloha
 

Pièces jointes

  • Saisies.xlsx
    19.2 KB · Affichages: 185
Dernière édition:

CISCO

XLDnaute Barbatruc
Bonsoir

Re,
Manuellement j'en ai trouvé 1, et la macro aussi.
Cependant, je ne suis pas sûr avoir bien compris le message que tu veux me transmettre! Que veux-tu dire par "pour ce qui est de la fin", étant donné qu'il s'agit du mois de janvier?
A+
Aloha
J'avais l'impression que la macro ne donnait pas le bon résultat, Mais après vérification...

@ plus
 

Aloha

XLDnaute Accro
Re,
Je me suis amusé à composer une macro remplissant la feuille 44 HEURES. J'ai repris ma formule plus compliquée parce que la tienne donnait seulement un bon résultat pour la première personne, dans la ligne 6, et je n'ai pas su comprendre pourquoi.
Après maintes péripéties elle fonctionne maintenant, mais, c'est bizarre, à la fin elle inscrit encore un chiffre 17 n'importe où dans la feuille, et à chaque action de la macro autre part. Je n'y comprends rien. Toi peut-être?
A+
Aloha
 

Pièces jointes

  • Base.xlsm
    147.7 KB · Affichages: 5

CISCO

XLDnaute Barbatruc
Bonsoir

Il faut faire, à la fin de ta macro, avec
VB:
    Range("D6: D" & LastrowA).Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Tu avais juste oublié le : D.

@ plus

P.S : Attention, pour le moment, ta macro REMPLIR 44 HEURES ne fonctionne correctement que si on a sélectionné la feuille 44 HEURES avant de la lancer.
 

CISCO

XLDnaute Barbatruc
Bonsoir

A la fin de la macro Calculs, j'ai rajouté quelques lignes qui :
* Colorient en bleu les 44 h comprises dans des WE
* Mettent une bordure autour des périodes de 7 j ne convenant pas par rapport aux repos de 44 h.

@ plus
 

Pièces jointes

  • Base.xlsm
    159.8 KB · Affichages: 7

Aloha

XLDnaute Accro
Bonsoir,
Tu as bien pris la dernière version (message #242)?
Une bête faute avec la lettre D manquante.
J'avais essayer d'attacher "ma" macro à la macro Calculs, avec Call, mais je ne savais où exactement appeler la macro.

Il me vient à l'esprit à l'instant que la formule qui doit calculer le nombre de jours WE dus ne peut pas fonctionner comme ça: j'avais complètement oublié qu'il y a 6 périodes possible qu'il faut prendre en considération.
Je m'explique: il arrive assez souvent qu'un salarié change plusieurs fois sa tâche hebdomadaire, de sorte qu'il n'y a pas une seule date de début et date fin, mais jusqu'à 6! Même si ces périodes peuvent se répartir sur des années, il faut prendre en considération toutes les dates.

La feuille FM que j'ai complétée illustre ce que je viens de dire:
Pour prendre l'exemple le plus complexe de la fiche FM: DESSAINTES Diane: depuis son engagement en 2017 elle a travaillé 20 heures jusqu'au 31.1.2020; donc 20 heures du 1.1.2020 (puisque les périodes antérieures ne nous intéressent pas) au 31.1.2020; du 1.2.2020 au 30.9.2020: 30 heures; du 1.10.2020 au 30.11.2020: 40 heures et finalement du 1.12.2020 au 31.12.2020 (puisqu'il n'y a pas de date de sortie en 2020 et qu'il n'y a pas une 4ème période).
Il faut donc intégrer les 6 périodes dans le calcul des jours de WE dus.

Dans la formule pour la recherche dans la fiche FM jusqu'à la colonne AF, ce qui correspond à la réalité.
A+
Aloha
 

Pièces jointes

  • Base.xlsm
    128 KB · Affichages: 1
Dernière édition:

CISCO

XLDnaute Barbatruc
Bonsoir

J'ai bien fait avec ton dernier fichier Base (sauf erreur de ma part, entre mes diverses sauvegardes).

Tu peux placer ton Call dans la Sub Transfer, en dessous des autres Call, après
VB:
        'FEUILLE APRES FEUILLE dans Fsource
        For Each Wsh In Workbooks(Fsource).Worksheets
       
            feuilsource = Wsh.Name

            Call Saisies(Fsource, feuilsource, Fdestina, feuildestina)
       
            Call Database(Fsource, feuilsource, Fdestina)

A toi de définir les paramètres à mettre dans les parenthèses

@ plus
 

Aloha

XLDnaute Accro
Bonsoir

J'ai bien fait avec ton dernier fichier Base (sauf erreur de ma part, entre mes diverses sauvegardes).

Tu peux placer ton Call dans la Sub Transfer, en dessous des autres Call, après
VB:
        'FEUILLE APRES FEUILLE dans Fsource
        For Each Wsh In Workbooks(Fsource).Worksheets
      
            feuilsource = Wsh.Name

            Call Saisies(Fsource, feuilsource, Fdestina, feuildestina)
      
            Call Database(Fsource, feuilsource, Fdestina)

A toi de définir les paramètres à mettre dans les parenthèses

@ plus
Re,
Ils servent à quoi ces paramètres?
A+
Aloha
 

CISCO

XLDnaute Barbatruc
Bonsoir

La macro appelante, Transfer ici, utilise certaines variables (qui contiennent par exemple les noms des fichiers source, destinataire, ou d'autres grandeurs).
La macro appelée a besoin de certaines de ces variables pour tourner correctement (mais pas de toutes). Il faut donc les lui proposer, en ne leur donnant pas forcément le même nom dans la macro appelée, mais en les listant entre les parenthèses dans le même ordre.
Regarde comment sont construits les deux Call déjà présents dans Transfer.

Si tu n'y arrives pas, je te ferai ça demain.

@ plus
 

Aloha

XLDnaute Accro
Re,

Mais la macro appelée tourne aussi sans les paramètres, non?
En ce qui la concerne: J'ai défini d'abord LastRowA comme suit:
VB:
LastrowA = Sheets("44 HEURES").Cells(Rows.Count, "A").End(xlUp).Row
If LastrowA < 6 Then LastrowA = 6
J'ai mis la condition pour assurer que si la macro est démarrée, alors qu'il n'y a pas de données dans 44 HEURES, la macro efface les entêtes.

Ensuite j'ai défini LastrowA und deuxième fois, après le remplissage du tableau, sinon, si p.ex., au démarrage de la macro il y avait 7 noms, LastrowA avait la valeur 7, et qu'après la copie des nouvelles données il y en avait 14, alors pour la macro LastrowA avait toujours la valeur 7 et que la formule était copiée seulement jusqu'à la la 7ème ligne.

Pour revenir sur le problème supplémentaire décrit dans mon message #246, j'ai fait un faux raisonnement; heureusement c'est moins compliqué et si je ne me trompe pas la formule maîtrise les 6 périodes possibles puisque c'est toujours la dernière date seulement qui compte, les dates intermédiaires ne jouant aucun rôle.
Donc une fausse alerte.

A+
Aloha
 
Dernière édition:

Aloha

XLDnaute Accro
La dernière version du fichier
Je n'ai pas encore mis le Call.
D'ailleurs, chaque fois que j'exécute le code par F8 il saute à 2 reprises dans la Private Sub, mais il n'y fait aucune action.
 

Pièces jointes

  • Base.xlsm
    155.4 KB · Affichages: 2

Aloha

XLDnaute Accro
Bonsoir

La macro appelante, Transfer ici, utilise certaines variables (qui contiennent par exemple les noms des fichiers source, destinataire, ou d'autres grandeurs).
La macro appelée a besoin de certaines de ces variables pour tourner correctement (mais pas de toutes). Il faut donc les lui proposer, en ne leur donnant pas forcément le même nom dans la macro appelée, mais en les listant entre les parenthèses dans le même ordre.
Regarde comment sont construits les deux Call déjà présents dans Transfer.

Si tu n'y arrives pas, je te ferai ça demain.

@ plus
Bonjour,
Désolé, cela dépasse (déjà) mes maigres connaissances en VBA!
A+
Aloha
 
Dernière édition:

Aloha

XLDnaute Accro
Bonjour,
Je voulais importer les fichiers réels de janvier 2021, j'ai copié toutes les fiches des services de la Base.xls actuellement en service vers Base.xlsm et j'ai lancé la macro qui travaille longtemps pour émettre à la fin un message d'erreur, alors qu'elle veut copier depuis la Base.xls actuellement utilisée qu'e la macro a ouverte et qui ne se trouve pas du tout dans ToBeCopied! Bizarre, non!

Qui plus est, cette Base.xls se trouve sur un DVD!

A+
Aloha
 

Pièces jointes

  • message.JPG
    message.JPG
    18.2 KB · Affichages: 14
  • Erreur.JPG
    Erreur.JPG
    83 KB · Affichages: 15
Dernière édition:

CISCO

XLDnaute Barbatruc
Bonsoir

On peut faire sans ces paramètres, mais alors il faut mettre ce Call dans le module 1, ce qui donne
VB:
Sub Bouton1_Cliquer()
Sheets("SAISIES").Activate
Call Transfer
Call Tri_3_clés
Call Calculs
Sheets("44 HEURES").Activate
Call REMPLIR_44_HEURES

End Sub

@ plus

P.S : J'ai aussi des passages par Private Sub...
 

CISCO

XLDnaute Barbatruc
Rebonsoir
D'ailleurs, chaque fois que j'exécute le code par F8 il saute à 2 reprises dans la Private Sub, mais il n'y fait aucune action.

Cette Private Sub Worksheet_SelectionChange sert initialement à colorier en vert la plage de 7*24 h placée après toute cellule unique sélectionnée manuellement dans le tableau complètement à droite.
Elle est lancée automatiquement lorsque la sélection dans cette page SAISIES est changée, mais son contenu n'est complètement exécuté, à cause de certains tests placés dedans, que si on ne sélectionne qu'une seule et unique cellule, et pas plusieurs, et que la cellule sélectionnée se trouve dans le tableau complètement à droite. Elle sert à vérifier facilement, manuellement, ce qui se passe après tout repos de 44 h.
exemple Aloha.PNG


Donc, ici, à chaque fois qu'une autre macro X sélectionne des cellules de la feuille SAISIES, Excel lance cette Private Sub, ne fait rien d'autre (Puisque ce n'est pas ce qui est désiré) et passe à la ligne suivante dans la macro X.
De plus, maintenant qu'on supprime à la fin tous les tableaux intermédiaires de droite, ce remplissage ne sert plus à rien (on ne vérifie plus rien manuellement dans ce tableau intermédiaire). On peut supprimer cette Private Sub dans la feuille 1, ou mettre une apostrphe devant toutes ses lignes.

@ plus
 
Dernière édition:

Statistiques des forums

Discussions
312 079
Messages
2 085 129
Membres
102 785
dernier inscrit
Clémence