Lancer une macro qd la valeur d'une cellule est modifiée

  • Initiateur de la discussion Initiateur de la discussion dacyrix
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

D

dacyrix

Guest
Bonsoir,
j'ai une macro qui me saisie en D1 la date dès que la valeur de A1 change (par le calcul pas par la saisie)
comment faire la meme chose en D2 D3 et +
j'ai bien la solution de recopier le code en changeant les cellules mais il existe peut-etre une autre solution?
merci de votre aide
 

Pièces jointes

Re : Lancer une macro qd la valeur d'une cellule est modifiée

Bonsoir dacyrix,

Tu peux faire cela dans la seule macro événementielle
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
comme dans ton fichier modifié ci-joint.

Le changement de cellule n'étant pas détecté s'il fait suite à l'action d'une formule, il vaut mieux tester les modifications des cellules figurant dans les formules.

Je t'ai mis quelques commentaires dans le code.

Espérant avoir répondu.

Cordialement.
 

Pièces jointes

Re : Lancer une macro qd la valeur d'une cellule est modifiée

Salut dacyrix et le forum
j'ai bien la solution de recopier le code en changeant les cellules
C'est une mise à jour par macro automatique, et tu n'as pas une idée précise du nombre de cellules à modifier => il faut que ta mise à jour je fasse sans données précises.

Petit rappel : on n'est ni télépathe, ni devin, et il est difficile de deviner le but d'une macro quand elle a un code bizarre (ce qu'est toujours un code que tu n'as pas créé)
Code:
Private Sub Worksheet_Calculate()
 If Range("A1").Value = valcel Then Else mymacro
 End Sub
Macro à lancement automatique lors du recalcul de la feuille (ça, je comprends).
Son fonctionnement me laisse perplexe. En littéral :si la valeur de A1 est égale à valcel, alors faire rien, sinon exécuter la macro Mymacro ??? Moi y en a pas parler même VBA que toi 😉.

valcel : variable non déclarée dans le classeur => Excel la définie à chaque lancement de la macro (à chaque calcul de la feuille) avec une valeur nulle. Pour ce que j'en comprends, une autre proposition qui fait la même chose :
Code:
Private Sub Worksheet_Calculate()
 If Range("A1") <>"" Then  mymacro
 End Sub
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Address = "$A$1" Then
     mymacro
 Else
     valcel = Range("A1").Value
 End If   
 End Sub
Macro se déclenchant à chaque sortie du mode "édition" de la feuille, en mettant dans la variable Target la/les cellule(s) "modifiées" => c'est effectivement celle qui faut utiliser.
If Target.Address = "$A$1" Then si la cellule modifiée a pour adresse A1 : comme A1 est une formule, un changement de son affichage ne lance pas la macro !
valcel = Range("A1").Value valcel est une variable qu'excel déclare au lancement de la macro, et qui est supprimée quand la macro finit => Avec ce que tu donne, ça ne sert strictement à rien !
Code:
Sub mymacro()
 Range("a1").Offset(0, 3) = Now
 End Sub
au lancement de la macro, on met la date et l'heure dans la cellule située à 3 colonne de A1, donc en D1

Code on ne peut plus étrange...

Ce que je crois comprendre :
S'il y a une formule en A1, que son affichage se modifie par une saisie en B ou en C, on met la valeur de D à Jour.
- S'il n'y a pas de mémorisation de la valeur de A, le dernier passage en mode édition d'une cellule de B ou de C mettra la cellule D à jour. (Si vous éditez B1 avec <F2> ou un double-clic, sa valeur ne sera pas modifiée, mais Excel la considérera comme ayant subi une modification).
À la place de toutes tes macros, tu mets ce code :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cel As Range 'déclaration de Cel comme cellule ou plage de cellules
Dim Plage As Range

Set Plage = Intersect(Target, [B:C])
'Plage = intersection entre target et les cellules de B et de C (Les cellules de B:C ayant été modifiées
If Plage Is Nothing Then Exit Sub
'si plage est vide, on arrête la macro
For Each Cel In Plage
'Pour chaque cellule de target
    If Cells(Cel.Row, "A").Formula Like "*+*" Then Range("D" & Cel.Row) = Now
    'Si la formule de A de la ligne de Cel contient un "+", alors mettre la date/heure en D
Next Cel
End Sub
La boucle For Each n'est là que pour éviter des erreurs en cas de copier/coller sur une sélection de plusieurs cellules.

- Si on ne veut que la date/heure d'un changement effectif de la valeur de A, il faut une mémorisation de la valeur de A à chaque sélection d'une cellule B ou C et faire intervenir une variable globale de type tableau, la macro SelectionChange pour la charger et utiliser la macro Change pour vérifier que la valeur de A ne correspond plus à celle mémorisée avant de mettre à jour D.
A+

Edit en me relisant, j'ai constaté certaines erreurs dans mon code et je l'ai donc réajusté
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

  • Question Question
XL 2021 Macro
Réponses
6
Affichages
309
Retour