Macro automatique lorsque valeur cellule change suite a une formule

BONJOUR

Je voudrais activer une macro quelconque seulement lorsque la valeur d'une cellule change, mais non suite à l'inscription ou à l'effacement "actif" de la valeur de cette cellule (pas avec "enter") mais suite à un changement "passif" de valeur (c'est à dire si cette valeur change en fonction d'une autre formule)

J'essaie de donner un exemple:

cas 1 de changement "actif": si j'inscris dans la celle A1 une valeur quelconque, puis j'appuie sur la touche ENTER, la cellule A1 vient de recevoir une valeur suite à une manipulation active de ma part (j'ai écrit dans la cellule).

cas 2 de changement "passif": la cellule A1 reçoit le résultat de l'addition (par exemple) des cellules A2 + A3. Quand j'inscrit en A2 la valeur "1" et quand j'inscris en A3 la valeur "1", automatiquement la cellule A1 reçoit la valeur "2" (qui est le résultat de l'addition)- mais la cellule A1 change ici de valeur de manière "passive" car je n'ai pas cliqué sur ENTER pour y mettre la valeur (la valeur dans A1 a été inscrite automatiquement).

dans les 2 cas ci-dessus, la cellule A1 a changé de valeur (de valeur nulle à la valeur de l'inscription)- la différence est la manière dont cela a été opéré.

Donc je recherche une macro qui s'active quand la valeur d'une cellule change mais sans que j'ai moi-même à y inscrire la valeur (ou à l'effacer).

La macro suivante fonctionne si je change moi-même la valeur (en pressant ENTER) dans la plage de cellule AA23:AJ23, cependant la macro ne fonctionne pas si la valeur de ces cellules (AA23:AJ23) est le résultat d'une fonction...

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range
    Set KeyCells = Me.Range("aa23:aj23") 

    If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then

   Range("aa20").Value = Range("C38").Value - Range("C32").Value
   Range("Ag20").Value = Range("E38").Value - Range("E32").Value

    End If

End Sub

Voila.. j'espère que j'ai réussis à me faire comprendre.. et j'espère que qq'un pourra m'aider!

Bonjour,

J'ai en mémoire un sujet similaire auquel j'avais répondu, je ne sais plus où se trouve le sujet, mais je me souviens à peu près de la solution, certes il n'est pas possible de savoir si tu lances un calcul manuel, mais si tu modifies A2 par exemple, tu peux consulter ses dépendants!

En clair, dans ton worksheet_change, il faudra que quand une cellule est modifiée, tu vérifies que des formules qui dépendent de celle-ci font parties d'une liste qui lancent ta macro.

Pour savoir qui sont les dépendants d'une cellule, il faut utiliser la propriété:

Range.Dependents

Elle est différente de DirectDependents, car elle gère tous les dépendants d'une cellule, même ceux qui peuvent être dépendant d'une cellule qui dépend d'une autre qui dépend de celle qui vient d'être modifiée

le code final doit ressembler à ça je pense:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range, element As Range
    Set KeyCells = Me.Range("aa23:aj23")
    On Error GoTo fin
    For Each element In Target.Dependents
        If Not Intersect(KeyCells, element) Is Nothing Then
            Range("aa20").Value = Range("C38").Value - Range("C32").Value
            Range("Ag20").Value = Range("E38").Value - Range("E32").Value
        End If
    Next element
fin:
End Sub

Par contre si j'étais toi, je désactiverais les évènements le temps de faire tes changements, ou ça relancera worksheet_change à chaque fois que tu exécutes une de ces lignes:

Range("aa20").Value = Range("C38").Value - Range("C32").Value
Range("Ag20").Value = Range("E38").Value - Range("E32").Value

Au fait je te dis ça car je faisais souvent cette erreur aussi par le passé, ça ne sert pas de mettre .value dans ton cas après Range, c'est utile seulement si tu veux utiliser une instruction de ce genre:

With Range("a1")
    msgbox(.row)
    msgbox(.column)
    msgbox(.value)
End With

Pour désactiver les évènements temporairement, il faut ajouter la ligne:

Application.EnableEvents = False

en début de code, et :

Application.EnableEvents = True

en fin de code

bonjour à tous,

Puisque Worksheet_Change n'est pas déclenché par un changement "passif", peut être essayer d'utiliser la plage des cellules qui elles sont modifiées manuellement .

Par exemple pour le cas 2

    Dim KeyCells As Range
    Set KeyCells = Me.Range("a2:a3") 

    If Not Application.Intersect(KeyCells, Range(Target)) _
           Is Nothing Then

A+

ok merci.

une autre question- un peu liée au sujet:

Est-il possible d'activer une macro si une cellule (au moins) parmis plusieurs cellules change de valeur?

Je ne veux pas utiliser une plage de cellules car il s'agit seulement de 2 ou 3 cellules dispersées dans l'onglet (et pas des cellules d'affilée)..

qqch du genre:

Set KeyCells = Range("x20") or range("b3")

mais bien entendu le OR ici ne marche pas car ce n'est pas la bonne syntaxe...

Re,

Essaye ce code et tu comprendras:

Sub test()
Dim plage As Range
Dim cellule As Range
Set plage = Range("a1,b5,d6")
For Each cellule In plage.Cells
    cellule = 2
Next cellule
End Sub

Sinon, Intersect peut prendre énormément de range différents pour faire son test, tu peux essayer aussi

La macro que tu m'as donnée remplace la valeur des cellules données dans la plage par le chiffre 2.

Ce n'est pas ce que je cherche...

Je cherche à adapter la macro suivante (qui s'active automatiquement lorsque la valeur de la cellule citée dans "Set KeyCells" est modifiée manuellement):

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range

 Set KeyCells = Me.Range("AC4") 
    If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then
           Range("C33") = Range("B33") * Range("AC4")
 end if

J'ai pensé à mettre une virgule entre chaque cellule mais ça ne marche évidemment pas.. (je veux par exemple que si la cellule AC4 ou la cellule B33 voit sa valeur changée alors la macro ci-dessus s'active)

Set KeyCells = Me.Range("AC4, B33")

...je veux par exemple que si la cellule AC4 ou la cellule B33 voit sa valeur changée alors la macro ci-dessus s'active

à tester

Set KeyCells = Union(Range("AC4"), Range("B33"))
If Not Intersect(KeyCells , Target) Is Nothing Then
   ...

La macro que tu m'as donnée remplace la valeur des cellules données dans la plage par le chiffre 2.

Ce n'est pas ce que je cherche...

Je cherche à adapter la macro suivante (qui s'active automatiquement lorsque la valeur de la cellule citée dans "Set KeyCells" est modifiée manuellement):

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range

 Set KeyCells = Me.Range("AC4") 
    If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then
           Range("C33") = Range("B33") * Range("AC4")
 end if

J'ai pensé à mettre une virgule entre chaque cellule mais ça ne marche évidemment pas.. (je veux par exemple que si la cellule AC4 ou la cellule B33 voit sa valeur changée alors la macro ci-dessus s'active)

Set KeyCells = Me.Range("AC4, B33")

Bonjour,

se contenter de copier coller une macro exemple, ce n'est pas ce que je t'ai dit de faire, je te démontrais juste que tu pouvais faire appel à plus de 2 cellules en utilisant la syntaxe que je montrais, je complétais en disant que tu pouvais mettre énormément de Range dans la fonction Intersect...

MERCI ALGOPLUS!! CA FONCTIONNE!!

MILLE MERCI!!!

Rechercher des sujets similaires à "macro automatique lorsque valeur change suite formule"