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
Bonjour
Re,
Je dirais qu'il serait intéressant d'avoir le nombre des repos ne convenant pas, pour être renseigné plus précisément et être averti à temps pour pouvoir empêcher que cela continue.
OK, et effectivement plus pratique.
Je ne comprends pas le pourquoi de ta remarque puisqu'il y a de toute façon autant de formules que de salariés dans cette colonne!
Il faut juste que la personne qui fera ce contrôle pense à faire ce petit calcul à chaque fois qu'il voit un nombre non nul dans cette colonne. Et, entre un coup de fil, le voisin qui fait du bruit... Mais comme effectivement, c'est plus pratique pour modifier le planning les semaines suivantes pour ne pas avoir de problème (Attention, s'il y a un 5 ou un 6, "danger"), je laisse le nombre X et pas ENT(X/8).
Cette situation est d'autant plus intéressante, qu'il y a par hasard des C (congé) en jeu et j'ai posé la question à la directrice si les C sont traités comme les X (heures travaillées) ou non. Je dirais que oui, mais je dois me baser sur sa réponse.
La méthode utilisée ne tient compte pour le moment que des cellules vides... S'il faut prendre en compte les C, il faudra faire des modifications, mais je ne pense pas que cela soit très difficile.

En ce qui concerne la feuille Database:
1) Je vois que dans le fichier Base que tu as mis sur le forum, les données collées dans Database ne commencent qu'à partir de la colonne D. Pourtant, il me semble que la macro CopyDataToDatabase() met des données dès la colonne A. Est-ce que je me trompe, ou est-ce que tu as supprimé les données des 3 premières colonnes ?
2) Lorsque je fais des essais avec des fichiers Septembre et Octobre, j'obtiens sur cette feuille les données d'octobre en premier, puis celles de septembre. Est-ce que cela pose problème ?

@ plus
 
Dernière édition:

Aloha

XLDnaute Accro
Re,
Il faut juste que la personne qui fera ce contrôle pense à faire ce petit calcul à chaque fois qu'il voit un nombre non nul dans cette colonne.
Je ne comprends pas ce que tu veux dire là, désolé.
S'il faut prendre en compte les C, il faudra faire des modifications, mais je ne pense pas que cela soit très difficile.
Il faut que j'attende d'être fixé sur ce point avant de changer quoi que ce soit en ce qui concerne les C.
Théoriquement il serait sûrement possible d'empêcher, si nécessaire, les C d'être copiés depuis les feuilles individuelles, mais ce serait dommage, puisque si tout est copié toutes les saisies de tous les salariés sont réunies dans une feuille, ce qui pourrait être intéressant pour faire des statistiques; donc il vaut mieux tout copier.
Je vois que dans le fichier Base que tu as mis sur le forum, les données collées dans Database ne commencent qu'à partir de la colonne D. Pourtant, il me semble que la macro CopyDataToDatabase() met des données dès la colonne A. Est-ce que je me trompe, ou est-ce que tu as supprimé les données des 3 premières colonnes ?

Oui, en effet, j'ai effacé le mois (A), le nom (B) et le service (C) pour anonymiser.
Lorsque je fais des essais avec des fichiers Septembre et Octobre, j'obtiens sur cette feuille les données d'octobre en premier, puis celles de septembre. Est-ce que cela pose problème ?
Mais seulement si tu importes octobre en premier, non?
Dans la réalité cela n'arrivera pas, puisque les données sont transférées mois par mois. Je ne pense pas que cela poserait problème si 2 mois étaient renversés, ces données étant utilisées par des formules qui fournissent mensuellement les valeurs intermédiaires (heures travaillées depuis le 1.1. et heures restant à travailler jusqu'au 31.12., congé pris et restant etc.) et qui aditionnent les valeurs de Database depuis le 1.1. jusqu'au mois avant celui pour lequel les nouvelles fiches sont produites.
A+
Aloha
 

CISCO

XLDnaute Barbatruc
Bonsoir

En pièce jointe :
* La macro Transfert (Remplissage des feuilles SAISIES et Database) (dans le module 3), qui utilise 2 autres macros, Saisies et Database.
* La macro faisant le tri (dans le module 2)
* Et la macro faisant les calculs (dans le module 3)

J'y ai mis pas mal de commentaires car nous aurons peut-être besoin d'y retoucher dans quelque temps...
J'espère que tout marche correctement. Cela tourne en une dizaine de secondes (Il fallait 5 minutes avec les premières versions dans ce fil !).

