Copie de cellules d'une feuille à une autre sous conditions

french_gracer

XLDnaute Nouveau
Bonjour à tous,

je suis un nouveau venu sur le forum et un débutant en macro.

J'ai besoin d'aide pour réaliser une opération sur le fichier excel joint, qui est mon outil de gestion des absences du personnel dans mon service (en version siplifiée ici).

Le classeur comprend x feuilles "NOM Prénom" dans lesquelles figurent des données sur la personne concernée et un tableau récapitulatif de ces absences sur l'année.
Il comprend également 1 feuille "2009-2010" dans laquelle figure un récapitulatif, mois par mois, des données présentes dans chacune des feuilles "NOM Prénom".

Mon souhait serait d'automatiser la récupération des données dans les feuilles "NOM Prénom" pour les copier dans "2009-2010".

L'idée est donc la suivante :
Copie de cellules des feuilles des personnels "NOM Prénom" vers feuille récapitulative "2009-2010", sous conditions :
Si "Nom Prénom" dans colonne A de "2009-2010" correspond à "Nom" et "Prénom" contenus dans colonne B d'une autre feuille
Alors Copier Cellules des colonnes B à AF lignes 13,20,27,34,41,47, 54, 62, 69, 76, 83, 90 de la feuille "Nom Prénom" vers cellules des colonnes B à AF, sur la ligne en face du "Nom Prénom" correspondant.

En gros il faudrait compléter la base suivante (copie simple réalisée en mode enregistrement de macro pour le 1er mois) :

Code:
Sub Macro4()
'
' Macro4 Macro
' Copie de cellules des feuilles des personnels "NOM Prénom" vers feuille récapitulative "2009-2010", sous conditions
'

'
    Sheets("ABRACADABRA Merlin").Select
    Range("B13:AE14").Select
    Selection.Copy
    Sheets("2009-2010").Select
    Range("B5:B6").Select
    ActiveSheet.Paste
    
    Sheets("HOUDINI Harry").Select
    Range("B13:AE14").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("2009-2010").Select
    Range("B7:B8").Select
    ActiveSheet.Paste
    
    Sheets("MAJAX Gérard").Select
    Range("B13:AE14").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("2009-2010").Select
    Range("B9:B10").Select
    ActiveSheet.Paste
    Range("A1").Select
    
End Sub

A votre avis, est-ce que cela vous paraît faisable ?

Si quelqu'un peut m'aider....


Merci d'avance.

A+
 

Pièces jointes

  • Congés_Test_simplifié.zip
    22.1 KB · Affichages: 68

Matimat

XLDnaute Nouveau
Re : Copie de cellules d'une feuille à une autre sous conditions

premier jet...

Je n'est pas regarder le fichier, mais je crois comprendre le problème...

Il faut tout simplement mettre tes "NOM Prénom" en variable,

Code:
Dim NomPrenom,
NomPrenom="A1" // par exemple

puis

Code:
Sheets(NomPrenom).Select

puis dans la feuille "2009-2010" incrémenter les cellules pour coller tes données, puis pour copier la nouvelle valeur de la variable NomPrenom !

etc.

Veux tu trouver par toi même ou veux-tu la solution toute faite ?
 

french_gracer

XLDnaute Nouveau
Re : Copie de cellules d'une feuille à une autre sous conditions

Merci pour cette réponse rapide !

Pour être honnête, s'il t'es possible de jeter un oeil sur le fichier et de me donner au moins un début de code, ce serait super.
Enfin, en attendant une réponse éventuelle, je vais tout de même me repencher dessus avec cette piste.

Encore merci.
 

ROGER2327

XLDnaute Barbatruc
Re : Copie de cellules d'une feuille à une autre sous conditions

Bonjour à tous
Je sais que je ne réponds pas à la question posée, mais je propose, à tout hasard, une solution avec une formule (relativement simple).
Voyez le classeur joint...​
Bon courage.
ROGER2327
 

