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

dacyrix

XLDnaute Nouveau
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

  • Classeur1.xlsm
    15 KB · Affichages: 189
  • Classeur1.xlsm
    15 KB · Affichages: 221
  • Classeur1.xlsm
    15 KB · Affichages: 238

Papou-net

XLDnaute Barbatruc
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

  • dacyrix.xlsm
    13.9 KB · Affichages: 385

Gorfael

XLDnaute Barbatruc
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:

Discussions similaires

Statistiques des forums

Discussions
312 632
Messages
2 090 337
Membres
104 507
dernier inscrit
mag7748