Se connecter avec
S'enregistrer | Connectez-vous

Modifier couleur d'une cellule selon sa valeur

Dernière réponse : dans Programmation

Bonjour,

J'ai besoin d'un petit code simple qui change la couleur de la cellule active si > que 0. La macro doit appliquer la même couleur que la cellule en colonne A de la même rangée (les rangées ne sont pas toutes de la même couleur)

Voici le code:
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2. Dim cellR As String 'cellule dont la couleur est à changer, adresse de Rangée
  3.  
  4. If ActiveCell.Value > 0 Then
  5. cellR = ActiveCell.Row
  6. ActiveCell.Interior.ColorIndex = Range("A" & cellR).Interior.ColorIndex
  7. End If
  8. If ActiveCell.Value <= 0 Then
  9. ActiveCell.Interior.ColorIndex = xlNone
  10. End If
  11. End Sub


Ça fonctionne, le problème c'est que la couleur change seulement lorsque je sélectionne une 2e fois la cellule au lieu de lors du changement de valeur. J'ai essayé avec l'événement Change mais sans succès.

Quelqu'un a une idée?
Merci

Autres pages sur : modifier couleur cellule valeur

Lassé par la pub ? Créez un compte

Bonjour,

L'évènement SelectionChange est déclenché lorsque la selection change et non la valeur.

Autre chose (si tu fait la modif tu verra que ça marche plus), évite de travaillé avec les ActiveCell et utilise les paramètres de la fonction dans laquelle tu te trouve.
Expert Programmation

Mais non, cellR n'est pas une chaîne de caractères, c'est une cellule !
Et sinon, tu connais Else ?

Ah les cellules actives ... Merci tantal !

Ton problème résolu :

  1. If Target.Value > 0 Then
  2. Target.Interior.ColorIndex = Target.EntireRow.Cells(1).Interior.ColorIndex
  3. Else
  4. Target.Interior.ColorIndex = xlNone
  5. End If


Allez, juste pour se la pêter :

  1. Target.Interior.ColorIndex = Iif(Target.Value > 0, Target.EntireRow.Cells(1).Interior.ColorIndex, xlNone)

Bonjour,

Merci! Ça fonctionne comme voulu. La modification des couleurs doit s'effectuer dans une plage de cellule seulement, j'ai donc ajouter ces lignes:

  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Not Application.Intersect(Target, Range("D2:I65535")) Is Nothing Then
  3. If Target.Value > 0 Then
  4. Target.Interior.ColorIndex = Target.EntireRow.Cells(1).Interior.ColorIndex
  5. Else
  6. Target.Interior.ColorIndex = xlNone
  7. End If
  8. End If
  9. End Sub


Ça fontionne toujours bien. Le problème c'est lorsque qu'on modifie plusieurs cellule à la fois ou bien qu'on supprime une ligne (sélection multiple donc), j'ai une erreur "incompatibilité de type" sur la ligne 3.

Est-ce bien compliqué à gérer?

Merci

spitchz a dit :
Bonjour,


Ça fontionne toujours bien. Le problème c'est lorsque qu'on modifie plusieurs cellule à la fois ou bien qu'on supprime une ligne (sélection multiple donc), j'ai une erreur "incompatibilité de type" sur la ligne 3.

Est-ce bien compliqué à gérer?

Merci


Bonjour,


C'est par-ce-que plusieurs cellules sont modifiées en même temps et donc ton target est une range de plusieurs cellules.

Il faudrait, par exemple, utiliser une boucle for each

  1. Option Explicit
  2. Const LAST_ROW = 65535
  3.  
  4. Private Sub Worksheet_Change(ByVal Target As Range)
  5.  
  6. Dim cellule As Range
  7.  
  8. For Each cellule In Target
  9. If cellule.Value > 0 Then
  10.  
  11. cellule.Interior.ColorIndex = cellule.EntireRow.Cells(1).Interior.ColorIndex
  12. Else: cellule.Interior.ColorIndex = xlNone
  13. End If
  14.  
  15. If cellule.End(xlDown).Row >= LAST_ROW Then Exit Sub 'On quitte si dernière cellule
  16. Next cellule
  17.  
  18. End Sub

tantal_fr a édité ce message
Expert Programmation

Euh, spa bon, ça mon cher Tantal.

Imagine que la feuille ne contiennent que des données sur la ligne 1 et que Target soient "A1:B1".

Que fait faire ta ligne
  1. If cellule.End(xlDown).Row >= LAST_ROW Then Exit Sub
dès la première cellule ?
Un bug ! :lol: 

------------------------

Pis 65536 lignes, c'est une limite 16Bits (!) Les dernières versions d'Excel acceptent plus de lignes et plus de colonnes.
Donc
  1. LAST_ROW = Rows.Count

zeb a dit :
Euh, spa bon, ça mon cher Tantal.

Imagine que la feuille ne contiennent que des données sur la ligne 1 et que Target soient "A1:B1".

Que fait faire ta ligne
  1. If cellule.End(xlDown).Row >= LAST_ROW Then Exit Sub
dès la première cellule ?
Un bug ! :lol: 



Ah oui, au temps pour moi :pfff: 
Ce truc ne marche que si l'on ne travaille qu'avec une colonne.
Faut tester les colonnes aussi :

  1. If cellule.End(xlDown).Row >= Rows.Count And cellule.End(xlToRight).Column >= Columns.Count Then Exit Sub



Expert Programmation

J'ai une autre approche : c'est la zone modifiée qui est passée en paramètre dans Target. Donc soit de très nombreuses cellules sont modifiées et il va falloir toutes les vérifier, soit ce ne sont que quelques une et Target n'en contiendra que très peu.

Donc je me demande bien pourquoi chercher à optimiser ce truc !
:spamafote: 

Mais bien sûr, ce raisonnement ne s'applique qu'à ce cas particulier.

En règle générale, vouloir à tout prix sortir le plus vite possible d'une boucle infinie ou presque est très honorable :jap: 
Expert Programmation

C'est tout à fait légitime, et si je me suis penché sur ta proposition, c'est parce que je lui trouvais un intérêt certain. Mais hélas, on entre dans une telle complication !
Lassé par la pub ? Créez un compte