Il faut que les fichiers source comportent une feuille nommée Codes, une autre Résumé et une autre Tableau. Si cela n'est pas le cas, il suffit d'ajouter une apostrophe devant la ligne Fichierouvert.Sheets(Array("Codes", "Résumé", "Tableau")).Delete dans la macro Sub Transfer() dans la partie FICHIER après FICHIER.
Il faut aussi que les fichiers source soient tous dans un répertoire nommé Tobecopied, ce dernier étant dans le même répertoire que dans le fichier où on veut tout transférer, Base dans ton cas. C'est la configuration qu'il y avait sur la macro dans Base. Ce qui fait que le fichier Base utilise un chemin Blablabla, et les fichiers source, un chemin Blablabla Tobecopied.

Le problème signalé précédemment concernant l'enchainement des fichiers octobre, septembre, n'existe effectivement pas dans la pratique puisque normalement, on ne transfère pas deux mois en même temps. Lorsqu'on demande à Excel de lire tous les fichiers dans un répertoire, de façon automatique, je ne sais quel critère est utilisé (Peut-être par ordre alphabétique, ce qui expliquerait qu'Octobre 2020 service 1 soit ouvert avant Septembre 2020 service 1).

@ plus

Francis
 

Pièces jointes

  • Aloha Saisies tableau trié au début24.xlsm
    68.9 KB · Affichages: 2

Aloha

XLDnaute Accro
Re,

Merci beaucoup, je vais tester et si je ne rencontre pas de problèmes je vais préparer un fichier pour les gestionnaires pour qu'ils puissent tester et contrôler les résultats; ils sont mieux habilités pour faire cela que moi.

Lorsqu'on demande à Excel de lire tous les fichiers dans un répertoire, de façon automatique, je ne sais quel critère est utilisé (Peut-être par ordre alphabétique, ce qui expliquerait qu'Octobre 2020 service 1 soit ouvert avant Septembre 2020 service 1).
Oui, c'est l'explication logique, qui dans la pratique n'existe pas.
Il faut aussi que les fichiers source soient tous dans un répertoire nommé Tobecopied, ce dernier étant dans le même répertoire que dans le fichier où on veut tout transférer, Base
C'est exactement cela, mais pour que ton fichier puisse fonctionner, il doit s'appeler Base

Il y a un truc qui me vient à l'esprit à l'instant et que j'avais oublié: le fichier Base en service est un fichier .xls et pas .xlsm, donc le vieux format. J'espère que cela ne posera pas de problème d'intégrer ta solution dans un fichier .xls?

00:07

Je viens de tester: cela fonctionne et la vitesse est très bonne: 45' pour presque 4500 lignes!

Je pense que je peux donner ce fichier pour qu'il soit testé.
J'ai fait un peu de cosmétique (e.a. formatage conditionelle pour mettre en bleu les WE à partir de 20, l'autre colonne en orange pour 6 et 7 et rouge à partir de 8) et j'ai réuni les 3 macros dans un seul bouton (avec Call).
J'ai ajouté une feuille où j'affiche uniquement les résultats par formules toutes bêtes avec SI(). Il serait aussi intéressant de les regrouper par service, dans une prochaine étape.
Dans cette feuille j'ai aussi copié le bouton dans lequel j'ai réuni tes 3 macros et que j'ai placé dans SAISIES.
Il fallait que j'ajoute Sheets("SAISIES").Activate pour que cela fonctionne en appuyant sur le bouton dans cette nouvelle feuille.

Pour qu'il soit tenu compte de ce que je viens de faire, je le joins ici, pour que tu travailles alors sur ton fichier modifié, -que j'ai rebaptisé Base pour que les macros fonctionnent-, si tu veux y faire quelque chose.

Je viens de constater que la colonne BO de Database n'est pas remplie: elle contient les remarques que les utilisateurs peuvent communiquer au gestionnaire en les inscrivant dans la cellule AU65 dans les fiches individuelles.
A+
Aloha
 

Pièces jointes

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

CISCO

XLDnaute Barbatruc
Bonjour

Je viens de constater que la colonne BO de Database n'est pas remplie: elle contient les remarques que les utilisateurs peuvent communiquer au gestionnaire en les inscrivant dans la cellule AU65 dans les fiches individuelles.
A+
Aloha
1) Comme il ni y avait pas de remarque dans les cellules AU65, je n'avais pas remarqué ce défaut. Pour le corriger, il faut faire deux modifications :
* Dans la sub Saisies, rajouter la ligne en rouge ci-dessous
.Range("F5:AC65").UnMerge
.Range("AU65").UnMerge
DLsourc = Workbooks(Fsourc).Worksheets(feuilSourc).Cells(Rows.Count, 1).End(xlUp).Row
(car la copie sur des cellules fusionnées ne fonctionne pas)

* et dans la sub Database
Tout en bas, remplacer
Workbooks(Fdesti).Worksheets("Database").Range("A" & DL + 1).Resize(1, UBound(varData, 1)) = varData
par exemple par
Workbooks(Fdesti).Worksheets("Database").Range("A" & DL + 1).Resize(1, 67) = varData
(Je ne comprend pas trop pourquoi, mais puisque cela fonctionne avec 67, on fait avec 67 au lieu de UBound(VarData,1))

