OVH Cloud OVH Cloud

Evenement

5 réponses
Avatar
DéGé
Je souhaite déclencher une action lorsque la cellule A1 est modifiée:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = ("$A$21") Then
Action
End If
End Sub

Mon problème est que l'action est déclenchée uniquement lorsque A1 est
modifiée
manuellement. Comment faire pour que l'action soit exécutée
lorsque la valeur de A1 est modifiée en fonction d'une autre cellule.

5 réponses

Avatar
Michel Pierron
Bonsoir Dégé;
Quelque chose comme:
Dim Contenu$

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Contenu = "" Then Contenu = [A1].Text
If Not Contenu = [A1].Text Then MsgBox "Cellule ""A1"" modifiée !", 64
End Sub

MP

"DéGé" a écrit dans le message de
news:cf3e2b$oti$
Je souhaite déclencher une action lorsque la cellule A1 est modifiée:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = ("$A$21") Then
Action
End If
End Sub

Mon problème est que l'action est déclenchée uniquement lorsque A1 est
modifiée
manuellement. Comment faire pour que l'action soit exécutée
lorsque la valeur de A1 est modifiée en fonction d'une autre cellule.





Avatar
Michel Gaboly
Bonsoir Dégé,

En fait il y a 2 phénomènes qui conduisent à la situation que tu décris :

1 - Tu testes l'égalité entre Target.Address et "$A$21" (les parenthèses
sont superflues). Si tu sélectionnes plusieurs cellules dont $A$21 et
que tu fasses une validation manuelle globale (Ctrl + Enter), Action
ne sera déclenchée, car Target.Address ne sera pas éhgal à "$A$21",
mais à "$A$21:$A$24" (par exemple). Puisque Target peut corres-
pondre à plus d'une cellule, il faut une boucle les parcourant toutes.

2 - D'autre part (extrait de l'aide d'Excel 98 relative à l'événement
Change d'une feuille) : "Cet événement ne se produit pas lorsque les
cellules sont modifiées par un recalcul. Utilisez l'événement Calculate
pour piéger le recalcul d'une feuille de calcul."

Malheureusement, Calculate n'a pas d'argument équiivalent à Target.


Une solution consiste à utiliser l'événement Change en explorant Target
ET les cellules dépendantes (équivalent de Edition, Atteindre..., Bouton
Cellules, Sélectionner Dépendants, Tous niveaux)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Set Target = Union(Target, Target.Dependents)
For Each c In Target
Debug.Print c.Address
If c.Address = "$A$21" Then
MsgBox "A21 modifiée."
End If
Next c
End Sub


Cette routine provoque une erreur si l'événement Change survient et qu'il
n'y a aucune cellule dépendante de Target. Il faut donc ajouter une gestion
d'erreur, ce qui donne :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
On Error Resume Next
Set Target = Union(Target, Target.Dependents)
On Error GoTo 0
For Each c In Target
If c.Address = "$A$21" Then
MsgBox "A21 modifiée."
End If
Next c
End Sub


Voilà ;-))



Je souhaite déclencher une action lorsque la cellule A1 est modifiée:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = ("$A$21") Then
Action
End If
End Sub

Mon problème est que l'action est déclenchée uniquement lorsque A1 est
modifiée
manuellement. Comment faire pour que l'action soit exécutée
lorsque la valeur de A1 est modifiée en fonction d'une autre cellule.


--
Cordialement,

Michel Gaboly
http://www.gaboly.com

Avatar
Michel Gaboly
Re,

Complément : Le défaut d'un test sur une chaîne comme "$A$21" est qu'en
cas d'insertion (ou de suppression) de ligne(s) ou de colonne(s), "$A$21"
peut très bien ne plus correspondre à la cellule à tester.

C'est pourquoi je te conseille de nommer cette cellule ("CellRéf" par
exemple), ce qui rend la Sub insensible aux insertions/suppressions,
moyennant une adaptation légère :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, a As String
On Error Resume Next
a = Range("CellRéf").Address
Set Target = Union(Target, Target.Dependents)
On Error GoTo 0
For Each c In Target
If c.Address = a Then
MsgBox "A21 modifiée."
End If
Next c
End Sub


NB - Il est impératif que l'instruction

a = Range("CellRéf").Address

soit entre les 2 "On Error ..." pour éviter qu'une suppression de la cellule
nommée déclenche un message d'erreur ("La méthode Range de l'objet
Worksheet a échoué".)



Bonsoir Dégé,

En fait il y a 2 phénomènes qui conduisent à la situation que tu décris :

1 - Tu testes l'égalité entre Target.Address et "$A$21" (les parenthèses
sont superflues). Si tu sélectionnes plusieurs cellules dont $A$21 et
que tu fasses une validation manuelle globale (Ctrl + Enter), Action
ne sera pas déclenchée, car Target.Address ne sera pas égal à "$A$21",
mais à "$A$21:$A$24" (par exemple). Puisque Target peut corres-
pondre à plus d'une cellule, il faut une boucle les parcourant toutes.

2 - D'autre part (extrait de l'aide d'Excel 98 relative à l'événement
Change d'une feuille) : "Cet événement ne se produit pas lorsque les
cellules sont modifiées par un recalcul. Utilisez l'événement Calculate
pour piéger le recalcul d'une feuille de calcul."

Malheureusement, Calculate n'a pas d'argument équiivalent à Target.

Une solution consiste à utiliser l'événement Change en explorant Target
ET les cellules dépendantes (équivalent de Edition, Atteindre..., Bouton
Cellules, Sélectionner Dépendants, Tous niveaux)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Set Target = Union(Target, Target.Dependents)
For Each c In Target
If c.Address = "$A$21" Then
MsgBox "A21 modifiée."
End If
Next c
End Sub

Cette routine provoque une erreur si l'événement Change survient et qu'il
n'y a aucune cellule dépendante de Target. Il faut donc ajouter une gestion
d'erreur, ce qui donne :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
On Error Resume Next
Set Target = Union(Target, Target.Dependents)
On Error GoTo 0
For Each c In Target
If c.Address = "$A$21" Then
MsgBox "A21 modifiée."
End If
Next c
End Sub

Voilà ;-))


Je souhaite déclencher une action lorsque la cellule A1 est modifiée:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = ("$A$21") Then
Action
End If
End Sub

Mon problème est que l'action est déclenchée uniquement lorsque A1 est
modifiée
manuellement. Comment faire pour que l'action soit exécutée
lorsque la valeur de A1 est modifiée en fonction d'une autre cellule.


--
Cordialement,

Michel Gaboly
http://www.gaboly.com


--
Cordialement,

Michel Gaboly
http://www.gaboly.com


Avatar
DéGé
Merci pour tout !

"Michel Gaboly" a écrit dans le message de
news:
Re,

Complément : Le défaut d'un test sur une chaîne comme "$A$21" est qu'en
cas d'insertion (ou de suppression) de ligne(s) ou de colonne(s), "$A$21"
peut très bien ne plus correspondre à la cellule à tester.

C'est pourquoi je te conseille de nommer cette cellule ("CellRéf" par
exemple), ce qui rend la Sub insensible aux insertions/suppressions,
moyennant une adaptation légère :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, a As String
On Error Resume Next
a = Range("CellRéf").Address
Set Target = Union(Target, Target.Dependents)
On Error GoTo 0
For Each c In Target
If c.Address = a Then
MsgBox "A21 modifiée."
End If
Next c
End Sub


NB - Il est impératif que l'instruction

a = Range("CellRéf").Address

soit entre les 2 "On Error ..." pour éviter qu'une suppression de la
cellule

nommée déclenche un message d'erreur ("La méthode Range de l'objet
Worksheet a échoué".)



Bonsoir Dégé,

En fait il y a 2 phénomènes qui conduisent à la situation que tu décris
:



1 - Tu testes l'égalité entre Target.Address et "$A$21" (les parenthèses
sont superflues). Si tu sélectionnes plusieurs cellules dont $A$21 et
que tu fasses une validation manuelle globale (Ctrl + Enter), Action
ne sera pas déclenchée, car Target.Address ne sera pas égal à "$A$21",
mais à "$A$21:$A$24" (par exemple). Puisque Target peut corres-
pondre à plus d'une cellule, il faut une boucle les parcourant toutes.

2 - D'autre part (extrait de l'aide d'Excel 98 relative à l'événement
Change d'une feuille) : "Cet événement ne se produit pas lorsque les
cellules sont modifiées par un recalcul. Utilisez l'événement Calculate
pour piéger le recalcul d'une feuille de calcul."

Malheureusement, Calculate n'a pas d'argument équiivalent à Target.

