Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Colorier des cellules avec une macro et/ou avec Privatesub

13 réponses
Avatar
captain-kirk
Bonjour à tous


Je suis en train de réaliser un tableau de bord social dans le cadre d'un stage et j'aurai besoin de votre aide concernant le coloriage de cellules à l'aide d'une macro.

J'ai un tableau qui est une base de données des salariés

-La colonne E donne des informations sur le sexe de la personne : Homme ou Femme ( elle s'étend de E6 à E95)
-La colonne H donne des informations sur la catégorie socioprofessionnelle du salarié (Ouvrier, Employé, Agent de maîtrise, Cadre) (H6 à H95)
-La colonne K contient les salaires. Je voudrais mettre une couleur en fonction du sexe de la personne (bleu clair pour les hommes ou rose pour les femmes). (K6 à K95)
-La colonne L contient exactement les mêmes salaires. Mais cette fois-ci, je voudrais mettre une couleur en fonction de la catégorie socioprofessionnelle auquelle appartient le salairé. (L6 à L95)

J'a intégré le code suivant pour colorier les cellules en fonction du sexe de la personne:


Private Sub Worksheet_Change(ByVal Target As Range)
Dim lig As Byte, plage As Range
If Intersect(Target, Range("E6:E95")) Is Nothing Then: Exit Sub

lig = Target.Row
Set plage = Range(Cells(lig, 11), Cells(lig, 11))



Select Case Target
Case Is = "Homme"
plage.Interior.ColorIndex = 41
Case Is = "Femme"
plage.Interior.ColorIndex = 38

Case Else
plage.Interior.ColorIndex = -4142 ' enlève la couleur
End Select

Set plage = Nothing
End Sub


Ce code marche super bien. J'ai donc fait exactement le même mais pour les catégories socioprofessionnelles:


Private Sub Worksheet_Change(ByVal Target As Range)
Dim lig As Byte, plage As Range
If Intersect(Target, Range("H6:H95")) Is Nothing Then: Exit Sub

lig = Target.Row
Set plage = Range(Cells(lig, 12), Cells(lig, 12))



Select Case Target
Case Is = "Ouvrier"
plage.Interior.ColorIndex = 6
Case Is = "Cadre"
plage.Interior.ColorIndex = 3
Case Is = "Employé"
plage.Interior.ColorIndex = 4
Case Is = "Agent de maîtrise"
plage.Interior.ColorIndex = 8

Case Else
plage.Interior.ColorIndex = -4142 ' enlève la couleur
End Select

Set plage = Nothing
End Sub




Normalement ça devrait marcher mais ça coince quand je veux rentrer les données dans la colonne H car l'ordinateur me marque Erreur de compilation : Nom ambigu détecté : Worksheet_Change



Peut-on mettre deux Private Sub dans une même feuille? Peut-on faire des macros au lieu d'utiliser Private sub. Si oui comment? (car j'y connais pratiquement rien)

Merci

3 réponses

1 2
Avatar
captain-kirk
LSteph a écrit le 21/07/2009 à 15h37 :
Bonjour,

Il peut fort bien y avoir à la fois un change et selectionchange ce
sont deux évennements distinctcs

Toutefois je recommande fort peu de vouloir calculer avec les couleurs
car mobiliser ainsi
un évennement qui se déclanche chaque fois que l'on bouge de
cellule
est très alourdissant surtout s'il relance chaque fois un calculate.
Par principe pour le calcul utiliser plutôt la condition qui
prévaut à
la mise en couleur.



--
lSteph

On 21 juil, 15:30, captain-kirk wrote:
captain-kirk a écrit le 21/07/2009 à 10h19 :



> Bonjour à tous

> Je suis en train de réaliser un tableau de bord social dans le
cadre
> d'un stage et j'aurai besoin de votre aide concernant le coloriage de
cellules
> à l'aide d'une macro.

> J'ai un tableau qui est une base de données des salariés

