Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
Lancer une macro qd la valeur d'une cellule est modifiée
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
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.
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é
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.