Fichier planning congés

Bonjour à tous ,
un nouveau tableau a vous soumettre ,j’ai un fichier congés dans lequel je renseigne les congés planifiès par personne ,je souhaite pouvoir avoir une vision rapide et ,à la semaine .
Ci joint le tableau avec un exemple clair (enfin je pense )
Merci d’avance ,
Franck .
planning.xlsx (14,6 Ko)

Bonjour

Ci-joint ma proposition
Testes et dis moi
Attention fichier de type « .xlsm » pour le fonctionnement VBA à maintenir impérativement

planning.xlsm (24,6 Ko)

Merci pour ta proposition FFO,nous y sommes presque !!
Peux tu modifier le code pour que chaque recherche s’enregistre au fur et a mesure à la suite dans l’onglet « jours absents par semaine » et que du coup le numéro de semaine soit enregistré en colonne B.
Franck .

Ce qui veut dire que les enregistrements déjà récupérés ne doivent pas être effacés lors d un nouveau traitement pour une nouvelle semaine ?
En d autres termes ce nettoyage ne doit être réalisé qu à la main
N y a t’il pas risque d engendrer des doublons si par erreur un même semaine est sollicitée plusieurs fois ?

Merci de me dire

Oui c’est tout a fait ca ,je souhaite pouvoir conserver ces données ,pas grave qu’il y ait des doublons ,je préfére pouvoir agir manuellement sur les nettoyages .
Franck .

Il suffit pour celà de supprimer la ligne de nettoyage en début de code
C est celle qui se termine par ClearContents
Tu mets en début de la ligne une petite cote : ’
Elle se met en vert signe qu elle n’est plus active
Je te laisse opérer sinon je te transmets une version corrigée ainsi
Dis moi

J’ai supprimé la ligne .clear contents ,ca marche ,reste juste a enregistrer le numero de semaine en colonne B.
Franck .

Le voici avec le numéro de la semaine en colonne « B »

Testes et dis moi

planning.xlsm (23,6 Ko)

Un grand merci FFO !!
Le fichier est conforme a mes souhaits .
Bonne soirée,au plaisir .
Franck .

Merci pour cette réponse positive
Au plaisir de te retrouver et de t’aider à nouveau
Bonne utilisation

Bonjour FFO ,
Le fichier est vraiment bien mais j’aurais souhaité quelques éclaircissements sur le code ,je déchiffre presque tous mais quelques lignes me laisse perplexe,si tu peux m’expliquer :
"I=3 (a quoi cela correspond il ?)
For j= 0 to 4 ,idem je ne vois pas "
Merci de m’apporter tes lumières,je souhaite modifier légèrement le fichier et je pense qu’avec quelques explications je devrais y arriver seul .
Merci .
Franck .

Bonjour
La variable « i » représente la ligne traitée du tableau des semaines premier onglet
La première ligne est la numéro 3 donc la variable est affectée à cette ligne au depart de la boucle qui suit traitant toutes les lignes
La ligne de code For j= 0 to 4 est le depart d une boucle pour analyser sur chaque ligne traitée les 5 colonnes de la semaine
La variable colonne est déterminée juste avant la boucle traite à partir de celle-ci toutes les colonnes de la semaine en utilisant l’instruction Cells ainsi :
Cells(i,colonne+j)
i la ligne traitée
Colonne+j la colonne traitée

J espère avoir été claire et compréhensif

A toi de me dire

C’est effectivement plus clair !!
Du coup si je reprend le code et que je souhaite ajouter des colonnes en debut d’onglet « Congés » je dois modifier en remplacant « A2 » par la cellules decalée et modifier le Range « A » par la colonne oui se trouve les prenoms ?

On Error Resume Next
colonne = Sheets(« CONGES »).Rows(« 2:2 »).Find(What:=semaine, after:=Sheets(« CONGES »).Range(« A2 »), LookIn:=xlValues, lookat:=xlWhole).Column
If colonne > 0 Then
i = 3
Do While i < Sheets(« CONGES »).Range(« A » & Rows.Count).End(xlUp).Row + 1
lignecopie = Sheets(« JOURS ABSENTS PAR SEMAINE »).Range(« A » & Rows.Count).End(xlUp).Row + 1
If lignecopie = 2 Then
lignecopie = 3
End If

J’ai essayé de faire une modif en ce sens mais il semble que cela ne fonctionne pas ,j’ai du mal ecrire quelque chose .
Franck.
planning(1).xlsm (23,6 Ko)

Bonjour
Après analyse 2 petites corrections :

colonne = Sheets(« CONGES »).Rows(« 3:3 »).Find(What:=semaine, After:=Sheets(« CONGES »).Range(« D2 »), LookIn:=xlValues, lookat:=xlWhole).Column

ici After:=Sheets(« CONGES »).Range(« D2 ») si la recherche est sur la ligne 3 (Sheets(« CONGES »).Rows(« 3:3 »).Find) il faut mettre une cellule de cette même ligne donc ceci After:=Sheets(« CONGES »).Range(« D3 ») (Range (« D3 ») au lieu de Range(« D2 »))

