Modif mise en page si changement formule

Bonjour à tous,

J'ai besoin d'un petit coup de pouce, je cherche un code pour modifié la couleur de fond d'une cellule si la formule inscrite dans la cellule est modifiée.

Il s'agit d'un fichier de devis, je peux avoir des formules comme la suivante : =SI(B8=0;0;RECHERCHEV(B8;$T$3:$V$20;3;FAUX))

Mais il est possible que les deviseurs soient amenés à modifier la formule pour diverses raisons et dans ce cas il faudrait que la cellule en question se colore.

Mais cela dépasse actuellement mes compétences actuelles,

Si quelqu'un à une piste ou une astuce je suis preneur.

merci !

Nicolas

Bonjour Nicolas,

Tu peux insérer ce code dans la feuille "ThisWorkbook" de ta VBA :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Target.Interior.Color = RGB(255, 0, 0) 'Couleur Rouge

End Sub

Avec sa, à n'importe quelle changement de valeur dans une cellule, la cellule en question ce remplira en rouge.

Si tu veux plus de conditions pour le lancement de ce Private Sub il me faudrait des détails concernant tes noms de feuille, des colonnes ou des cellules etc...

Cordialement

Bonjour Juice,

Merci pour ce retour, mais j'ai une inquiétude, est-ce que ça ne va pas se colorer en rouge à chaque fois que la cellule change de valeur, sans pour autant changer la formule.

Par exemple, si la formule était A1= A2+A3

Est-ce que ca ne va pas se colorer en rouge à chaque fois que A2 et A3 sont modifié ?

Car il faudrait que ça ne change de couleur que quand la formule et uniquement la formule est modifiée.

Je réponds sans tester, je reviens vers vous dès que c'est fait.

Encore merci de prendre le temps !

Juice,

Ça marche très bien sur tout le classeur.

Mais serait-il possible de l'appliquer seulement à certaines feuilles et et à certaines cellules de ces feuilles ?

J'ai un fichier avec 9 feuilles et seulement 3 sont concernées et il y a des sélections en plein milieu de mes feuilles qui doivent être concernées.

Je ne peux vous joindre mon fichier, il est confidentiel .. :/

Merci,

Bonjour Nicolas, le forum,

je crois que ceci pourra t'aider : onglet Révision, groupe Modifications, Suivi des modifications

screen

dhany

Bonjour Dhany,

Merci pour cette proposition. Mais je n'utilise pas ce fichier, et le but est que les cellules deviennent rouge pour montrer directement et facilement les modifs.

Les personnes qui utilisent ce fichier n'iront jamais voir le suivi des modifs étant donné que ce sont eux qui les font.

Pour vous expliquer plus clairement: certaines fois suite à des remises de prix, négo ou autres, les formules de base pour calculer le prix des matières doivent être modifiées. Il faut qu'après avoir fait la modif et enregistrer le fichier.

Si ils reviennent dessus ou qu'un collègue reprend la main il puisse voir directement que la formule a été changé par rapport à celle de base.

Donc le suivi des modifications n'est pas envisageable dans ce cas précis.

Merci,

Bonjour Nicolas,

désolé : j'ai pas d'autre solution à proposer. continue de surveiller les prochaines réponses ; bonne chance !

dhany

Aucun soucis Dhany, merci encore d'avoir pris le temps.

A force de chercher et avec les différentes aides déjà reçues j'ai fini par dégager le code suivant :

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Application.Intersect(Target, Range("D2:F325")) Is Nothing Then
Target.Interior.Color = RGB(255, 0, 0) 'Couleur Rouge
End If

End Sub

j'ai une question concernant ce code :

- Peut on répéter le code autant de fois qu'il y a de sélections différentes ou existe-t'il une solution plus rapide par exemple "appliquer à toutes les cellules comprenant une formule sur la feuille" ? (ex de ce que je fais actuellement ci dessous)

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Application.Intersect(Target, Range("D2:F32")) Is Nothing Then
Target.Interior.Color = RGB(255, 0, 0) 'Couleur Rouge
End If

If Not Application.Intersect(Target, Range("D38:F75")) Is Nothing Then
Target.Interior.Color = RGB(255, 0, 0) 'Couleur Rouge
End If

End sub

Merci,

ah non, il faut faire comme ça (et c'est mieux d'indenter le code VBA car il est plus lisible) :

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("D2:F32, D38:F75")) Is Nothing Then
    Target.Interior.Color = RGB(255, 0, 0) 'Couleur Rouge
  End If
End Sub

dhany

Merci Dhany,

Et je peux en mettre autant que je veux ? Car j'ai une vingtaine de sélection à faire au total.