Pièces jointes

  • french_gracer_Test_simplifié.zip
    31.9 KB · Affichages: 165
  • french_gracer_Test_simplifié.zip
    31.9 KB · Affichages: 168
  • french_gracer_Test_simplifié.zip
    31.9 KB · Affichages: 171

french_gracer

XLDnaute Nouveau
Re : Copie de cellules d'une feuille à une autre sous conditions

Merci Roger2327,

la méthode proposée fonctionne très bien.
Je n'avais jamais utilisé ces formules. J'avais besoin d'une solution magique (Cf. les noms des personnels dans le fichier); je crois l'avoir trouvée grâce à toi !
Si tu peux, est-il possible de me détailler les opérations réalisées via cette formule (j'aime bien comprendre ce qui se cache derrière; ça aide à refaire ou modifier des choses plus tard) ?

Maintenant si d'autres veulent proposer des solutions alternatives (macro notamment), ne pas hésite.

Encore merci en tout cas.

Ps : je me rends également compte à l'instant en le testant sur le fichier normal que les couleurs de certaines cellules ne sont pas copiées. Une idée du pourquoi ?
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Copie de cellules d'une feuille à une autre sous conditions

Re...
Merci Roger2327,

la méthode proposée fonctionne très bien.
Je n'avais jamais utilisé ces formules. J'avais besoin d'une solution magique (Cf. les noms des personnels dans le fichier); je crois l'avoir trouvée grâce à toi !
Si tu peux, est-il possible de me détailler les opérations réalisées via cette formule (j'aime bien comprendre ce qui se cache derrière; ça aide à refaire ou modifier des choses plus tard) ?

Maintenant si d'autres veulent proposer des solutions alternatives (macro notamment), ne pas hésite.

Encore merci en tout cas.
Merci beaucoup ! Voilà un message qui nous change des consommateurs qu'on rencontre trop souvent. Utiliser sans comprendre n'a pas grand intérêt... ...quand ce n'est pas franchement dangereux !
Voici donc quelques commentaires :
Vous savez sans doute que la formule
Code:
[COLOR="DarkSlateGray"]=INDEX("plage";n°_ligne;n°_colonne)[/COLOR]
extrait la valeur de la cellule située à l'intersection de la ligne n°_ligne et de la colonne n°_colonne de la plage "plage".

En B5, on veut la valeur de la première cellule de la plage 'ABRACADABRA Merlin'!$B$13:$AE$13, c'est à dire
Code:
[COLOR="DarkSlateGray"]=INDEX('ABRACADABRA Merlin'!$B$13:$AE$13;1;B$4)[/COLOR]
Cette formule recopiée à droite jusqu'en AE5 donnera la valeur de la deuxième, troisième, ..., trente-et-unième cellule de la plage 'ABRACADABRA Merlin'!$B$13:$AE$13
En B7, on veut la valeur de la première cellule de la plage 'HOUDINI Harry'!$B$13:$AE$13, c'est à dire
Code:
[COLOR="DarkSlateGray"]=INDEX('HOUDINI Harry'!$B$13:$AE$13;1;B$4)[/COLOR]
Et ainsi de suite pour les lignes suivantes...

Si on s'en tient là, il faut écrire une formule par ligne, ce qui est un peu lourd !
C'est pourquoi j'utilise la fonction INDIRECT pour créer la référence à la plage de données à partir des noms de feuille figurant dans la colonne A :
Code:
[COLOR="DarkSlateGray"]INDIRECT("'"&$A5&"'!$B$13:$AE$13")[/COLOR]
crée la référence 'ABRACADABRA Merlin'!$B$13:$AE$13 (en B5).
Code:
[COLOR="DarkSlateGray"]INDIRECT("'"&$A7&"'!$B$13:$AE$13")[/COLOR]
crée la référence 'HOUDINI Harry'!$B$13:$AE$13 (en B7).
Par conséquent, la formule étant installée en B5, il suffit de la recopier vers le bas pour compléter le tableau.
Pour un mois donné, on écrit ainsi une seule formule qu'on recopie vers la droite et vers le bas.

Pour les mois suivants, il suffit de modifier la formule pour prendre en compte les bonnes références, par exemple
Code:
[COLOR="DarkSlateGray"]=INDEX(INDIRECT("'"&$A16&"'!$B$20:$AF$20");1;B$15)[/COLOR]
en B16, puis de recopier vers la droite et vers le bas.

Voilà...

Une remarque : pour garder une formule simple, ne pas alourdir le classeur et ralentir l'exécution, je n'ai pas fait de test pour contrôler la présence de cellules vides dans les feuilles de données. Il en résulte que, le cas échéant, la formule proposée renvoie zéro lorsqu'une donnée est absente. Pour que ces zéros soient invisibles, j'utilise le format Standard;; pour toutes les cellules où j'ai implanté la cellule.
Si on ne veut pas utiliser ce format, on peut utiliser la formule
Code:
[COLOR="DarkSlateGray"]=SI(INDEX(INDIRECT("'"&$A16&"'!$B$20:$AF$20");1;B$15)=0;"";INDEX(INDIRECT("'"&$A16&"'!$B$20:$AF$20");1;B$15))[/COLOR]
(plus lourd, plus lent...)​
Je reste à votre disposition si ce n'est pas clair.​
Bonne soirée.
ROGER2327
 
Dernière édition:

french_gracer

XLDnaute Nouveau
Re : Copie de cellules d'une feuille à une autre sous conditions

Bonjour french_gracer
Pourriez-vous préciser ? Donner un exemple ?
Merci !​
ROGER2327

Bonjour,

le problème semble se poser quand la couleur change pour une seule personne.
Exemples :
- cases grisées les mercredi pour un employé à 80%
- absences colorées différemment, suivant que celle-ci est justifiée ou non
(Cf. fichier joint)

Ceci étant, il est vrai qu'il y avait des O par endroit (comme indiqué dans ton message du 28/08 - 16h38).
J'ai essayé ton code avec un SI,
Code:
=SI(INDEX(INDIRECT("'"&$A16&"'!$B$20:$AF$20");1;B$15)=0;"";=INDEX(INDIRECT("'"&$A16&"'!$B$20:$AF$20");1;B$15))
mais un message d'erreur apparaît (Cf. fichier joint).
Avais-tu rencontré le même problème ?

Encore merci pour ton aide.
 

Pièces jointes

  • french_gracer_Test_simplifié.zip
    29.8 KB · Affichages: 45
  • french_gracer_Test_simplifié.zip
    29.8 KB · Affichages: 48
  • french_gracer_Test_simplifié.zip
    29.8 KB · Affichages: 46
  • Message d'erreur.jpg
    Message d'erreur.jpg
    54.6 KB · Affichages: 152
  • Message d'erreur.jpg
    Message d'erreur.jpg
    54.6 KB · Affichages: 170
  • Message d'erreur.jpg
    Message d'erreur.jpg
    54.6 KB · Affichages: 167

ROGER2327

XLDnaute Barbatruc
Re : Copie de cellules d'une feuille à une autre sous conditions

Bonjour french_gracer
  1. En ce qui concerne les couleurs : les formules copient les valeurs mais pas les formats. Je n'ai pas de solution autre que recourir à une procédure en VisualBasic, mais cela risque d'être un peu compliqué...
    Espérez que d'autres trouveront une solution.
  2. Pour ce qui est de la formule, je proposais :
    Code:
    [COLOR="DarkSlateGray"]=SI(INDEX(INDIRECT("'"&$A16&"'!$B$20:$AF$20");1;B$15)=0;"";[B][COLOR="Red"]=[/COLOR][/B]INDEX(INDIRECT("'"&$A16&"'!$B$20:$AF$20");1;B$15))[/COLOR]
    Il y a une erreur : il faut supprimer le signe =. Merci de l'avoir signalé : Je vais immédiatement corriger dans le message où j'ai commis cette erreur.
ROGER2327
 

Discussions similaires

Réponses
5
Affichages
131

Statistiques des forums

Discussions
312 237
Messages
2 086 486
Membres
103 232
dernier inscrit
logan035