Sheets(« JOURS ABSENTS PAR SEMAINE »).Range(« A » & lignecopie).Value = Sheets(« CONGES »).Cells(i, 1).Value

Le nom étant décalé de la colonne « A » à la colonne « D » il faut corriger cette ligne pour le récupérer sur la nouvelle colonne donc mettre ainsi :

Sheets(« JOURS ABSENTS PAR SEMAINE »).Range(« A » & lignecopie).Value = Sheets(« CONGES »).Cells(i, 4).Value

Ton fichier avec ces corrections qui pour moi fonctionne

Essaies et dis moi

planning(1).xlsm (24,2 Ko)

Merci ,
je comprend mieux pourquoi cela ne fonctionnait pas .
Je vais pouvoir travailler dessus .
Un grand merci FFO.
Franck .

De rien ce fut un plaisir
A ta disposition

Bonsoir FFO,
une nouvelle main tendue sur mon fichier ou j’ai tenté un code pour archiver mes données (module 2)mais je pense qu’il manque quelques lignes !!
Le fichier en pièce jointe ,
Franck
TEST PLANNING AVEC ARCHIVAGE.xlsm (28,2 Ko)

Re Bonsoir FFO,
j’ai retravaillé sur le code et il manquait effectivement quelques lignes ,voici le code complet qui fonctionne :
Sub COPIER_LES_VALEURS()

’ Enregistrement Macro

'lignerecopie = Sheets(« CP COMPILATION »).Range(« A » & Rows.Count).End(xlUp).Row + 1
lignerecopie = 0
On Error Resume Next
lignerecopie = Sheets(« CP COMPILATION »).Columns(« A:A »).Find(what:=«  », after:=Sheets(« CP COMPILATION »).Range(« A2 »), LookIn:=xlValues, LookAt:=xlWhole).Row
If lignerecopie < 3 Then
lignerecopie = 3
End If
I = 3
dercolonne = Sheets(« CP COMPILATION »).Cells(2, Columns.Count).End(xlToLeft).Column
Sheets(« CP COMPILATION »).Range(« A » & lignerecopie).Value = Range(« A,I »).Value
Sheets(« CP COMPILATION »).Range(« B » & lignerecopie).Value = Range(« B,I »).Value
Sheets(« CP COMPILATION »).Range(« C » & lignerecopie).Value = Range(« C,I »).Value
Sheets(« CP COMPILATION »).Range(« D » & lignerecopie).Value = Range(« D,I »).Value
Sheets(« CP COMPILATION »).Range(« E » & lignerecopie).Value = Range(« E,I »).Value
h = 1
I = 3
Do While I < Range(« B » & Rows.Count).End(xlUp).Row + 1
If Range(« B » & I) <> 0 And Range(« B » & I) <> «  » Then
Sheets(« CP COMPILATION »).Range(Cells(lignerecopie, h).Address, Cells(lignerecopie, h + 6).Address).Value = Range(« A » & I, « G » & I).Value
h = h + 6
End If
If h > dercolonne Then
h = 1
lignerecopie = lignerecopie + 1
End If
I = I + 1
Loop

MsgBox " Copie Effectuée …"
End Sub

Bonne soirée .
Franck .

Bonjour
Je prends ce jour connaissance de tes nouvelles mises en place qui me suscitent ces remarques
Tout d’abords la ligne de recherche nécessaire pour le traitement qui en découle :

lignerecopie = Sheets(« CP COMPILATION »).Columns(« A:A »).Find(what:=« », after:=Sheets(« CP COMPILATION »).Range(« A2 »), LookIn:=xlValues, LookAt:=xlWhole).Row

doit obligatoirement être fructueuse au risque de bloquer à son niveau son exécution si la recherche n’aboutit pas

C’est pour cela qu’elle est précédé de la ligne de code :

On Error Resume Next

Afin de ne pas être confronté à la situation si la donnée recherchée dans la zone ciblée est absente

Pour autant les lignes de traitement qui en découlent ne doivent être utilisées que si cette recherche a été bénéfique
C’est pour cela que la variable ici « lignerecopie » est au départ mise à 0 puis sous-tendu à la recherche pour obtenir une autre valeur
Il est donc indispensable que la valeur de cette variable soit mis en condition pour exécuter les lignes de code qui l’utilisent et donc de mettre avant elles ceci :

If lignerecopie > 0
lignes de code qui utilisent la variable
End If

Ce que je ne constate pas dans ta procédure

Autre interrogation

Pourquoi d’abord ces lignes de code :

Sheets(« CP COMPILATION »).Range(« A » & lignerecopie).Value = Range(« A,I »).Value
Sheets(« CP COMPILATION »).Range(« B » & lignerecopie).Value = Range(« B,I »).Value
Sheets(« CP COMPILATION »).Range(« C » & lignerecopie).Value = Range(« C,I »).Value
Sheets(« CP COMPILATION »).Range(« D » & lignerecopie).Value = Range(« D,I »).Value
Sheets(« CP COMPILATION »).Range(« E » & lignerecopie).Value = Range(« E,I »).Value

qui alimentent les cellules des colonnes A à E de la ligne portée par la variable lignerecopie onglet « CP COMPILATION »

ces même colonnes pour cette même ligne même onglet sont à nouveau alimentées par les lignes de code qui les suivent ici :

Sheets(« CP COMPILATION »).Range(Cells(lignerecopie, h).Address, Cells(lignerecopie, h + 6).Address).Value = Range(« A » & I, « G » & I).Value

h= 1 donc Cells(lignerecopie, h) correspond à la colonne « A » sur la ligne de la variable lignerecopie
h+6 = 7 donc Cells(lignerecopie, h+6) correspond à la colonne « G »

donc
Range(Cells(lignerecopie, h).Address, Cells(lignerecopie, h + 6).Address).Value correspond à l’alimentation des colonnes « A » à « G » donc « A » à « E » déjà alimenté précédemment

Mystère !!!

autre interrogation pourquoi ceci :

h = h + 6

si la boucle alimentent uniquement les colonnes « A » à « G » (Sheets(« CP COMPILATION »).Range(Cells(lignerecopie, h).Address, Cells(lignerecopie, h + 6).Address).Value = Range(« A » & I, « G » & I).Value)
inutile de modifier cette variable h

Voilà ce que moi j’aurais mis comme traitement :

lignerecopie = 0
On Error Resume Next
lignerecopie = Sheets(« CP COMPILATION »).Columns(« A:A »).Find(what:=« », after:=Sheets(« CP COMPILATION »).Range(« A2 »), LookIn:=xlValues, LookAt:=xlWhole).Row
If lignerecopie > 0
If lignerecopie < 3 Then
lignerecopie = 3
End If
h = 1
I = 3
Do While I < Range(« B » & Rows.Count).End(xlUp).Row + 1
If Range(« B » & I) <> 0 And Range(« B » & I) <> « » Then
Sheets(« CP COMPILATION »).Range(Cells(lignerecopie, h).Address, Cells(lignerecopie, h + 6).Address).Value = Range(« A » & I, « G » & I).Value
lignerecopie = lignerecopie + 1
End If
I = I + 1
Loop
MsgBox " Copie Effectuée …"
End If

Dernière interrogation
Dans ta ligne de recherche pour établir la variable lignerecopie ici :

lignerecopie = Sheets(« CP COMPILATION »).Columns(« A:A »).Find(what:=« », after:=Sheets(« CP COMPILATION »).Range(« A2 »), LookIn:=xlValues, LookAt:=xlWhole).Row

tu recherches en colonne « A » une cellule vide ?

Si tel est le cas pour déterminer la première ligne disponible utilises sur cette colonne cette ligne de code :

lignerecopie = Sheets(« CP COMPILATION »).Range(« A » & Rows.Count).End(xlUp).Row + 1

Elle détermine sur la base des données de la colonne « A » la première disponible n’ayant aucune valeur

Sinon la ligne de code de recherche déterminera la première cellule de la colonne « A » dans cet état y compris si celle-ci est au milieu des enregistrements déjà en place exemple :

enregistrements en place de la ligne 3 à 7
si cellule 5 est vide c’est la ligne 5 qui sera utilisée et non la ligne 8 la suivante par rapport à la liste

Voila le fruit de mes réflexions concernant ta macro

A ta disposition pour échanger sur ces différents points

Merci FFO pour ton retour complet et détaillé ,étant encore bien loin de ce que tu peux produire en ligne de code ,je transfère et essaye d’adapter des code déja utilisé sur d’autre fichier c’est pour cela que certaine ligne sont redondantes et certainement comme tu le dis ici :
ces même colonnes pour cette même ligne même onglet sont à nouveau alimentées par les lignes de code qui les suivent ici :

Sheets(« CP COMPILATION »).Range(Cells(lignerecopie, h).Address, Cells(lignerecopie, h + 6).Address).Value = Range(« A » & I, « G » & I).Value

h= 1 donc Cells(lignerecopie, h) correspond à la colonne « A » sur la ligne de la variable lignerecopie
h+6 = 7 donc Cells(lignerecopie, h+6) correspond à la colonne « G »

donc
Range(Cells(lignerecopie, h).Address, Cells(lignerecopie, h + 6).Address).Value correspond à l’alimentation des colonnes « A » à « G » donc « A » à « E » déjà alimenté précédemment

Mystère !!!
Je n’ai pas encore toute la logique d’écriture,c’est une exercice passionnant mais difficile .
Ton traitement est plus épuré et sans doute plus rapide que ce que j’ai réussi a bidouiller :joy: ,mais les deux fonctionnent ,je vais tout de même tenir compte de tes remarques et modifier le traitement que j’avais proposé .
Merci pour tes éclaircissements ,qui ne seront certainement pas les derniers ,j’ai encore des tonnes d’idées de fichiers qui trainent et comme excel est « presque » sans limite ,il y a du pain sur la planche !!
Franck .