VBA copier/coller selon les lignes et les onglets

Bonjour,

Je débute en VBA et souhaite trouver une fonction simple qui me faciliterait la tâche. Je réalise un tableau pour la planification de différents employés par rapport à des services de travail. Cela nous permet de définir, selon un numéro de service, quels horaires seront fait par tel employé et son nombre d'heures à faire le mois en question, les jours de vacances, etc.

Afin de me simplifier la tâche et éviter des erreurs par les personnes qui planifient, des cellules seront bloquées et la feuille protégée avant utilisation.

Il y a deux aspects pour lesquels je souhaite votre aide :

1. Sur l'onglet "Jan", j'ai ajouté à la fin de la ligne, dans la cellule CX, une macro qui supprime tous les services de la ligne, remet la bonne couleur et remet les fonctions dans les lignes 5 à 7 (macro enregistrée par la fonction "Enregistrer une macro"). En effet, je ne peux pas supprimer le tout en sélectionnant la longueur, car une cellule est cachée après chaque jour et a un calcul verrouillé pour qu'il ne soit pas supprimé (colonne K, M, etc.).

Je souhaite pouvoir mettre ce "bouton" pour chaque personne planifiées et chaque "bloc" de lignes : sur la ligne 9, 14, etc. sans devoir refaire la macro chaque fois (j'aurai 100 personnes planifiées par mois). De plus, je vais ensuite copier/coller l'onglet afin de le réaliser pour chaque mois de l'année et souhaite aussi que les macros fonctionnent sans devoir tout refaire?

2. Lorsque j'active ma macro, je rencontre une erreur seulement dès que je protège ma feuille (erreur 1004), alors que la macro fonctionne. Comment y remédier?

Je vous remercie d'avance pour votre aide et me réjouis de votre retour.

Bon début de semaine,

Yannick

PS : c'est assez urgent car je dois rendre le tableau demain, alors je vais devoir trouver d'autres moyens s'il n'y a pas de solution simple Merci beaucoup!

42planifpersonnel.xlsm (255.97 Ko)

Bonjour,

A tester

65planifpersonnel.xlsm (241.15 Ko)

A+

Bonjour,

Merci beaucoup ça fonctionne, il n'y a plus l'erreur dès que la feuille est protégée

Par contre, comment ensuite pour la copier/coller d'une ligne à l'autre pour que ça fonctionne sans devoir faire trop de changements? Tout comme lorsque je vais copier/coller mes onglets pour les autres mois?

Merci d'avance et bonne journée,

Yannick

En l'état, la procédure réalise la mise à jour sur toutes les lignes concernées de la feuille active.

De plus, si tu places ce même bouton dans chaque feuille mensuelle la procédure s'appliquera à la feuille active.

A+

Parfait, merci je pourrai ainsi copier/coller mes onglets chaque mois.

Par contre, actuellement cela s'applique à la ligne 4. Comment copier/coller pour ajouter un bouton pour la ligne 9, la ligne 14, etc.?

Merci d'avance et bonne fin de matinée!

Yannick

Non, actuellement cela s'applique de la ligne 4 à la dernière ligne (ligne 24).

C'est réalisé par la boucle For j = 4 To .Range("K" & Rows.Count).End(xlUp).Row - 4 Step 5

Par contre, la dernière colonne est rentrée en "dur" dans le code (colonne 99, soit CU) ce qui peut poser problème avec les mois de 27 ou 30 jours... à voir.

A+

Bonjour,

Étant un débutant un VBA, pourriez-vous me dire comment procéder ainsi pour le copier ou si je dois le refaire chaque ligne? Je ne suis pas sur d'avoir tout compris dans votre réponse.

Je vous remercie d'avance et vous adresse mes meilleures salutations?

Excellente fin de journée!

Yannick

Non, actuellement cela s'applique de la ligne 4 à la dernière ligne (ligne 24).

C'est réalisé par la boucle For j = 4 To .Range("K" & Rows.Count).End(xlUp).Row - 4 Step 5

De par sa conception, la procédure réalise le traitement pour chaque ligne, de la ligne 4 à la ligne 24 par pas de 5.

C'est à dire ligne 4, ligne 9, ligne 14, ligne 19 et ligne 24.

Tu n'as donc rien à ajouter.

De plus, la dernière ligne prise en compte étant évaluée avec .Range("K" & Rows.Count).End(xlUp).Row - 4, si tu viens à ajouter des employés, la détermination de la dernière ligne se fera automatiquement.

Est-ce plus clair ?

A+

Merci pour la réponse, c'est effectivement plus clair. Toutefois, lorsque je met des services sur la ligne 9 et que je clique, rien ne s'efface (en dehors de la ligne 4). Dois-je faire une autre manipulation?

Je souhaite en effet que chaque ligne s'efface individuellement lorsque je clique sur le bouton à créer" au bout de chacune de celle-ci (comme celui en cellule CX). Exemple : un bouton en cellule CX qui efface la ligne 9, un en CX qui efface le ligne 14, etc.

Merci d'avance et désolé si je n'étais pas clair avant

Bonne fin de journée,

Yannick

J'ai compris le problème

Il faut que tu remplaces dans la ligne de code

.Cells(4, i).Resize(1, 2).ClearContents

par

.Cells(j, i).Resize(1, 2).ClearContents

A+

Merci pour ta réponse! Ça efface désormais les données sur toutes les lignes et dans toute la feuille (remise à zéro complète).

Par contre, je souhaite que ça ne supprime que les données des la ligne sur laquelle je clique sur le bouton.

En effet, je souhaite pouvoir effacer la planification d'une personne, mais pas de toute la feuille (comme c'est le cas actuellement). J'ajouterai ainsi, si possible sans le faire pour chaque ligne, un bouton "Remise à zéro de la ligne" sur chaque ligne 4, 9, etc. de la cellule CX. Est-ce possible que ca me crée ce bouton facilement lorsque j'ajoute des lignes (en copiant/collant celles du dessus) et ainsi que ca n'efface que les informations de la ligne en question?

