Worksheet_Change(ByVal Target As Range)

matthieumagl

XLDnaute Nouveau
Bonjour,

Je mets ci-joint un fichier.
Je cherche, à partir de l'événement WORKSHEET_CHANGE à obtenir dans la cellule D5 la dernière modification entrée dans les cellules de ma plage B1:B4.

Lorsque je saisie directement à la main mes chiffres dans ma plage B1:B4, pas de problème: ça fonctionne !
(feuille1)
Par contre, lorsque la saisie est indirecte, c'est-à-dire lorsqu’il y a des formules dans B1:B4, cela ne fonctionne plus.
(feuille2)
Et je n'arrive pas à savoir pourquoi?
En plus, ma TARGET de type Range est bien en ByVal

Auriez vous une explication s'il vous plait? Comment y arriver?

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$B$1" Then
Range("D5") = Target.Value
Else
If Target.Address = "$B$2" Then
Range("D5") = Target.Value
Else
If Target.Address = "$B$3" Then
Range("D5") = Target.Value
Else
If Target.Address = "$B$4" Then
Range("D5") = Target.Value
End If
End If
End If
End If

End Sub

PS: Je fais ce petit exercice pour ensuite récupérer une seule valeur à partir de plusieurs TCD qui "bougent" avec des filtres.

Cordialement,

Merci d'avance pour votre aide,

Matthieu
 

Pièces jointes

  • macro pour raccrocher les filtres.xlsm
    15.5 KB · Affichages: 65
G

Guest

Guest
Re : Worksheet_Change(ByVal Target As Range)

Bonsoir,

Il n'y a pas moyen de savoir quand une cellule particulière a changée de valeur suite à un recalcul.
Il faut employer des moyens détournés, mais le jeu en vaut-il la chandelle?
Sans les tenants et aboutissants de ton projets, impossible à dire.

En tous cas tu peux changer déjà tes lignes de codes par celles-ci qui feront la même chose.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    'Si target est inclus dans B1:B3 et qu'une seule cellule a changée
    If Not Intersect(Target, Range("B1:B3")) Is Nothing And Target.Count = 1 Then Range("D5") = Target.Value
End Sub

A+
 

Si...

XLDnaute Barbatruc
Re : Worksheet_Change(ByVal Target As Range)

Salut

petit complément d'explications

Avec Private Sub Worksheet_Change(ByVal Target As Range), Target désigne la cellule active ou la plage des cellules sélectionnées juste avant le traitement de l'évènement et non les cellules qui dépendent d'elles.

Pour le vérifier, insère cette instruction juste après celle ci-dessus : MsgBox Target.Adress.

Si... tu remplaces la formule en B1, par exemple par =A1+A2, tu auras bien en D5 la réponse (toujours avec ta macro ou celle plus concise de Hasco ;)). D5 ne changera pas aux changements de A1 ou A2 même si B1 change !

Pour tester le nouveau contenu d'une cellule "formule", il faut savoir ce qui est à l'origine du changement.
Par exemple, en B1, =A1+A2. Bien sûr B1 change avec A1 ou A2 mais, avec l’événement Change , la variable Target correspond à l'une d'elles et non à B1.
 

matthieumagl

XLDnaute Nouveau
Re : Worksheet_Change(ByVal Target As Range)

Merci pour tous tes renseignements. Ça m'a aidé à mieux comprendre le TARGET, l'événement CHANGE et le code IF NOT INTERSECT.

Mais en faisant plusieurs essais, j'ai réussi à obtenir ce que je voulais. Voilà le code:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

If Target = Range("B2") Then
Range("C5") = Range("B2").Value
Else
If Target = Range("B3") Then
Range("C5") = Range("B3").Value
Else
If Target = Range("B4") Then
Range("C5") = Range("B4").Value
Else

End If
End If
End If

End Sub



Merci pour tout en cas !
Matthieu
 

Discussions similaires

Réponses
1
Affichages
247

Statistiques des forums

Discussions
312 235
Messages
2 086 476
Membres
103 227
dernier inscrit
maloalek