Merci,

Qui sont toutes séparées par des plage qui ne doivent pas être concernées ..

oui, tu peux en mettre autant que tu veux, si c'est bien la même action pour chaque, donc en rouge à chaque fois ; mais pour que le code VBA soit plus facilement lisible, fais comme suit :

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Plg$
  Plg = "D2:F32, D38:F75"
  If Not Application.Intersect(Target, Range(Plg)) Is Nothing Then
    Target.Interior.Color = RGB(255, 0, 0) 'Couleur Rouge
  End If
End Sub

tu as plus qu'à compléter la ligne Plg = "D2:F32, D38:F75"

dhany

Astucieux effectivement, et je n'ai qu'a mettre une virgule entre chaque sélection ?

Plg = "D2:F32, D38:F75, A5:A32, G12:G29, ..., ... , ..., ... etc "

oui, c'est bien ça, exactement ! bravo !

dhany

Bravo à toi! Et encore merci pour le coup de pouce ça m'aide bien !

Bonne continuation et à bientôt sur le forum

Juste une petite dernière question dans ton code tu déclare Plg avec $ à quoi cela correspond-il ?

Et le Option Explicit que tu as ajouté en haut ?

Merci,

ajout : pour éviter de tout mettre sur une seule ligne (qui serait alors très longue), tu peux faire comme suit :

Plg = "D2:F32, D38:F75, A5:A32, G12:G29, ..., ... , ..., ... etc " _
  & "..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., " _
  & "..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., " _
  & "..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..., ..."

le caractère souligné à la fin d'une ligne est appelé caractère de continuation de ligne ; ainsi, VBA comprend que la suite est sur la ligne en dessous ; attention : ne pas mettre de caractère souligné final pour la dernière ligne !

le caractère & est le caractère de concaténation : tous les éléments entre guillemets sont réunis (accolés les uns aux autres) pour former la chaîne de caractères Plg ; exemple : en A1 : Jean ; en B1 : Dupont ; MsgBox [A1] & " " & [B1] affiche Jean Dupont

[A1] est la notation abrégée de Range("A1") ; c'est idem

dhany

attention : lis d'abord mon message précédent !


on s'est croisés ! j'ai bien lu tes 2 derniers messages, et je réponds maint'nant à tes 2 questions :

1) Dim Plg$ est la notation abrégée de Dim Plg As String ; dans ce contexte, le signe $ est le caractère de déclaration de type pour les chaînes de caractères ; donc ici, ce n'est pas du tout le caractère de continuation de ligne !

2) le Option Explicit que j'ai ajouté tout en haut est une sécurité, car ça vérifie que toutes les variables utilisées ont bien été déclarées avant utilisation ; donc si une variable n'a pas été déclarée ou si elle a été mal orthographiée, ça va bloquer lors de la compilation (donc avant même l'exécution du code VBA) ; ça peut aussi détecter des erreurs de types de données ; certains considèrent que mettre Option Explicit est une contrainte car ça oblige à déclarer les variables, mais en fait, il faut le voir comme un avantage : c'est bien plus sûr !


merci d'avoir passé le sujet en résolu ; mais si tu as d'autres questions à propos de ce même sujet, n'hésite pas !

dhany

Dhany,

Merci pour toutes ces explications, et l'anticipation pour aller à la ligne (c'était ma prochaine question).

J'ai donc ce code. Qui me met un message d'erreur " L'objet Range de la méthode a échoué". Il y a dans les sélections des cellules fusionnées est-ce possible que ce soit la source du problème ?

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

  Dim Plg$

  Plg = "A5:A16, C5:F16, H5:H16, J5:R16, A22:A31, C22:C31," _
  & "G22:G31, I22:N31, A37:A45, C37:C45, G37:G45, I37:I45," _
  & "A51:A62, C51:F62, I51:R62, A68:A79, C68:D79, I68:Q79," _
  & "A90:A101, C90:F101, H90:M101, A109:A113, C109:C113," _
  & "F109:H113, A119:A130, C119:C130, E119:H130, M119:P130"

  If Not Application.Intersect(Target, Range(Plg)) Is Nothing Then
    Target.Interior.Color = RGB(255, 0, 0) 'Couleur Rouge
  End If
End Sub

oui : si tu as une plage fusionnée D5:H12 par exemple, faut mettre la référence entière, donc D5:H12 ; ça marche pour un effacement de cellules avec .ClearContents ; mais pour ce que tu veux faire là, j'suis pas sûr ! j'te laisse faire le test.

dhany

Rechercher des sujets similaires à "modif mise page changement formule"