2) Pour que cela soit plus pratique, je vois deux améliorations possibles à apporter au fichier :
a) Mettre les plannings, les tableaux, non pas sur une feuille, mais sur plusieurs, à savoir une par service.
b) Avoir une macro allant directement sur la partie concernant telle ou telle personne, au besoin avec des MFC mettant en évidence les repos "à problème".

On verra à l'usage.

Je pensais que vous pouviez faire les modifications directement dans le tableau trié de gauche, puis relancer les calculs. C'est le cas, sauf que ces modifications changent parfois le contenu de la feuille Database, qui est automatiquement remplie par la macro Transfer. Autrement dit, les corrections faites à la main ne suffisent pas, il faut forcément utiliser la macro Transfer.

@ plus
 

Aloha

XLDnaute Accro
Bonsoir,
Mettre les plannings, les tableaux, non pas sur une feuille, mais sur plusieurs, à savoir une par service.
Il y a déjà plus de 20 feuilles et aussi une par service avec les salariés et leurs données de base.
Avoir une macro allant directement sur la partie concernant telle ou telle personne, au besoin avec des MFC mettant en évidence les repos "à problème".
Je ne comprends pas tout à fait comment tu vois ça. Tu veux dire pour "isoler" une personne choisie?
Je pensais que vous pouviez faire les modifications directement dans le tableau trié de gauche, puis relancer les calculs. C'est le cas, sauf que ces modifications changent parfois le contenu de la feuille Database, qui est automatiquement remplie par la macro Transfer.
Les modifications dans Database peuvent être faites à la main: ce ne sont que des valeurs; les gestionnaires y sont habitués. Théoriquement il y aurait sûrement moyen de procéder aux modifications dans Database par une nouvelle macro. Théoriquement.
Si je comprends bien, après avoir fait une modification dans SAISIES il suffit de lancer la macro Calculs et il en est tenu compte pour les résultats. dans database on modifie à la main.
Autre solution: comme il est impérieux que les fiches mensuelles soient aussi à jour, c'est là qu'il faudrait en réalité faire la modification et réimporter le fichier ou au moins la fiche (qui nécessiterait encore une macro demandant quelle fiche il faut réimporter; laissons tomber, trop compliqué); cependant, le hic dans cette façon de procéder: il faudrait effacer les données déjà importées dans les deux fiches; compliqué aussi. Il vaut mieux laisser tomber cette idée et modifier manuellement aux 3 endroits.


Pour la remarque, j'ai cherché partout dans la macro, mais comme elle dépasse mes capacités de compréhension, je n'ai pas trouvé.
Je vais modifier comme tu as écrit.
A+
Aloha
 

Aloha

XLDnaute Accro
Re,
Ce serait pas mal, avec bouton pour imprimer, la date et tout, mais il y a aussi moyen d'isoler une personne par filtre.

Autre chose:
j'avais écrit hier que le fichier original est au format .xls. Penses-tu que cela ne posera pas problème?
A+
Aloha
 

CISCO

XLDnaute Barbatruc
Re
Autre solution: comme il est impérieux que les fiches mensuelles soient aussi à jour...
Effectivement, c'est logique. Dans ce cas :
* modifications manuelles dans le fichier mensuel,
* modifications manuelles sur la feuille Saisies (Si on utilise la macro Transfer actuelle, elle mettrait toutes les données en plus, en bas de la feuille SAISIES. Il y aurait donc des doublons (2 fois le 1er du mois, 2 fois le 2 du mois... pour toutes les personnes du service concernée)).
* macro Calculs
* et modifications manuelles dans Database...
Pas très pratique tout ça.

Si vous avez souvent des modifications à faire, le mieux serait de modifier la macro Transfer pour qu'elle supprime les données de la personne, ou du service concerné, pour le mois concerné uniquement, si elles existent déjà dans la feuille SAISIES, avant de réimporter l'ensemble, modifié.

Mais bon, avant d'avancer dans cette direction, attendons le résultat des tests.

@ plus
 
Dernière édition:

CISCO

XLDnaute Barbatruc
Re
...mais il y a aussi moyen d'isoler une personne par filtre.
Effectivement, autant faire avec un filtre.
j'avais écrit hier que le fichier original est au format .xls. Penses-tu que cela ne posera pas problème?
Je ne connais pas précisément les différences entre ces diverses versions. Je viens de faire un test avec le fichier sauvegardé en .xls, et cela semble tourner correctement. J'ai juste un message signalant que certaines MFC ne fonctionneront peut-être pas correctement.

@ plus
 

Statistiques des forums

Discussions
311 720
Messages
2 081 910
Membres
101 837
dernier inscrit
Ugo