Exécuter macro dès qu'une ou plusieurs cellules changent de valeur

  • Initiateur de la discussion Initiateur de la discussion aure
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

A

aure

Guest
Bonjour,

J'ai un problème avec l'exécution de ma macro.
Je voudrais qu'elle s'exécute dès qu'une des cellules (C55:G59) changent de valeur.
Leur valeur sont récupérées dans une autre feuille.
Voici le code que j'ai fait :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
Dim j As Integer

For i = 3 To 7
For j = 46 To 50
If Cells(j, i).Value = 1 Then
Cells(j, i).Interior.ColorIndex = 27
Cells(j, i).Font.ColorIndex = 27
ElseIf Cells(j, i).Value = 2 Then
Cells(j, i).Interior.ColorIndex = 3
Cells(j, i).Font.ColorIndex = 3
ElseIf Cells(j, i).Value = 3 Then
Cells(j, i).Interior.ColorIndex = 4
Cells(j, i).Font.ColorIndex = 4
ElseIf Cells(j, i).Value = 4 Then
Cells(j, i).Interior.ColorIndex = 10
Cells(j, i).Font.ColorIndex = 10
ElseIf Cells(j, i).Value = 5 Then
Cells(j, i).Interior.ColorIndex = 2
Cells(j, i).Font.ColorIndex = 2
Else
Cells(j, i).Interior.ColorIndex = 2
Cells(j, i).Font.ColorIndex = 1
End If
Next
Next

End Sub

Merci par avance pour votre aide.
 
Re : Exécuter macro dès qu'une ou plusieurs cellules changent de valeur

Bonjour
Proposition:
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Intsec As Range, Cel As Range
Set Intsec = Intersect(Me.[C55:G59], Target)
If Intsec Is Nothing Then Exit Sub
For Each Cel In Intsec
   On Error Resume Next
   Cel.Font.ColorIndex = Array(27, 3, 4, 10, 2)(Cel.Value - 1)
   If Err Then
      Cel.Font.ColorIndex = 1: Cel.Interior.ColorIndex = 2
   Else
      Cel.Interior.ColorIndex = Cel.Font.ColorIndex
      End If
   On Error GoTo 0
   Next Cel
End Sub
P.S. Non, attendez, je viens de relire l'énoncé, ce serait plutôt:
VB:
Private Sub Worksheet_Calculate()
Dim Cel As Range
For Each Cel In Me.[C55:G59]
   On Error Resume Next
   Cel.Font.ColorIndex = Array(27, 3, 4, 10, 2)(Cel.Value - 1)
   If Err Then
      Cel.Font.ColorIndex = 1: Cel.Interior.ColorIndex = 2
   Else
      Cel.Interior.ColorIndex = Cel.Font.ColorIndex
      End If
   On Error GoTo 0
   Next Cel
End Sub
Ou alors mettre le code dans une Worksheet_Change de la feuille de laquelle dépendent les valeurs de celle ci en remplaçant Me par le nom VBA de celle ci.

P.S. C'est encore faux. Je viens seulement de voir que d'après votre énoncé le traitement ne porte pas sur la plage dont la modification doit être testée. Difficile à tout appréhender sans fichier joint. Bon
combinez tout ce que je vous ai proposé selon vos besoin.
À+
 
Dernière édition:
Re : Exécuter macro dès qu'une ou plusieurs cellules changent de valeur

Merci.
Si vous pouvez m'aider d'avantage avec un fichier, je l'ai joins.
 
Dernière modification par un modérateur:
Re : Exécuter macro dès qu'une ou plusieurs cellules changent de valeur

Oui donc ça pourrait être dans la 2ième feuille (Nommée "Suppl" dans Excel et "Feuil6" dans VBA):
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Me.[C2:C26], Target) Is Nothing Then
   For Each Cel In Feuil5.[C46:G50]
      On Error Resume Next
      Cel.Font.ColorIndex = Array(27, 3, 4, 10, 2)(Cel.Value - 1)
      If Err Then
         Cel.Font.ColorIndex = 1: Cel.Interior.ColorIndex = 2
      Else
         Cel.Interior.ColorIndex = Cel.Font.ColorIndex
         End If
      On Error GoTo 0
      Next Cel
   End If
End Sub
Mais Bon. Il vaudrait mieux donner des noms aux plages traitées par les macros et pour VBA aux feuilles une abréviation de leurs noms Excel (avec F devant, habitude personnelle). Ça garantit une lisibilité des macros et leur indépendance par rapport à l'emplacement exact des plages qu'elles traitent.
À+
 
Re : Exécuter macro dès qu'une ou plusieurs cellules changent de valeur

Merci de votre aide.
Cependant je n'arrive pas à faire fonctionner ce code au niveau du premier If
 
Dernière modification par un modérateur:
Re : Exécuter macro dès qu'une ou plusieurs cellules changent de valeur

Il représente l'objet auquel est rattaché le module, soit une feuille, soit le classeur, soit un userform.
Vous l'auriez déduit de l'aide: curseur entre le "M" et le "e" de "Me", touche F1, il vient :
Le mot clé Me se comporte comme une variable déclarée de façon implicite. Il est automatiquement disponible pour toutes les procédures d'un module de classe. Lorsqu'une classe peut comporter plusieurs instances, le mot clé Me offre la possibilité de faire référence à l'instance de la classe dans laquelle le code est exécuté. Il s'avère particulièrement utile pour passer les informations concernant l'instance d'une classe en cours d'exécution à une procédure d'un autre module. Par exemple, supposez que la procédure suivante se présente dans un module :

Sub ChangeFormColor(FormName As Form)
FormName.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)
End Sub

Vous pouvez appeler cette procédure et passer l'instance en cours de la classe Form comme un argument à l'aide de l'instruction suivante :

ChangeFormColor Me
 
Re : Exécuter macro dès qu'une ou plusieurs cellules changent de valeur

Merci beaucoup ça fonctionne bien avec votre code.
Dans mon fichier, les chiffres de la colonne C de la feuille "Suppl" sont des cellules liées à des cases d'option. Donc elles ne sont pas rentrés manuellement.
De ce fait, j'ai l'impression que le code ne fonctionne pas en automatique à cause de ça.
 
Re : Exécuter macro dès qu'une ou plusieurs cellules changent de valeur

J'ai vraiment tout essayer mais ça ne marche pas sur mon fichier.
Y-a-t-il une modification à faire dans le code lorsque les chiffres de la colonne C ne sont pas rentrés manuellement?

Merci pour votre aide
 
Re : Exécuter macro dès qu'une ou plusieurs cellules changent de valeur

Bonjour.
Mettez le traitement ailleurs, à un endroit où vous êtes sûr qu'il s'exécutera. Affectez le à un bouton, à une case à cocher etc.
Faites en une Sub ordinaire dans un module ordinaire et appelez la partout où elle doit être exécutée.
À+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
15
Affichages
791
Réponses
5
Affichages
915
Réponses
4
Affichages
735
Réponses
8
Affichages
785
  • Question Question
XL 2021 VBA excel
Réponses
4
Affichages
453
Réponses
10
Affichages
666
Retour