Déclencher macro selon la valeur d'une cellule

Bonjour à tous,

J'ai un logiciel tierce qui écrit des données dans mon fichier excel.

A chaque fois qu'il ajoute des données, il y a un compte des ajouts dans une case, (disons la case A1 du feuillet 1).

1er ajout -> A1 = 1

2ème ajout -> A1 = 2

3ème ajout -> A1 = 3

etc...

A chaque fois que A1 change de valeur, je voudrais déclencher une macro (nommons la "macroX").

Quelqu'un sait-il comment faire cela?

Merci d'avance

Nicole

Bonjour

Tu as plein d'exemples en bas de cette page

Cordialement

Amadéus a écrit :

Bonjour

Tu as plein d'exemples en bas de cette page

Cordialement

Je les ai lus, mais il s'agit souvent de cas précis et je ne comprends pas les solutions proposées (dans les cas où des solutiuons sont proposées).


voici un fichier exemple

A chaque fois que A1 change de valeur, je voudrais déclencher la "macroX".

30exemple.xlsm (13.46 Ko)

Bonjour

Un exemple

Cordialement

43classeur1.zip (6.57 Ko)

Merci Amadeus,

J'ai inséré dans le code du feuillet contenant A1 :

Private Sub Worksheet_Activate()

valeur = Range("a1")

End Sub

Private Sub Worksheet_Calculate()

If Range("a1") <> valeur Then

'Call MacroX

valeur = Range("a1")

End If

End Sub

et ça ne marche pas.

Quand je change la valeur de A1, rien ne se passe.

?

quelqu'un sait ce qui cloche dans le code d'Amadeus (ou dans l'usage que j'en ai fait)?


pour info, voici mon fichier exemple avec le code d'Amadeus qui ne fonctionne pas.

24exemple.xlsm (13.86 Ko)

Bonjour

Une autre façon de faire

Banzai64 a écrit :

Bonjour

Une autre façon de faire

Merci Banzai, c'est presque ce dont j'ai besoin.

Je dis presque car ta solution lance la macro à chaque fois qu'on saisit une donnée dans la cellule A1.

Et moi, j'ai besoin que la macro soit lancée seulement quand la valeur de A1 change.

La nuance (mais qui a des conséquences importantes dans mon fichier), c'est qu'avec ta solution, si je saisis la même valeur que celle qui existe déjà dans A1, ça lance la macro, alors que moi j'ai besoin que la macro ne se lance que s'il y a un changement de valeur dans A1...

Bonjour

Dans le fichier exemple que je t'ai envoyé.

Avant tout, sélectionne une autre feuille que celle concernée et reviens ensuite sur ta feuille.

Cordialement

Amadéus a écrit :

Bonjour

Dans le fichier exemple que je t'ai envoyé.

Avant tout, sélectionne une autre feuille que celle concernée et reviens ensuite sur ta feuille.

Cordialement

J'ai inséré dans le code du feuillet contenant A1 :

Private Sub Worksheet_Activate()

valeur = Range("a1")

End Sub

Private Sub Worksheet_Calculate()

If Range("a1") <> valeur Then

'Call MacroX

valeur = Range("a1")

End If

End Sub

et ça ne marche pas.

Quand je saisis une nouvelle valeur dans A1, rien ne se passe.

(par ailleurs, dans le fichier exemple que tu as posté, se pose le même problème qu'avec la solution de Banzai, à savoir que si je change les cellules de la colonne B, mais sans en changer le nombre, c'est à dire que la valeur de A1 reste inchangée, cela lance quand même le bouton)

Bonjour

nicopat a écrit :

Et moi, j'ai besoin que la macro soit lancée seulement quand la valeur de A1 change.

Neutralise la macro si C1 = A1