Une solution consiste à utiliser l'événement Change en explorant Target
ET les cellules dépendantes (équivalent de Edition, Atteindre..., Bouton
Cellules, Sélectionner Dépendants, Tous niveaux)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Set Target = Union(Target, Target.Dependents)
For Each c In Target
If c.Address = "$A$21" Then
MsgBox "A21 modifiée."
End If
Next c
End Sub

Cette routine provoque une erreur si l'événement Change survient et
qu'il


n'y a aucune cellule dépendante de Target. Il faut donc ajouter une
gestion


d'erreur, ce qui donne :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
On Error Resume Next
Set Target = Union(Target, Target.Dependents)
On Error GoTo 0
For Each c In Target
If c.Address = "$A$21" Then
MsgBox "A21 modifiée."
End If
Next c
End Sub

Voilà ;-))


Je souhaite déclencher une action lorsque la cellule A1 est modifiée:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = ("$A$21") Then
Action
End If
End Sub

Mon problème est que l'action est déclenchée uniquement lorsque A1 est
modifiée
manuellement. Comment faire pour que l'action soit exécutée
lorsque la valeur de A1 est modifiée en fonction d'une autre cellule.


--
Cordialement,

Michel Gaboly
http://www.gaboly.com


--
Cordialement,

Michel Gaboly
http://www.gaboly.com






Avatar
Michel Gaboly
De rien ;-))


Merci pour tout !

"Michel Gaboly" a écrit dans le message de
news:
Re,

Complément : Le défaut d'un test sur une chaîne comme "$A$21" est qu'en
cas d'insertion (ou de suppression) de ligne(s) ou de colonne(s), "$A$21"
peut très bien ne plus correspondre à la cellule à tester.

C'est pourquoi je te conseille de nommer cette cellule ("CellRéf" par
exemple), ce qui rend la Sub insensible aux insertions/suppressions,
moyennant une adaptation légère :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, a As String
On Error Resume Next
a = Range("CellRéf").Address
Set Target = Union(Target, Target.Dependents)
On Error GoTo 0
For Each c In Target
If c.Address = a Then
MsgBox "A21 modifiée."
End If
Next c
End Sub


NB - Il est impératif que l'instruction

a = Range("CellRéf").Address

soit entre les 2 "On Error ..." pour éviter qu'une suppression de la
cellule

nommée déclenche un message d'erreur ("La méthode Range de l'objet
Worksheet a échoué".)



Bonsoir Dégé,

En fait il y a 2 phénomènes qui conduisent à la situation que tu décris
:



1 - Tu testes l'égalité entre Target.Address et "$A$21" (les parenthèses
sont superflues). Si tu sélectionnes plusieurs cellules dont $A$21 et
que tu fasses une validation manuelle globale (Ctrl + Enter), Action
ne sera pas déclenchée, car Target.Address ne sera pas égal à "$A$21",
mais à "$A$21:$A$24" (par exemple). Puisque Target peut corres-
pondre à plus d'une cellule, il faut une boucle les parcourant toutes.

2 - D'autre part (extrait de l'aide d'Excel 98 relative à l'événement
Change d'une feuille) : "Cet événement ne se produit pas lorsque les
cellules sont modifiées par un recalcul. Utilisez l'événement Calculate
pour piéger le recalcul d'une feuille de calcul."

Malheureusement, Calculate n'a pas d'argument équiivalent à Target.

Une solution consiste à utiliser l'événement Change en explorant Target
ET les cellules dépendantes (équivalent de Edition, Atteindre..., Bouton
Cellules, Sélectionner Dépendants, Tous niveaux)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Set Target = Union(Target, Target.Dependents)
For Each c In Target
If c.Address = "$A$21" Then
MsgBox "A21 modifiée."
End If
Next c
End Sub

Cette routine provoque une erreur si l'événement Change survient et
qu'il


n'y a aucune cellule dépendante de Target. Il faut donc ajouter une
gestion


d'erreur, ce qui donne :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
On Error Resume Next
Set Target = Union(Target, Target.Dependents)
On Error GoTo 0
For Each c In Target
If c.Address = "$A$21" Then
MsgBox "A21 modifiée."
End If
Next c
End Sub

Voilà ;-))


Je souhaite déclencher une action lorsque la cellule A1 est modifiée:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = ("$A$21") Then
Action
End If
End Sub

Mon problème est que l'action est déclenchée uniquement lorsque A1 est
modifiée
manuellement. Comment faire pour que l'action soit exécutée
lorsque la valeur de A1 est modifiée en fonction d'une autre cellule.


--
Cordialement,

Michel Gaboly
http://www.gaboly.com


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com