> -La colonne E donne des informations sur le sexe de la personne : Homme
ou
> Femme ( elle s'étend de E6 à E95)
> -La colonne H donne des informations sur la catégorie
> socioprofessionnelle du salarié (Ouvrier, Employé, Agent de
> maîtrise, Cadre) (H6 à H95)
> -La colonne K contient les salaires. Je voudrais mettre une couleur en
fonction
> du sexe de la personne (bleu clair pour les hommes ou rose pour les fem
mes).
> (K6 à K95)
> -La colonne L contient exactement les mêmes salaires. Mais cette
fois -ci,
> je voudrais mettre une couleur en fonction de la catégorie
> socioprofessionnelle auquelle appartient le salairé. (L6 à
L95)

> J'a intégré le code suivant pour colorier les cellules en
> fonction du sexe de la personne:

>     Private Sub Worksheet_Change(ByVal Target As Range)
> Dim lig As Byte, plage As Range
> If Intersect(Target, Range("E6:E95")) Is Nothing Then: Exit Sub

> lig = Target.Row
> Set plage = Range(Cells(lig, 11), Cells(lig, 11))

> Select Case Target
>     Case Is = "Homme"
>         plage.Interior.ColorIndex = 41
>      Case Is = "Femme"
>         plage.Interior.ColorIndex = 38

>     Case Else
>         plage.Interior.ColorIndex = -4142 '
enlève la coule ur
> End Select

> Set plage = Nothing
> End Sub

> Ce code marche super bien. J'ai donc fait exactement le même mais
pou r
> les catégories socioprofessionnelles:

> Private Sub Worksheet_Change(ByVal Target As Range)
> Dim lig As Byte, plage As Range
> If Intersect(Target, Range("H6:H95")) Is Nothing Then: Exit Sub

> lig = Target.Row
> Set plage = Range(Cells(lig, 12), Cells(lig, 12))

> Select Case Target
>     Case Is = "Ouvrier"
>         plage.Interior.ColorIndex = 6
>      Case Is = "Cadre"
>         plage.Interior.ColorIndex = 3
>          Case Is = "Employé"
>         plage.Interior.ColorIndex = 4
>      Case Is = "Agent de maîtrise"
>         plage.Interior.ColorIndex = 8

>     Case Else
>         plage.Interior.ColorIndex = -4142 '
enlève la coule ur
> End Select

> Set plage = Nothing
> End Sub

> Normalement ça devrait marcher mais ça coince quand je veux
> rentrer les données dans la colonne H car l'ordinateur me marque
Erre ur
> de compilation : Nom ambigu détecté : Worksheet_Change

> Peut-on mettre deux Private Sub dans une même feuille? Peut-on
faire des
> macros au lieu d'utiliser Private sub. Si oui comment? (car j'y connais
> pratiquement rien)

> Merci

Excusez-moi mais je suis encore face à un problème. La Private
Sub pr écédente
fonctionne très bien.

A partir de ça, j'ai inséré dans un module une fonction
qui permet de faire la
somme des valeurs contenues dans les cellules en fonction de leurs couleu rs
de
fonds:

Function SommeCouleurFond(champ As Range, couleurFond)
   Application.Volatile
   Dim c, temp
   temp = 0
   For Each c In champ
     If c.Interior.ColorIndex = couleurFond Then
       If IsNumeric(c.Value) Then temp = temp + c.Value
     End If
   Next c
   SommeCouleurFond = temp
End Function

Jusque là aucun problème. Mais cette fonction est loin
d'être parfa ite. Quand
les valeurs des cellules colorées changent, cette fonction recalcule
automatiquement le résultat. Mais quand on change la couleur de fond de
la
cellule, rien ne se passe. Pour remedier au problème, il faut
insérer le code
suivant :

Dim celluleAvant
  Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Not IsEmpty(celluleAvant) Then
     If Not Intersect(Range(celluleAvant), [B2:G3]) Is Nothing
Then Calculate
  End If
  celluleAvant = Target.Address
End Sub

Mais je me retrouve face au même problème que tout à
l'heure à sa voir qu'il
n'est pas possible d'avoir deux Worksheet_SelectionChange dans la même
feuille.

Comment résoudre le problème? Parce que je n'arrive pas
insérer ce code dans ce
que j'ai fait tout à l'heure.

Merci- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -





J'ai rétourné le problème dans tous les sens et seuls les calculs avec les couleurs peuvent m'aider. Bon en tout cas, je viens d'apprendre que Change et SelectionChange sont deux événements distincts.

Tes conseils ont l'air d'être sages mais il faut prendre en considération le fait que je ne savais pas ce qu'était une macro, une privatesub, une function il y a une semaine. Et mes officiers scientifiques ici présents sont encore plus largué que moi (le niveau à Starfleet Academy a considérablement baissé ces derniers temps) Donc je ne sais pas trop comment m'y prendre. Il faut à tout prix que j'intégre ce SelectionChange mais je n'y arrive pas. Ou à la rigueur, ce qui serait cool, ce serait de transformer ce code en macro. Après, je pourrais affecter un bouton à la macro qui recalculera le résultat si jamais la couleur change.
Avatar
LSteph
> J'ai rétourné le problème dans tous les sens et seuls les calculs a vec les
couleurs peuvent m'aider.