J'espère avoir été plus clair

Merci et bonne soirée!

Yannick

Pour éviter d’avoir à ajouter un bouton "Remise à zéro de la ligne" sur chaque ligne, tu as tout intérêt à utiliser une liste de choix.

Voici un exemple avec un contrôle ListBox dans une Userform.

A+

Bonjour,

Effectivement, c'est beaucoup plus simple comme ça, merci beaucoup!

Je viens d'affecter la macro que tu as créée dans ton fichier sur mon fichier usuel que j'utilise (plus conséquent et avec davantage de lignes de personnes), mais, lorsque je veut utiliser la macro, j’obtiens l'erreur

"Erreur d'exécution '1004':

La méthode 'Range' de l'objet '_Global a échoué"

Et lorsque je clique sur débogage, ca me met en évidence (jaune) : UserForm1.Show du texte du module 4, que j'ai copier/coller telle quelle en créant un module 4 dans mon fichier. Sais-tu ce que je dois corriger?

Par ailleurs, est-ce encore nécessaire de garder les modules 2 et 3 qui sont vides?

Merci d'avance pour tout et bon début de journée,

Yannick

Bonjour,

Je ne peux pas répondre avec les éléments que tu me donnes.

En fait, l'erreur ne se produit pas sur la ligne que tu indiques. En mode débogage, il faut faire du pas à pas (F8) pour voir sur quelle ligne se produit réellement cette erreur.

Peux-tu joindre ton fichier ?

Les modules inutilisés peuvent être supprimés.

A+

Bonjour,

Tu trouveras ci-joint mon fichier avec le formulaire et ton module4 copié.

Pendant que j'y sois et afin d'éviter de continuer à t'embêter après, serait-il encore possible de rajouter une action lorsqu'on remet à zéro une ligne? A savoir que chaque fois que ça exécute la macro pour la ligne en question, ça nous remette dans chaque "bloc" I5-J7, L5-M7, O5-P7, etc. (pour la personne 4) : les formules qui se situent dans le bloc CY5-CZ7 (même formule à copier selon la personne à remettre à zéro).

J'espère avoir été clair et te remercie pour toute ton aide!

Bonne journée,

Yannick

21planifpers2.xlsm (275.31 Ko)

Tu trouveras ci-joint mon fichier avec le formulaire et ton module4 copié.

Tu es sûr ?

Désolé, j'étais sur qu'il y était, mais il n'avait pas passé car trop volumineux, le voici donc sur mon message précédant.

J'ai ainsi du supprimer des lignes de personnes (il y en aura pour 100 personnes par la suite) afin de réduire la taille du document.

Merci beaucoup

lorsque je veux utiliser la macro, j’obtiens l'erreur "Erreur d'exécution '1004':

L’erreur provient du fait que dans mon classeur j’ai ajouté une plage nommée "Employés" qui est utilisée pour la liste de choix. Pense donc à rajouter ce nom avec la formule de référence dans ton fichier.

Serait-il encore possible de rajouter une action qui remette dans chaque "bloc" I5-J7, L5-M7, O5-P7, etc. (pour la personne 4) : les formules qui se situent dans le bloc CY5-CZ7 (même formule à copier selon la personne à remettre à zéro).

Je ne vois pas l’utilité de cette opération. Les formules de ces blocs ne sont pas effacées.

A+

frangy a écrit :

L’erreur provient du fait que dans mon classeur j’ai ajouté une plage nommée "Employés" qui est utilisée pour la liste de choix. Pense donc à rajouter ce nom avec la formule de référence dans ton fichier.

Où dois-je modifier le nom de cette plage dans mon fichier? Vu que je n'ai pas pu t'envoyer le fichier complet car trop volumineux, je dois le refaire dans mon document.

frangy a écrit :

Je ne vois pas l’utilité de cette opération. Les formules de ces blocs ne sont pas effacées.

Cela m'est nécessaire, car la personne qui planifie peut changer manuellement les horaires d'une service (ce qui engendre que la cellule devient orange pour attirer l'attention que la formule n'existe plus en arrière plan). Et en remettant à zéro, cela éviterai de devoir recopier la formule dans les cellules oranges où une valeur aurait été mise manuellement.

De plus, je viens de me rendre compte qu'en dehors d'effacer, il faudra aussi que I, J, L, M, O, P, etc. soit à nouveau en jaune (RVB 255-255-204) après la remise à zéro (si la couleur a été changée comme dans la RS 4 du fichier envoyé précédemment).

Est-ce possible simplement ou c'est trop demandé?

Merci d'avance!

Yannick


YannickG a écrit :

Où dois-je modifier le nom de cette plage dans mon fichier? Vu que je n'ai pas pu t'envoyer le fichier complet car trop volumineux, je dois le refaire dans mon document.

Pour cette partie, je viens d'y arriver merci, ça fonctionne

Merci!

A tester

A+

Rechercher des sujets similaires à "vba copier coller lignes onglets"