Copier contenu cellule + couleur fond de cellule automatiquement

mrzaitsev90

XLDnaute Occasionnel
Bonjour à tous,

J'ai besoin d'une petite aide sur mon fichier. L'idée est de faire un planning où il n'y a plus de double saisie (annuel + mensuel).

Le fichier copiera automatiquement les données des cellules et la couleur du fond dans l'onglet annuel.

Le fichier est simple : un onglet synoptique (que je règlerai plus tard), un onglet annuel, et des onglets mensuel.

J'aimerais que vous m'aidiez pour que le fond de cellule en annuel se colorie automatiquement du fond de couleur indiqué en mensuel.

Une macro me semble être une bonne idée voire même la seule faisable. Et c'est sur ce point que j'ai besoin de votre aide.

Merci à tous ceux qui m'aideront.

MrZaitsev90
 

Pièces jointes

  • test congés.xlsm
    27.9 KB · Affichages: 42

ROGER2327

XLDnaute Barbatruc
Re : Copier contenu cellule + couleur fond de cellule automatiquement

Bonjour mrzaitsev90.


Un essai en pièce jointe.​


Bonne soirée.


ℝOGER2327
#8231


Jeudi 12 Pédale 143 (Saint Hari Seldon, psychohistorien galactique - fête Suprême Quarte)
16 Ventôse An CCXXIV, 7,5337h - épinard
2016-W09-7T18:04:51Z
 

Pièces jointes

  • Copie de test congés.xlsm
    39.1 KB · Affichages: 56

mrzaitsev90

XLDnaute Occasionnel
Re : Copier contenu cellule + couleur fond de cellule automatiquement

Bonjour Roger,

J'aurais juste besoin de la même macro mais avec une petite modification. En effet, vous verrez sur le fichier que j'ai dû rajouter 4 colonnes supplémentaires par rapport au précédent fichier. Pouvez-vous le faire s'il vous plait?

Il a donc maintenant 5 colonnes entre les noms (première colonne de gauche sur chaque onglet) et le premier jour de chaque mois.

Cordialement.

Merci !

Mrzaitsev90
 

Pièces jointes

  • test congés modif.xlsm
    38.7 KB · Affichages: 41

ROGER2327

XLDnaute Barbatruc
Re : Copier contenu cellule + couleur fond de cellule automatiquement

Re...


Il suffit de paramétrer le code ainsi :​
Code:
Option Explicit

Sub toto() '
'La procédure utilise deux plages nommées de cette feuille :
'   [colNoms] qui est la colonne contenant le champ «NOM_PRENOM» (A:A dans ce classeur) ;
'   [celOrigine] qui est la première cellule susceptible de revcevoir des données (G3 dans ce classeur).
'
Dim lO&, cO&, cNoms&, i&, nom&, dat&, ong&, idNom(), idDat(), nomsMois(), feuille As Worksheet '
  With Me '«Me» fait référence à la feuille contenant ce code.
'Liste des onglets à traiter. Les noms d'onglet doivent être exactement ceux de la liste.
'(À corriger si vous voulez éviter la faute d'orthographe dans "Fevrier".)
    nomsMois = Array(.Name, "Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre") '
'Tous les onglets concernés doivent avoir la même structure que celle de cette feuille. (Dans ce classeur,
'champ «NOM_PRENOM» en colonne A, début des données en G3.)
    lO = .[celOrigine].Row: cO = .[celOrigine].Column: cNoms = .[colNoms].Column '
'À partir de la colonne «cO», la ligne «lO - 1» de chaque onglet à traiter est supposée contenir toutes les dates
'correspondant à son nom, en ordre croissant. La dernière date est suivie d'une cellule vide.
'Relevé de la colonne «A». La liste des noms est supposée sans doublon.
    idNom = .Cells(1, cNoms).Resize(.Cells(.Rows.Count, cNoms).End(xlUp).Row).Value '
'Relevé de la ligne «lO - 1».
    idDat = .Cells(lO - 1, 1).Resize(1, .Cells(lO - 1, 1).End(xlToRight).Column).Value '
'
    With Application: .ScreenUpdating = 0: .EnableEvents = 0: .Calculation = -4135: End With '
'
'Effacement du contenu actuel.
    If UBound(idNom, 1) > 2 And UBound(idDat, 2) > 2 Then .Range(.Cells(lO, cO), .Cells(UBound(idNom, 1), UBound(idDat, 2))).Clear '
'
'=== Ajout : petite boucle "technique" pour éviter que la plage «Range(Cells(lO - 1, 1), Cells(lO - 1, cO - 1))» ait une cellule vide.
    On Error Resume Next '
    For ong = 0 To UBound(nomsMois) 'Énumérations des feuilles
      Set feuille = Worksheets(nomsMois(ong)) '
      If Err.Number = 0 Then 'Si le nom d'onglet de la feuille est dans la liste «nomsMois»...
        For i = 1 To cO - 1 '
          If Len(feuille.Cells(lO - 1, i).Value) = 0 Then feuille.Cells(lO - 1, i).Value = " " '
        Next '
      End If '
    Next '
    On Error GoTo 0 '
    Set feuille = Nothing '