Tu arriverais presque à me convaincre mais si effectivement tu changes
une couleur alors que cela ne répond à aucun critère ni condition
dans ce cas je saisis mal le sens d'un calcul qui en dépendrait...

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Calculate
End Sub

ou sinon appuies sur F9


J'ai rétourné le problème dans tous les sens et seuls les calculs a vec les
couleurs peuvent m'aider. Bon en tout cas, je viens d'apprendre que Chang e et
SelectionChange sont deux événements distincts.

Tes conseils ont l'air d'être sages mais il faut prendre en considéra tion le
fait que je ne savais pas ce qu'était une macro, une privatesub, une fu nction il
y a une semaine. Et mes officiers scientifiques ici présents sont encor e plus
largué que moi (le niveau à Starfleet Academy a considérablement ba issé ces
derniers temps) Donc je ne sais pas trop comment m'y prendre. Il faut à tout
prix que j'intégre ce SelectionChange mais je n'y arrive pas. Ou à la rigueur,
ce qui serait cool, ce serait de transformer ce code en macro. Après, j e
pourrais affecter un bouton à la macro qui recalculera le résultat si jamais la
couleur change.- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -


Avatar
captain-kirk
captain-kirk a écrit le 21/07/2009 à 10h19 :
Bonjour à tous


Je suis en train de réaliser un tableau de bord social dans le cadre
d'un stage et j'aurai besoin de votre aide concernant le coloriage de cellules
à l'aide d'une macro.

J'ai un tableau qui est une base de données des salariés

-La colonne E donne des informations sur le sexe de la personne : Homme ou
Femme ( elle s'étend de E6 à E95)
-La colonne H donne des informations sur la catégorie
socioprofessionnelle du salarié (Ouvrier, Employé, Agent de
maîtrise, Cadre) (H6 à H95)
-La colonne K contient les salaires. Je voudrais mettre une couleur en fonction
du sexe de la personne (bleu clair pour les hommes ou rose pour les femmes).
(K6 à K95)
-La colonne L contient exactement les mêmes salaires. Mais cette fois-ci,
je voudrais mettre une couleur en fonction de la catégorie
socioprofessionnelle auquelle appartient le salairé. (L6 à L95)

J'a intégré le code suivant pour colorier les cellules en
fonction du sexe de la personne:


Private Sub Worksheet_Change(ByVal Target As Range)
Dim lig As Byte, plage As Range
If Intersect(Target, Range("E6:E95")) Is Nothing Then: Exit Sub

lig = Target.Row
Set plage = Range(Cells(lig, 11), Cells(lig, 11))



Select Case Target
Case Is = "Homme"
plage.Interior.ColorIndex = 41
Case Is = "Femme"
plage.Interior.ColorIndex = 38

Case Else
plage.Interior.ColorIndex = -4142 ' enlève la couleur
End Select

Set plage = Nothing
End Sub


Ce code marche super bien. J'ai donc fait exactement le même mais pour
les catégories socioprofessionnelles:


Private Sub Worksheet_Change(ByVal Target As Range)
Dim lig As Byte, plage As Range
If Intersect(Target, Range("H6:H95")) Is Nothing Then: Exit Sub

lig = Target.Row
Set plage = Range(Cells(lig, 12), Cells(lig, 12))



Select Case Target
Case Is = "Ouvrier"
plage.Interior.ColorIndex = 6
Case Is = "Cadre"
plage.Interior.ColorIndex = 3
Case Is = "Employé"
plage.Interior.ColorIndex = 4
Case Is = "Agent de maîtrise"
plage.Interior.ColorIndex = 8

Case Else
plage.Interior.ColorIndex = -4142 ' enlève la couleur
End Select

Set plage = Nothing
End Sub




Normalement ça devrait marcher mais ça coince quand je veux
rentrer les données dans la colonne H car l'ordinateur me marque Erreur
de compilation : Nom ambigu détecté : Worksheet_Change



Peut-on mettre deux Private Sub dans une même feuille? Peut-on faire des
macros au lieu d'utiliser Private sub. Si oui comment? (car j'y connais
pratiquement rien)

Merci


Oui j'avais déjà pensé au bouton F9 mais je trouve que c'est mieux d'automatiser. En tout cas merci pour tout.
1 2