IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Recopie de mise en forme [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Août 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Août 2021
    Messages : 19
    Par défaut Recopie de mise en forme
    Bonjour à tous,

    Je ne m'y connais malheureusement pas en programmation et l'enregistrement de macros n'a rien donné donc je m'adresse à vous car je bloque complètement :/

    J'utilise une Feuil1 avec des valeurs auxquels j'attribue manuellement une mise en forme sur le fond de cellule. En Feuil2, j'appelle ces cellules donc ca me reprend la valeur et j'aimerais que ça me prenne également la mise en forme appliquée.

    Voici un fichier exemple en pièce jointe : test_excel.xlsx
    Dans ce fichier test, il y a seulement 2 colonnes en Feuil2, dans mon fichier original il y en a bien plus.

    Merci par avance pour votre aide !

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 446
    Par défaut
    Bonjour,

    Une possibilité est d'utiliser des mises en forme conditionnelles, par exemple de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Option Explicit
     
    Sub AjoutMFC(rModèle As Range, rPlage As Range)
        '--- ajout mises en forme conditionnelles selon plage modèle
        Dim kR As Long
        'Debug.Print rModèle(1, 1), rModèle(1, 2)
        'Debug.Print rPlage(1), rPlage(2)
        rPlage.FormatConditions.Delete             '--- supprime tous les formats conditionnels existants (pour ne pas les accumuler)
        '--- ajoute format conditionnels identiques à ceux utilisés dans plage modèle
        For kR = rModèle.Rows.Count To 1 Step -1   '--- va de bas en haut pour ajouter les conditions
            Debug.Print kR
            If rModèle(kR).Interior.Color <> vbWhite Or rModèle(kR).Font.Color <> vbBlack Then
                '--- ajout format si différent du format "normal"
                With rPlage.FormatConditions.Add( _
                    Type:=xlCellValue, _
                    Operator:=xlEqual, _
                    Formula1:=rModèle(kR).Value)
                    .Interior.Color = rModèle(kR).Interior.Color
                    .Font.Color = rModèle(kR).Font.Color
                    '--- et éventuellement encore d'autres propriétés
                End With
            End If
        Next kR
    End Sub
     
    Sub Test()
        AjoutMFC Worksheets("Feuil1").Range("A1:A25"), Worksheets("Feuil2").Range("A1:A10,C1:C10")
    End Sub
    Cordialement.

  3. #3
    Membre averti
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Août 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Août 2021
    Messages : 19
    Par défaut
    Bonjour EricDgn,

    Merci beaucoup pour votre aide et le code commenté, cela fonctionne parfaitement sur le fichier "test" envoyé.

    Sur mon fichier réel, j'ai essayé de réadapter le code en changeant les plages et le nom des feuilles sur la dernière fonction "Sub Test" comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Option Explicit
     
    Sub AjoutMFC(rModèle As Range, rPlage As Range)
        '--- ajout mises en forme conditionnelles selon plage modèle
        Dim kR As Long
        'Debug.Print rModèle(1, 1), rModèle(1, 2)
        'Debug.Print rPlage(1), rPlage(2)
        rPlage.FormatConditions.Delete             '--- supprime tous les formats conditionnels existants (pour ne pas les accumuler)
        '--- ajoute format conditionnels identiques à ceux utilisés dans plage modèle
        For kR = rModèle.Rows.Count To 1 Step -1   '--- va de bas en haut pour ajouter les conditions
            Debug.Print kR
            If rModèle(kR).Interior.Color <> vbWhite Or rModèle(kR).Font.Color <> vbBlack Then
                '--- ajout format si différent du format "normal"
                With rPlage.FormatConditions.Add( _
                    Type:=xlCellValue, _
                    Operator:=xlEqual, _
                    Formula1:=rModèle(kR).Value)
                    .Interior.Color = rModèle(kR).Interior.Color
                    .Font.Color = rModèle(kR).Font.Color
                    '--- et éventuellement encore d'autres propriétés
                End With
            End If
        Next kR
    End Sub
     
    Sub Test()
    AjoutMFC Worksheets("BOM_FULL_ASSEMBLY").Range("B3:BG400"), Worksheets("MODULAR").Range("B3:B20,F3:F30,J3:J35,N3:N50,R3:R15,V3:V65,Z3:Z20,AD3:AD30,AH3:AH30")
    End Sub
    Mais j'obtiens une erreur "Argument ou appel de procédure incorrect" lors du déboguage, il y aurait un problème sur cette partie apparemment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                With rPlage.FormatConditions.Add( _
                    Type:=xlCellValue, _
                    Operator:=xlEqual, _
                    Formula1:=rModèle(kR).Value)
    J'imagine que c'est dû au nombre de plage ?

    Merci d'avance

  4. #4
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 446
    Par défaut
    Bonjour,

    Le problème vient de ce que la plage "modèle" doit se trouver sur une seule colonne, donc du genre "B3:B400" (et pas B3:BG400). Encore que je suis fort étonné qu'il y ait près de 400 formats conditionnels différents à inscrire (alors qu'en destination il n'y a qu'au plus 65 lignes).

    Cordialement.

  5. #5
    Membre averti
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Août 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Août 2021
    Messages : 19
    Par défaut
    Bonjour,

    Merci, j'ai donc modifié le code comme suit et quelques couleurs de fond de cellule apparaissent, mais pas sur toutes les cellules -malgré le fait que les plages renseignés soient bonnes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Test()
    AjoutMFC Worksheets("BOM_FULL_ASSEMBLY").Range("B172:B250"), Worksheets("MODULAR").Range("B3:B20,F3:F30,J3:J35,N3:N50,R3:R15,V3:V65,Z3:Z20,AD3:AD30,AH3:AH30")
    End Sub
    J'ai noté un Range de la ligne de 172 à 250 car au-dessus j'ai le même message d'erreur que précedemment. Alors que ma feuille BOM_FULL_ASSEMBLY comporte 400 lignes.
    Aussi, au lieu d'appliquer toute la feuille1 à la feuille2, est-il possible d'appliquer une plage particulière de la feuille1 par plage de la feuille 2? car il existe des doublons qui n'ont pas la même mise en forme..

  6. #6
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 446
    Par défaut
    La routine AjoutMFC() est justement faite pour permettre cela. On peut donc très bien faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Test()
        Dim wSh1 as Worksheet, wSh2 as Worksheet
        Set wSh1 = Worksheets("BOM_FULL_ASSEMBLY")
        Set wSh2 = Worksheets("MODULAR")
        AjoutMFC wSh1.Range("B3:B8"), wSh2.Range("B3:B20")
        AjoutMFC wSh1.Range("C3:C30"), wSh2.Range("F3:F30")
        AjoutMFC wSh1.Range("D3:D24"), wSh2.Range("J3:J35,N3:N50,R3:R15,V3:V65,Z3:Z20,AD3:AD30,AH3:AH30")
        Set wSh1 = Nothing
        Set wSh2 = Nothing
    End Sub
    A noter que s'il y a deux formats conditionnels inscrits avec un même critère (p.ex. ="X"), c'est le premier de ces formats qui sera exploité.

    Cordialement.

    P.S. Depuis Excel 2007, une cellule ne peut être soumise qu'à au plus 64 formats conditionnels différents.

  7. #7
    Membre averti
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Août 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Août 2021
    Messages : 19
    Par défaut
    Bonjour,

    J'ai changé la routine AjoutMFC() comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub Test()
        Dim wSh1 As Worksheet, wSh2 As Worksheet
        Set wSh1 = Worksheets("BOM_FULL_ASSEMBLY")
        Set wSh2 = Worksheets("MODULAR")
        AjoutMFC wSh1.Range("B226:B243"), wSh2.Range("B3:B20")
        AjoutMFC wSh1.Range("B202:B225"), wSh2.Range("F3:F30")
        AjoutMFC wSh1.Range("B172:B201"), wSh2.Range("J3:J35")
        AjoutMFC wSh1.Range("B244:B295"), wSh2.Range("N3:N50")
        AjoutMFC wSh1.Range("B306:B316"), wSh2.Range("R3:R15")
        AjoutMFC wSh1.Range("B295:B305"), wSh2.Range("V4:V8")
        AjoutMFC wSh1.Range("H295:H305"), wSh2.Range("V10:V19")
        AjoutMFC wSh1.Range("M295:M305"), wSh2.Range("V21:V30")
        AjoutMFC wSh1.Range("R295:R305"), wSh2.Range("V32:V41")
        AjoutMFC wSh1.Range("X295:X305"), wSh2.Range("V43:V52")
        AjoutMFC wSh1.Range("AC295:AC305"), wSh2.Range("V54:V64")
        AjoutMFC wSh1.Range("H333:H348"), wSh2.Range("Z3:Z20")
        AjoutMFC wSh1.Range("X349:X375"), wSh2.Range("AD3:AD30")
        Set wSh1 = Nothing
        Set wSh2 = Nothing
    End Sub
    J'obtiens le même message d'erreur débogage que la première fois, avec le même code concerné.

    Aussi, je ne suis pas sûr de comprendre à quel moment le nombre de mise en forme conditionnel intervient dans le code. Je rentre uniquement la plage concerné..

    Je pense que ce sera plus simple de m'aider avec le vrai fichier : LIEN SUPPRIME

  8. #8
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 446
    Par défaut
    Bonjour,

    Cela vient de ce que certains formats conditionnels "modèle" sont des cellules vides, par exemple B301 à B305. S'il faut appliquer un format aux cellules vides, il faut modifier le code comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Sub AjoutMFC(rModèle As Range, rPlage As Range)
        'Debug.Print rModèle.Address, rPlage.Address, rModèle.Rows.Count
        '--- ajout mises en forme conditionnelles selon plage modèle
        Dim kR As Long
        'Debug.Print rModèle(1, 1), rModèle(1, 2)
        'Debug.Print rPlage(1), rPlage(2)
        rPlage.FormatConditions.Delete             '--- supprime tous les formats conditionnels existants (pour ne pas les accumuler)
        '--- ajoute format conditionnels identiques à ceux utilisés dans plage modèle
        For kR = rModèle.Rows.Count To 1 Step -1   '--- va de bas en haut pour ajouter les conditions
            'Debug.Print kR
            If rModèle(kR).Interior.Color <> vbWhite Or rModèle(kR).Font.Color <> vbBlack Then
                If rModèle(kR).Value = "" Then
                    '--- format conditionnel cellule vide --- vraiment utile ?
                    With rPlage.FormatConditions.Add( _
                        Type:=xlBlanksCondition)
                        .Interior.Color = rModèle(kR).Interior.Color
                        .Font.Color = rModèle(kR).Font.Color
                        '--- et éventuellement encore d'autres propriétés
                    End With
                Else
                    '--- format conditionnel cellule non vide
                    '--- ajout format si différent du format "normal"
                    With rPlage.FormatConditions.Add( _
                        Type:=xlCellValue, _
                        Operator:=xlEqual, _
                        Formula1:=rModèle(kR).Value)
                        .Interior.Color = rModèle(kR).Interior.Color
                        .Font.Color = rModèle(kR).Font.Color
                        '--- et éventuellement encore d'autres propriétés
                    End With
                End If
            End If
        Next kR
    End Sub
    Si le format cellule vide n'est pas à reprendre, il faut simplement supprimer les lignes 14 à 19 du code ci-dessus.

    A noter que dans l'exemple cité, cellules modèle B301 à B305, la même condition est répétée 5 fois. Pas joli, mais sans conséquence.

    Cordialement.

  9. #9
    Membre averti
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Août 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Août 2021
    Messages : 19
    Par défaut
    Super, merci beaucoup !!

    Est-ce juste possible d'analyser les cellules de haut en bas plutôt que de bas en haut ?
    Car si il y a 2 cellules avec le même nom dans une même plage donnée, c'est tout le temps celle du haut qui est coloré. Hors là, il prend celle du bas, qui ne l'est pas.

  10. #10
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 446
    Par défaut
    Oui, on peut très bien faire kR = 1 To rModèle.Rows.Count. Dans ce cas, la première cellule de la liste "modèle" va fixer le format de la dernière condition évaluée.

    Maintenant, c'est tout à fait anormal d'avoir 2 formats différents à appliquer pour une même valeur. La procédure que j'ai proposée ne doit donc pas vraiment correspondre à ce que souhaitez faire.

    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recopier un nombre variable de lignes et en gardant la mise en forme
    Par Novice72 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 09/08/2016, 15h00
  2. Réponses: 3
    Dernier message: 08/08/2016, 09h56
  3. Réponses: 3
    Dernier message: 07/08/2016, 11h23
  4. Insérer une ligne en recopiant les formules et mise en forme
    Par mogo107 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 12/06/2013, 23h05
  5. [XL-2007] recopier mise en forme conditionnelle
    Par Hervé40 dans le forum Excel
    Réponses: 2
    Dernier message: 07/07/2010, 18h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo