Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

prise en compte du changement de plusieurs valeurs

16 réponses
Avatar
Xavier
bonjour à tous,
voilà mon problème
je souhaiterais déclencher une macro à chaque fois qu'une valeur est
modifiée dans une de mes feuilles.
Vous allez me dire : Facile, il y a qu'à utiliser l'événement
Worksheet_Change et le tour est joué.

Le problème c'est qu'il se peut que dans ma feuille plusieurs cellules
soient modifiées en même temps (en utilisant le copier coller par
exemple) et malheureusement l'événement Worksheet_Change ne se déclenche
qu'une fois et que pour la première cellule modifiée.

Y a t-il une astuce pour prendre en compte le changement des autres
cellules ?

merci

6 réponses

1 2
Avatar
FS
Bonjour,

La nuit portant conseil, je pense que je me compliquais la vie plus
qu'Excel. Target conserve en effet les références de toutes les cellules
qui le composent.
Le premier code de Jacky pourrait donc être adapté ainsi, en adoptant un
autre type de boucle :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range, i&

Application.EnableEvents = False
Columns(3).Clear
Columns(4).Clear
For Each cell In Target
i = i + 1
Cells(i, 3) = cell.Address
Next
Application.EnableEvents = True

End Sub

Est-ce que ça répond mieux à ton besoin ?


FS
--
Frédéric SIGONNEAU
Modules et modèles pour Excel :
http://frederic.sigonneau.free.fr/

Xavier a écrit :
bonsoir frederic,
ben oui je crains que cela se complique car je peux copier une cellule
vers plusieurs celles en même temps mais qui peuvent être répartie
aléatoirement A10, A16, A17, A32,...

Je pensais (naïvement) que le range target de l'événement
Worksheet_Change avait les références de toutes les cellules modifiées
mais bizarement il me sort le bon nombre mais pas les bonnes références
(sauf quand les cellules modifiées sont adjacentes). Bug d'Excel ?

Pensez vous qu'il existe une solution ou dois je abandonner l'idée
d'utiliser l'événement Worksheet_change pour répondre à mon pb?

Merci pour tout

Xavier




FS a écrit :
Bonsoir,

Ça se complique ton affaire !
Est-ce qu'il peut arriver que tu copies, par exemple, en sélectionnant
A10, A12:A14 et A16 ?
Ou est-ce que tu copies soit sur une plage d'un seul tenant (A10:A16)
soit sur des cellules uniques séparées (A10, A12, A14, A16) ?
Dans le deuxième cas de figure on peut trouver une solution simple
mais dans le premier ça va être plus difficile.

FS




Avatar
Xavier
ben c'est génial, tout simplement génial.

j'ai pas compris pourquoi
For i = 1 To Target.Count
Cells(i, 3) = Target(i).Address
Next
marche pas

alors que
For Each cell In Target
i = i + 1
Cells(i, 3) = cell.Address
Next
marche

Comment sont stockées les infos dans target?

En tout cas merci c'est le top pour moi



FS a écrit :
Bonjour,

La nuit portant conseil, je pense que je me compliquais la vie plus
qu'Excel. Target conserve en effet les références de toutes les cellules
qui le composent.
Le premier code de Jacky pourrait donc être adapté ainsi, en adoptant un
autre type de boucle :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range, i&

Application.EnableEvents = False
Columns(3).Clear
Columns(4).Clear
For Each cell In Target
i = i + 1
Cells(i, 3) = cell.Address
Next
Application.EnableEvents = True

End Sub

Est-ce que ça répond mieux à ton besoin ?


FS


Avatar
FS
> Comment sont stockées les infos dans target?



Bonne question. La différence de renvoi entre une boucle For..Next et
une boucle For Each..Next se constate avec tous les objets Range pas
uniquement Target ou Selection :

Sub essai()
Dim Plage As Range, i&
Set Plage = Range("A10,A12:A14,A16")
MsgBox "For...next"
For i = 1 To Plage.Count
MsgBox Plage(i).Address
Next
MsgBox "For each...next"
For Each cell In Plage
MsgBox cell.Address
Next
End Sub

Je n'ai pas trouvé dans l'aide de raison à cette différence de résultat,
sinon que la boucle For Each semble inclure dans sa définition le
traitement de collections (et donc d'objets). Mais c'est un peu léger,
trouve-je.

FS
--
Frédéric SIGONNEAU
Modules et modèles pour Excel :
http://frederic.sigonneau.free.fr/

Xavier a écrit :
ben c'est génial, tout simplement génial.

j'ai pas compris pourquoi
For i = 1 To Target.Count
Cells(i, 3) = Target(i).Address
Next
marche pas

alors que
For Each cell In Target
i = i + 1
Cells(i, 3) = cell.Address
Next
marche

Comment sont stockées les infos dans target?

En tout cas merci c'est le top pour moi



FS a écrit :
Bonjour,

La nuit portant conseil, je pense que je me compliquais la vie plus
qu'Excel. Target conserve en effet les références de toutes les
cellules qui le composent.
Le premier code de Jacky pourrait donc être adapté ainsi, en adoptant
un autre type de boucle :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range, i&

Application.EnableEvents = False
Columns(3).Clear
Columns(4).Clear
For Each cell In Target
i = i + 1
Cells(i, 3) = cell.Address
Next
Application.EnableEvents = True

End Sub

Est-ce que ça répond mieux à ton besoin ?


FS




Avatar
Jacky
Re...
Cela fait des lustres que l'on utilise ce genre de boucle, je n'avais pas
relevé cette différence.
Comme quoi, tous les jours........;o))

--
Salutations
JJ


"FS" a écrit dans le message de news:

> Comment sont stockées les infos dans target?

Bonne question. La différence de renvoi entre une boucle For..Next et une
boucle For Each..Next se constate avec tous les objets Range pas
uniquement Target ou Selection :

Sub essai()
Dim Plage As Range, i&
Set Plage = Range("A10,A12:A14,A16")
MsgBox "For...next"
For i = 1 To Plage.Count
MsgBox Plage(i).Address
Next
MsgBox "For each...next"
For Each cell In Plage
MsgBox cell.Address
Next
End Sub

Je n'ai pas trouvé dans l'aide de raison à cette différence de résultat,
sinon que la boucle For Each semble inclure dans sa définition le
traitement de collections (et donc d'objets). Mais c'est un peu léger,
trouve-je.

FS
--
Frédéric SIGONNEAU
Modules et modèles pour Excel :
http://frederic.sigonneau.free.fr/

Xavier a écrit :
ben c'est génial, tout simplement génial.

j'ai pas compris pourquoi
For i = 1 To Target.Count
Cells(i, 3) = Target(i).Address
Next
marche pas

alors que
For Each cell In Target
i = i + 1
Cells(i, 3) = cell.Address
Next
marche

Comment sont stockées les infos dans target?

En tout cas merci c'est le top pour moi



FS a écrit :
Bonjour,

La nuit portant conseil, je pense que je me compliquais la vie plus
qu'Excel. Target conserve en effet les références de toutes les cellules
qui le composent.
Le premier code de Jacky pourrait donc être adapté ainsi, en adoptant un
autre type de boucle :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range, i&

Application.EnableEvents = False
Columns(3).Clear
Columns(4).Clear
For Each cell In Target
i = i + 1
Cells(i, 3) = cell.Address
Next
Application.EnableEvents = True

End Sub

Est-ce que ça répond mieux à ton besoin ?


FS






Avatar
Daniel.C
Bonjour.
La différence semble venir du nombre d'areas de la plage, pas du type
de boucle :

Sub test()
Dim Plage As Range, i&
Set Plage = Range("A10,A12:A14,A16")
For j = 1 To Plage.Areas.Count
For i = 1 To Plage.Areas(j).Count
MsgBox Plage.Areas(j)(i).Address
Next i
Next j
End Sub

Cordialement.
Daniel

> Comment sont stockées les infos dans target?

Bonne question. La différence de renvoi entre une boucle For..Next et une
boucle For Each..Next se constate avec tous les objets Range pas uniquement
Target ou Selection :

Sub essai()
Dim Plage As Range, i&
Set Plage = Range("A10,A12:A14,A16")
MsgBox "For...next"
For i = 1 To Plage.Count
MsgBox Plage(i).Address
Next
MsgBox "For each...next"
For Each cell In Plage
MsgBox cell.Address
Next
End Sub

Je n'ai pas trouvé dans l'aide de raison à cette différence de résultat,
sinon que la boucle For Each semble inclure dans sa définition le traitement
de collections (et donc d'objets). Mais c'est un peu léger, trouve-je.

FS
--
Frédéric SIGONNEAU
Modules et modèles pour Excel :
http://frederic.sigonneau.free.fr/

Xavier a écrit :
ben c'est génial, tout simplement génial.

j'ai pas compris pourquoi
For i = 1 To Target.Count
Cells(i, 3) = Target(i).Address
Next
marche pas

alors que
For Each cell In Target
i = i + 1
Cells(i, 3) = cell.Address
Next
marche

Comment sont stockées les infos dans target?

En tout cas merci c'est le top pour moi



FS a écrit :
Bonjour,

La nuit portant conseil, je pense que je me compliquais la vie plus
qu'Excel. Target conserve en effet les références de toutes les cellules
qui le composent.
Le premier code de Jacky pourrait donc être adapté ainsi, en adoptant un
autre type de boucle :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range, i&

Application.EnableEvents = False
Columns(3).Clear
Columns(4).Clear
For Each cell In Target
i = i + 1
Cells(i, 3) = cell.Address
Next
Application.EnableEvents = True

End Sub

Est-ce que ça répond mieux à ton besoin ?


FS






Avatar
FS
Bonjour Daniel.C,

Cette observation judicieuse permet en effet d'utiliser une boucle For
lorsque c'est préférable à une boucle For Each.
Il reste que cette dernière permet de traiter directement tous types de
plages de cellules alors que la boucle For nécessite des boucles
imbriquées (et de penser à une vérification préalable du nombre d'areas).
Merci pour le schmilblick :)

FS
--
Frédéric SIGONNEAU
Modules et modèles pour Excel :
http://frederic.sigonneau.free.fr/

Daniel.C a écrit :
Bonjour.
La différence semble venir du nombre d'areas de la plage, pas du type de
boucle :

Sub test()
Dim Plage As Range, i&
Set Plage = Range("A10,A12:A14,A16")
For j = 1 To Plage.Areas.Count
For i = 1 To Plage.Areas(j).Count
MsgBox Plage.Areas(j)(i).Address
Next i
Next j
End Sub

Cordialement.
Daniel

> Comment sont stockées les infos dans target?

Bonne question. La différence de renvoi entre une boucle For..Next et
une boucle For Each..Next se constate avec tous les objets Range pas
uniquement Target ou Selection :

Sub essai()
Dim Plage As Range, i&
Set Plage = Range("A10,A12:A14,A16")
MsgBox "For...next"
For i = 1 To Plage.Count
MsgBox Plage(i).Address
Next
MsgBox "For each...next"
For Each cell In Plage
MsgBox cell.Address
Next
End Sub

Je n'ai pas trouvé dans l'aide de raison à cette différence de
résultat, sinon que la boucle For Each semble inclure dans sa
définition le traitement de collections (et donc d'objets). Mais c'est
un peu léger, trouve-je.

FS
--
Frédéric SIGONNEAU
Modules et modèles pour Excel :
http://frederic.sigonneau.free.fr/

Xavier a écrit :
ben c'est génial, tout simplement génial.

j'ai pas compris pourquoi
For i = 1 To Target.Count
Cells(i, 3) = Target(i).Address
Next
marche pas

alors que
For Each cell In Target
i = i + 1
Cells(i, 3) = cell.Address
Next
marche

Comment sont stockées les infos dans target?

En tout cas merci c'est le top pour moi



FS a écrit :
Bonjour,

La nuit portant conseil, je pense que je me compliquais la vie plus
qu'Excel. Target conserve en effet les références de toutes les
cellules qui le composent.
Le premier code de Jacky pourrait donc être adapté ainsi, en
adoptant un autre type de boucle :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range, i&

Application.EnableEvents = False
Columns(3).Clear
Columns(4).Clear
For Each cell In Target
i = i + 1
Cells(i, 3) = cell.Address
Next
Application.EnableEvents = True

End Sub

Est-ce que ça répond mieux à ton besoin ?


FS










1 2