Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 09/03/2010, 16h16   #1
Candidat au titre de Membre du Club
 
Nicolas Manin
Inscription : février 2010
Messages : 61
Détails du profil
Informations personnelles :
Nom : Nicolas Manin

Informations forums :
Inscription : février 2010
Messages : 61
Points : 14
Points : 14
Par défaut Copier les propriétés d'une case dans une autre

Bonjour à tous,

j'ai crée en VBA une mise en forme conditionnelle avec 5 conditions que voici :

Code :
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
Private Sub Workbook_Open()
 
    Range("e9:e200").Select
    Range("e9").Activate
    Dim lacellule As Range
    For Each lacellule In Selection
    couleurderemplissage = lacellule
    Next lacellule
    Range("e9:e9").Select
    Range("e9").Activate
 
End Sub
 
        Property Let couleurderemplissage(lacellule As Range)
        Dim indexcouleur As Integer
            Select Case lacellule.Value
 
                Case "1"
                indexcouleur = 3
                Case "2"
                indexcouleur = 8
                Case "3"
                indexcouleur = 6
                Case "4"
                indexcouleur = 7
                Case "5"
                indexcouleur = 4
                Case Else
                indexcouleur = xlColorIndexNone
 
            End Select
        lacellule.Interior.ColorIndex = indexcouleur
        End Property
Cela se fait sur la colonne "E".
J'aimerais simplement que ma macro copie la couleur de fond de la case E(x) dans la case D(x) quand une des 5 conditions est remplie pour cette case ...

Est-ce possible ?

Merci d'avance à quiconque prendra le temps de me lire.

@+ Vapo

Dernière modification par vapordinateur ; 09/03/2010 à 16h40.
vapordinateur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2010, 18h17   #2
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 7 906
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 7 906
Points : 13 687
Points : 13 687
Envoyer un message via Skype™ à Pierre Fauconnier
Bonjour

Une solution simple consisterait à appliquer la même MFC sur D que sur E, en s'appuyant sur les valeurs de E...
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2010, 08h57   #3
Candidat au titre de Membre du Club
 
Nicolas Manin
Inscription : février 2010
Messages : 61
Détails du profil
Informations personnelles :
Nom : Nicolas Manin

Informations forums :
Inscription : février 2010
Messages : 61
Points : 14
Points : 14
Oui c'est ce que je voudrais mais je ne sais pas comment faire...
je suis assez débutant en VBA, j'ai juste adapté un code trouvé sur internet.

Il faut qua ça ressemble à ça ??? :

Code :
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
Private Sub Workbook_Open()
 
    Range("d9:e200").Select
    Range("e9").Activate
    Dim lacellule As Range
    For Each lacellule In Selection
    couleurderemplissage = lacellule
    Next lacellule
    Range("e9:e9").Select
    Range("e9").Activate
 
End Sub
 
        Property Let couleurderemplissage(lacellule As Range)
        Dim indexcouleur As Integer
            Select Case lacellule.Value
 
                Case "1"
                indexcouleur = 3
                Case "2"
                indexcouleur = 8
                Case "3"
                indexcouleur = 6
                Case "4"
                indexcouleur = 7
                Case "5"
                indexcouleur = 4
                Case Else
                indexcouleur = xlColorIndexNone
 
            End Select
        lacellule.Interior.ColorIndex = indexcouleur
        End Property
[EDIT] : non j'ai testé ce n'est pas ça car là ce n'est pas basé sur la valeur de E.

Pour simplifier, n'existe-t-il pas un moyen du genre :

