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.
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
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.
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