'=== Fin de l'ajout.
'
    For nom = lO To UBound(idNom, 1) 'Énumération des noms.
      For dat = cO To UBound(idDat, 2) 'Énumération des dates.
        If Day(idDat(1, dat)) = 1 Then 'si la date courante est le premier jour d'un mois...
          For ong = 1 To Worksheets.Count '...alors énumérations des feuilles
            If nomsMois(Month(idDat(1, dat))) = Worksheets(ong).Name Then 'Si le nom d'onglet de la feuille est dans la liste «nomsMois»...
              For i = lO To Worksheets(ong).Cells(Worksheets(ong).Rows.Count, cNoms).End(xlUp).Row '...énumération des noms dans l'onglet.
                If idNom(nom, 1) = Worksheets(ong).Cells(i, cNoms).Value Then 'Si le nom de l'onglet est le nom indexé par 'nom'...
                  If idDat(1, dat) = Worksheets(ong).Cells(lO - 1, cO).Value Then '... et si la date en «Cells(lO - 1, cO)» dans l'onglet
'est la date indexée par 'dat', copie de la ligne indexée par 'i' de l'onglet vers la ligne indexée par 'nom' dans le récapitulatif.
                    Worksheets(ong).Cells(i, cO).Resize(1, Worksheets(ong).Cells(lO - 1, 1).End(xlToRight).Column - cO + 1).Copy Destination:=.Cells(nom, dat) '
                  End If '
                  Exit For '
                End If '
              Next '
              Exit For '
            End If '
          Next '
        End If '
      Next '
    Next '
'
    With Application: .Calculation = -4105: .EnableEvents = 1: .ScreenUpdating = 1: End With '
'
  End With '
End Sub '
Ceci fait, vous pouvez ajouter ou supprimer des colonnes entre NOM_PRENOM et Fonction, ou encore insérer des lignes au dessus de la première, sans avoir à modifier le code. Bien entendu, toutes les feuilles mensuelles doivent subir le même ajustement que la feuille annuelle.​


Bonne journée.


ℝOGER2327
#8232


Samedi 14 Pédale 143 (Sabbat - Vacuation)
18 Ventôse An CCXXIV, 1,0259h - mouron
2016-W10-2T02:27:44Z
 

Pièces jointes

  • Copie de test congés modif-2.xlsm
    66 KB · Affichages: 35
Dernière édition:

mrzaitsev90

XLDnaute Occasionnel
Re : Copier contenu cellule + couleur fond de cellule automatiquement

Bonjour Roger,

Ce n'est peut-être rien mais j'ai encore besoin de vous. Tout allait très bien sur le fichier. J'avançais bien. Maintenant, j'ai un petit souci.

Lorsque je mets à jour des données de l'onglet janvier, la macro fonctionne. Lorsque je le fais pour février et les autres mois, cela ne fonctionne plus.

Est-ce que ce problème apparait parce que j'ai dû rajouter 2 onglets entre les onglets synoptique et annuel ? je ne sais pas. si vous pouviez m'aider s'il vous plait. je pense qu'une boucle ne fonctionne plus mais je ne sais pas la retrouver.

Merci bien !

en lien le fichier, trop volumineux pour le site.


ou Partage-Facile : Fichier conges_caf_fon.xlsm.html
 

ROGER2327

XLDnaute Barbatruc
Re : Copier contenu cellule + couleur fond de cellule automatiquement

Re...


Pour fonctionner, le code a besoin de dates sous forme numérique. Or, vous utilisez aussi des dates sous forme de texte.

Précisément :


  • lorsque vous saisissez 1/2/2016 dans une cellule, la cellule contient le nombre 42401. Vous pouvez formater la cellule pour voir lundi 1 janvier 2016, 2016-02-01, 42401, lun 01 févr, etc. mais la cellule contient dans tous les cas le nombre 42401.

  • lorsque vous saisissez la formule =CONCATENER("01/02/";Synoptique!$E$2), Synoptique!$E$2 contenant le nombre 2016 (ou la chaîne de caractères "2016") vous obtenez non pas un nombre, mais une chaîne de caractères "01/02/2016".


Si vous mélangez les deux types de saisie (et vous le faites allègrement !), la comparaison des dates par le code devient impossible. Il vous faut donc soit modifier le code pour qu'il fasse la conversion de "01/02/2016" en 42401, soit faire toutes les saisies sous forme de nombres.

Comme je n'ai pas envie de transformer le code, je vous suggère, au choix :


  • de remplacer
    =CONCATENER("01/02/";Synoptique!$E$2)
    par
    =--CONCATENER("01/02/";Synoptique!$E$2)

    Le deuxième - force la conversion de "01/02/2016" en -42401.

    Le premier - force la conversion de -42401 en 42401.

  • de remplacer
    =CONCATENER("01/02/";Synoptique!$E$2)
    par
    =DATE(Synoptique!$E$2;2;1)
    (Solution recommandée)

Lorsque toutes les formules analogues auront été corrigées, tout rentrera alors dans l'ordre.


Bonne soirée.


ℝOGER2327
#8237


Samedi 21 Pédale 143 (Saint Inscrit, Converti - fête Suprême Quarte)
25 Ventôse An CCXXIV, 8,2678h - thon
2016-W11-2T19:50:34Z


P.s. : votre fichier contient beaucoup d'informations nominatives ; j'espère que ce sont des données imaginaires que vous avez saisies spécialement pour l'exemple. Sinon, bonjour la sécurité des données personnelles ! (et bon courage pour le paquet de procès qui va tomber...)
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 472
Messages
2 088 709
Membres
103 928
dernier inscrit
MIKETUAU