Code :
("e9:e200").Interior.ColorIndex = ("d9:d200).Interior.ColorIndex
???

Dernière modification par vapordinateur ; 10/03/2010 à 09h12.
vapordinateur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2010, 12h53   #4
Candidat au titre de Membre du Club
 
Nicolas Manin
Inscription : février 2010
Messages : 61
Détails du profil
Informations personnelles :
Nom : Nicolas Manin

Informations forums :
Inscription : février 2010
Messages : 61
Points : 14
Points : 14
Bon alors j'ai trouvé une solution que j'arrive à appliquer sur une case en particulier, j'ajoute ceci à mon code (pour la case E9 dans ce cas) :

Code :
1
2
3
4
5
If Range("E9").Interior.ColorIndex = "3" Then Range("D9").Interior.ColorIndex = "3"
    If Range("E9").Interior.ColorIndex = "8" Then Range("D9").Interior.ColorIndex = "8"
    If Range("E9").Interior.ColorIndex = "6" Then Range("D9").Interior.ColorIndex = "6"
    If Range("E9").Interior.ColorIndex = "7" Then Range("D9").Interior.ColorIndex = "7"
    If Range("E9").Interior.ColorIndex = "4" Then Range("D9").Interior.ColorIndex = "4"
Mais ça ne fonctionne pas quand j'essaie de le faire sur une plage de case :
une erreur dans mon code ??? :

Code :
1
2
3
4
5
If Range("E9:E167").Interior.ColorIndex = "3" Then Range("D9:D167").Interior.ColorIndex = "3"
    If Range("E9:E167").Interior.ColorIndex = "8" Then Range("D9:D167").Interior.ColorIndex = "8"
    If Range("E9:E167").Interior.ColorIndex = "6" Then Range("D9:D167").Interior.ColorIndex = "6"
    If Range("E9:E167").Interior.ColorIndex = "7" Then Range("D9:D167").Interior.ColorIndex = "7"
    If Range("E9:E167").Interior.ColorIndex = "4" Then Range("D9:D167").Interior.ColorIndex = "4"
vapordinateur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2010, 13h34   #5
Futur Membre du Club
 
Inscription : octobre 2006
Messages : 47
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : octobre 2006
Messages : 47
Points : 18
Points : 18
Sans le code complet, on ne peut pas t'aider...

DVano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2010, 14h04   #6
Candidat au titre de Membre du Club
 
Nicolas Manin
Inscription : février 2010
Messages : 61
Détails du profil
Informations personnelles :
Nom : Nicolas Manin

Informations forums :
Inscription : février 2010
Messages : 61
Points : 14
Points : 14
Alors le voici ^^

Code :
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
35
36
37
38
39
Private Sub Worksheet_Change(ByVal Target As Range)

    Range("e9:e200").Select
    Range("e9").Activate
    Dim lacellule As Range
    For Each lacellule In Selection
    couleurderemplissage = lacellule
    Next lacellule
    Range("e9:e9").Select
    Range("e9").Activate
    
    If Range("E9:E167").Interior.ColorIndex = "3" Then Range("D9:D167").Interior.ColorIndex = "3"
    If Range("E9:E167").Interior.ColorIndex = "8" Then Range("D9:D167").Interior.ColorIndex = "8"
    If Range("E9:E167").Interior.ColorIndex = "6" Then Range("D9:D167").Interior.ColorIndex = "6"
    If Range("E9:E167").Interior.ColorIndex = "7" Then Range("D9:D167").Interior.ColorIndex = "7"
    If Range("E9:E167").Interior.ColorIndex = "4" Then Range("D9:D167").Interior.ColorIndex = "4"

End Sub

        Property Let couleurderemplissage(lacellule As Range)
        Dim indexcouleur As Integer
            Select Case lacellule.Value

                Case "1"
                indexcouleur = 3
                Case "2"
                indexcouleur = 8
                Case "3"
                indexcouleur = 6
                Case "4"
                indexcouleur = 7
                Case "5"
                indexcouleur = 4
                Case Else
                indexcouleur = xlColorIndexNone

            End Select
        lacellule.Interior.ColorIndex = indexcouleur
        End Property
Les parties en rouge sont pour moi l'endroit d'où vient le problème...
J'ai l'impression qu'il n'associe pas E(x) à D(x) ou alors qu'il faut que toute ma plage des E soit sur fond rouge pour faire passer ma plage des D sur fond rouge (ce qui n'est pas ce que je veux...).
Je veux que si E(135) à un fond rouge, D(135) passe sur fond rouge.

N'hésitez pas à me poser des questions si je n'ai pas été clair

[EDIT] : hé DVANO tu habites à vienne, moi je suis de chonas l'amballan juste à côté...^^
vapordinateur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2010, 14h44   #7
Membre Expert
 
Inscription : juillet 2007
Messages : 2 134
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 2 134
Points : 2 154
Points : 2 154
Salut vapordinateur et le forum
Un essais
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lacellule As Range
For Each lacellule In Range("E9:E200,D9:D200")
    couleurderemplissage = lacellule
Next lacellule
End Sub
Property Let couleurderemplissage(lacellule As Range)
Dim indexcouleur As Integer
Select Case lacellule.Value
    Case "1"
    indexcouleur = 3
    Case "2"
    indexcouleur = 8
    Case "3"
    indexcouleur = 6
    Case "4"
    indexcouleur = 7
    Case "5"
    indexcouleur = 4
    Case Else
    indexcouleur = xlColorIndexNone
End Select
lacellule.Interior.ColorIndex = indexcouleur
End Property
A+
Gorfael est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2010, 15h33   #8
Candidat au titre de Membre du Club
 
Nicolas Manin
Inscription : février 2010
Messages : 61
Détails du profil
Informations personnelles :
Nom : Nicolas Manin

Informations forums :
Inscription : février 2010
Messages : 61
Points : 14
Points : 14
Bonjour,

merci pour cette tentative mais ça n'a pas été concluant, avec ce code, dès que j'ai activé l'évènement "change", il m'a mis toute les cellules de la colonne "D" sur fond blanc...


Une question à deux francs, quand on fait , il prend l'ensemble ou alors il parcoure les cases une par une ???

Dernière modification par vapordinateur ; 10/03/2010 à 16h56.
vapordinateur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2010, 16h57   #9
Candidat au titre de Membre du Club
 
Nicolas Manin
Inscription : février 2010
Messages : 61
Détails du profil
Informations personnelles :
Nom : Nicolas Manin

Informations forums :
Inscription : février 2010
Messages : 61
Points : 14
Points : 14
RRRRR J'ai tout essayé je ne comprend pas pourquoi il accepte

Code :
If Range("E9").Interior.ColorIndex = "3" Then Range("D9").Interior.ColorIndex = "3"
mais pas

Code :
If Range("E9:E167").Interior.ColorIndex = "3" Then Range("D9:D167").Interior.ColorIndex = "3"

J'ai une idée mais je n'arrive pas à la mettre en oeuvre.

Je pense qu'il faut que je définisse une nouvelle variable avec un objet range sur la colonne D (ex : cellD) et que j'ai une formule qui ressemble à ça :

Code :
If lacellule.Interior.ColorIndex = "3" Then cellD.Interior.ColorIndex = "3"
Qu'en pensez-vous ???


[EDIT] : Je viens d'essayer ceci mais ça n'a pas l'air de vouloir fonctionner non plus...

Code :
1
2
3
For i = 9 To 167
        Range("D & i").Interior.ColorIndex = Range("E & i").Interior.ColorIndex
    Next i
Merci à ceux qui prendront le temps de me lire

@+ Vapo

Dernière modification par vapordinateur ; 10/03/2010 à 17h20.
vapordinateur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2010, 21h47   #10
Membre expérimenté
 
Inscription : décembre 2006
Messages : 610
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 610
Points : 556
Points : 556
Envoyer un message via Skype™ à ESVBA
Par défaut bonsoir vapordinateur,

j'ai survoler de très haut tes problèmes :

je m'arrête sur le dernier code :
Code :
1
2
3
For i = 9 To 167
        Range("D & i").).Interior.ColorIndex = Range("E & i").Interior.ColorIndex
    Next i

Regarde bien en orange, tu lui demandes de sélectionner la plage de cellules de ce qui est entre guillements (en VBA, les guillements déclarent une chaine de caractères littérale) donc la plage d'adresse "D & i" à chaque tour de boucle.

Il faut mettre :
Code :
1
2
3
For i = 9 To 167
        Range("D" & i).Interior.ColorIndex = Range("E" & i).Interior.ColorIndex
Next i
pour avoir "D" & 9 soit "D9" puis "D" & 10 soit "D10"...
Idem pour "E"


Bonne continuation.

ESVBA
ESVBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2010, 21h59   #11
Membre expérimenté
 
Inscription : décembre 2006
Messages : 610
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 610
Points : 556
Points : 556
Envoyer un message via Skype™ à ESVBA
Par défaut je reviens sur le post initial :

Citation:
une mise en forme conditionnelle (en VBA) avec 5 conditions que voici
Pourquoi faire cela au moment de l'ouverture du classeur !
Si on modifie une valeur, pour que la couleur soit actualisée, il faut fermer et réouvrir le classeur ? Ben... OUI

Il faut faire le changement de couleur au changement de valeur dans une cellule de la feuille. Donc utiliser la procédure événementielle suivante placée dans le module de la feuille utilisée :

Place le code du genre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub Worksheet_Change (Target as range)
        'Il n'y a pas de code sélectif pour une cellule changée, il faut tester si la cellule 
        'changée est dans une place de cellule. C'est du VBA.
 
         '** Il faut appliquer la modification de couleur sur une partie de la feuille 
         '**donc il faut faire un test pour connaitre la cellule modifiée
 
         'Si la cellule changée (Target) est dans la place "E9:E200"
         'Code avec double négation en VBA, pas le choix des instructions !!
         If Not Instersect(Target, "E9:E200") Is Nothing Then
               'La cellule dans la colonne d'à côté de la cellule changée soit la colonne "D"
               'copie la couleur de la cellule changée
         Target.Offset(0,-1).Interior.ColorIndex  = Target.Interior.ColorIndex 
        'Fin du Code pour recopier la couleur
        End If
 
        '*** Libre pour un autre 
End Sub

Attention : non testé cette fois.



ESVBA
ESVBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 02h59   #12
Membre Expert
 
Inscription : juillet 2007
Messages : 2 134
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 2 134
Points : 2 154
Points : 2 154
Salut vapordinateur et le forum
Citation:
merci pour cette tentative mais ça n'a pas été concluant, avec ce code, dès que j'ai activé l'évènement "change", il m'a mis toute les cellules de la colonne "D" sur fond blanc...
Chez moi, ça fonctionne : Si je mets un 1 en E20, les cellules de D et de E se colorient en fonction de ce qui est prévu.

Je n'ai fait que rajouter E9:E20 dans la boucle.

N'empêche que comme je l'ai signalé, c'est un code qui ne me plait pas :
- On recolorie toutes les cellules pour un seul changement dans la feuille, même si il ne correspond pas à la plage.
- On complique le code pour rien. Je ne comprends toujours pas le besoin de passer par "Property Let".
Moi, je ferais plutôt :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cel As Range, Plage As Range
Set Plage = Intersect(Target, [D9:D167,E9:E167])
If Plage Is Nothing Then Exit Sub
For Each Cel In Plage
    Select Case Cel
        Case 1
            Cel.Interior.ColorIndex = 3
        Case 2
            Cel.Interior.ColorIndex = 8
        Case 3
            Cel.Interior.ColorIndex = 6
        Case 4
            Cel.Interior.ColorIndex = 7
        Case 5
            Cel.Interior.ColorIndex = 4
        Case Else
            Cel.Interior.ColorIndex = xlNone
    End Select
Next Cel
End Sub
A+
Gorfael est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 09h13   #13
Candidat au titre de Membre du Club
 
Nicolas Manin
Inscription : février 2010
Messages : 61
Détails du profil
Informations personnelles :
Nom : Nicolas Manin

Informations forums :
Inscription : février 2010
Messages : 61
Points : 14
Points : 14
Et voila problème résolu. Merci tout le monde.

Ce qu'il me manquait que je ne connaissait pas, c'était la fonction

c'était exactement ce qu'il me fallait.

Et sinon "Gorfael", je te maintient que chez moi le code que tu proposes ne fonctionne pas, ça ne me colorie pas les cases en "D".

Merci beaucoup pour ce petit moment de culture VBAcienne... ^^

@+ Et encore merci beaucoup à tout le monde.

Dernière modification par AlainTech ; 08/05/2010 à 12h06. Motif: Balises [code]
vapordinateur est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 03h39.


 
 
 
 
Partenaires

Hébergement Web