Sub MacroX()
'
' MacroX Macro
'
   If Range("A1") = Range("C1") Then Exit Sub
    Application.ScreenUpdating = False
    Range("A1").Copy
    Range("C1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
                             SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
End Sub
Banzai64 a écrit :

Bonjour

nicopat a écrit :

Et moi, j'ai besoin que la macro soit lancée seulement quand la valeur de A1 change.

Neutralise la macro si C1 = A1

Sub MacroX()
'
' MacroX Macro
'
   If Range("A1") = Range("C1") Then Exit Sub
    Application.ScreenUpdating = False
    Range("A1").Copy
    Range("C1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
                             SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
End Sub

Cette solution marche dans le fichier exemple... mais ne marche pas dans la réalité (désolée)

Dans la réalité, MacroX ne colle pas de valeur dans C1 (cette macro est un exemple).

Dans la réalité, on a uniquement la cellule A1.

Donc il faudrait neutraliser la macro en comparant la valeur antérieure de A1 avec la nouvelle valeur de A1 (je ne sais pas si c'est possible de neutraliser une macro cette manière).

... ou procéder autrement...

up

bonjour

instruction à mettre dans le code de la feuille

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
If Target <> valeur Then
 macrox 'ta macro
End If
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$A$1" Then valeur = Target
End Sub

instruction à mettre dans un nouveau module

Global valeur

Bonjour,

A tester.

Cdlt.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim oldValue, newValue

    If Target.Address = "$A$1" Then

        On Error GoTo err_Handler

        Application.EnableEvents = False
        newValue = Target.Value
        Application.Undo
        oldValue = Target.Value

        If oldValue = newValue Then GoTo exit_Handler

        'code à adapter

    End If

exit_Handler:
    Application.EnableEvents = True
    Exit Sub

err_Handler:
    MsgBox "Erreur : " & Err.Number & " - " & Err.Description
    Resume exit_Handler

End Sub
Jean-Eric a écrit :

Bonjour,

A tester.

Cdlt.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim oldValue, newValue

    If Target.Address = "$A$1" Then

        On Error GoTo err_Handler

        Application.EnableEvents = False
        newValue = Target.Value
        Application.Undo
        oldValue = Target.Value

        If oldValue = newValue Then GoTo exit_Handler

        'code à adapter

    End If

exit_Handler:
    Application.EnableEvents = True
    Exit Sub

err_Handler:
    MsgBox "Erreur : " & Err.Number & " - " & Err.Description
    Resume exit_Handler

End Sub

Merci Jean-Eric pour ton aide,

Cependant, je ne suis pas parvenue à faire fonctionner ta solution (je suppose que c'est la partie "code à adapter" que je n'ai pas su adaptée...)

Cela dit, H2SO4 a résolu mon problème.


h2so4 a écrit :

bonjour

instruction à mettre dans le code de la feuille

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
If Target <> valeur Then
 macrox 'ta macro
End If
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$A$1" Then valeur = Target
End Sub

instruction à mettre dans un nouveau module

Global valeur

Génial, ça marche!

Merci pour ton aide H2SO4!!!

J'ai parlé un peu trop vite dans mon message ci-dessus

Le système ci-dessus fonctionne, de même que le système proposé par Banzai64.

Le problème, c'est que ces 2 propositions fonctionnent si on modifie manuellement le contenu de la cellule ciblée.

Mais si on colle dans la cellule ciblée du contenu provenant par exemple d'un autre fichier (ce qui équivaut au fonctionnement de mon logiciel tierce qui colle des données dans mon fichier excel), cela ne déclenche pas la détection d'un changement de valeur dans la cellule ciblée...

Pour vous permettre de tester, vous trouverez ci-joint :

  • le fichier option1 (A1 est la cellule ciblée) qui est l'exemple de la solution proposée par Banzai64
  • le fichier option2 (A1 est la cellule ciblée) qui est l'exemple de la solution proposée par H2SO4
  • le fichier Exemple de contenu à coller.xlsx qui contient en A1 un exemple de contenu à coller dans la cellule A1 des 2 autres fichiers.

Donc lorsque l'on colle la cellule A1 de Exemple de contenu à coller.xlsx, je voudrais parvenir à ce que soit détecté le changement de valeur dans A1 du fichier option1 ou de option2... et que cela déclenche le lancement de la macro si A1 change de valeur.

Merci de votre aide.

14option-1.xlsm (15.63 Ko)
17option-2.xlsm (15.36 Ko)

j'ai essayé d'intercaler une cellule intermédiaire B1 (=A1) et déclencher la macro selon la valeur de B1, mais ça ne change rien...

des idées SVP ???

Bonjour

Il doit y avoir quelque chose que je n'arrive pas à saisir

Prérequis

Ouverture du fichier "Exemple de contenu à coller.xlsx"

Ouverture du fichier "option1.xlsm"

Test 1

Copie de A1 du fichier "Exemple de contenu à coller.xlsx"

Coller dans A1 du fichier "option1.xlsm"

La macro évènementielle se déclenche --> appel de la macro "MacroX"

La macro teste entre A1 et C1 et comme il y a une différence continue et copie A1 dans C1 : Test 1 Ok

Test 2

Copie de A1 du fichier "Exemple de contenu à coller.xlsx"

Coller dans A1 du fichier "option1.xlsm"

La macro évènementielle se déclenche --> appel de la macro "MacroX"

La macro teste entre A1 et C1 et comme il n'y a pas de différence sort de la macro : Test 2 Ok

tu as raison Banzai64, je viens de comprendre un point :

si tu copies 1 et une seule cellule et la colle spécialement dans A1, alors ça fonctionne.

En fait mon logiciel tierce, copie un array de data et le copie dans un ensemble de cellules contenant A1.

Et dans ce cas, ça ne fonctionne pas

Donc en fait, refais le test STP en cop-collant plus d'une cellule.

Rechercher des sujets similaires à "declencher macro valeur"