Microsoft 365 Copier coller une cellule avant qu'elle ne soit modifiée par Sub Worksheet_Change(ByVal Target As Range)

pat66

XLDnaute Impliqué
Bonjour le forum,

avec la procédure Sub Worksheet_Change(ByVal Target As Range), existe t'il un moyen de copier une valeur avant qu'elle ne soit modifiée par Sub Worksheet_Change(ByVal Target As Range) et coller cette valeur dans une autre cellule

merci
 
Dernière édition:
Solution
Je vous donne encore ça, et je m'arrête là.
VB:
Option Explicit
Private SvgVal
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If Target.Address <> "$BV$28" Then Exit Sub
   If IsEmpty(Target.Value) Then SvgVal = Me.[AN33].Value Else SvgVal = Null
   End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Address <> "$BV$28" Or IsEmpty(Target.Value) Or IsNull(SvgVal) Then Exit Sub
   Me.[AO25:AO27].Value = SvgVal
   End Sub

Dranreb

XLDnaute Barbatruc
Bonjour.
Non, c'est trop tard.
Ce que vous pouvez faire c'est une Sub Worksheet_SelectionChange(ByVal Target As Range) qui note la valeur de la cellule dans une variable globale pour pouvoir l'affecter à la valeur de l'autre cellule lors de la Sub Worksheet_Change.
 

pat66

XLDnaute Impliqué
re,

j' ai bien essayé mais mes connaissance sont très limités, pourriez me donner un coup de main svp

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$BV$28" Then ' correspond à la cellule ou saisir une valeur
SvgVal = ("AN33") ' la valeur à mémoriser
SvgVal = Copy
Range("AG64").Value = SvgVal ' la cellule où coller la valeur mémorisée, mais peut que le préciser dans Worksheet_Change suffit ?
End If
End Sub

merci
 

Dranreb

XLDnaute Barbatruc
La valeur à mémoriser, n'est-ce pas Target.Value d'après ce que j'avais compris ?
La WorkSheet_Change c'est l'autre procédure où vous faites le contraire : Target.Value = SvgVal
N'oubliez pas de la déclarer en tête du module, avant toute procédure, pour qu'elle soit connue et partagée par toutes celles du module.
 

pat66

XLDnaute Impliqué
bonjour,

effectivement c'est dans la cellule BV28 que l'on saisit une valeur et c'est la cellule AN33 qui est à mémoriser avant La WorkSheet_Change et a coller dans AO25:AO27 car après la saisie dans BV28, AN33 changera de valeur
Précision : les valeurs dans AN33 sont des moyennes qui peuvent être modifiées par la valeur saisie dans BV28

merci
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Ça ne correspond plus à ce que vous décriviez au début, et ça a même changé par rapport à votre poste #5.
Si ce n'est pas gênant de verser la valeur de AN33 même si la BV28 ne change pas, vous pouvez tout faire dans la Sub Workshet_SelectionChange :
VB:
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If Target.Address = "$BV$28" Then Me.[AG64].Value = Me.[AN33].Value  ' selon poste #5
   If Target.Address = "$BV$28" Then Me.[AO25:AO27].Value = Me.[AN33].Value ' selon poste #7
   End Sub
Sinon il faut la mémoriser et l'appliquer dans la Sub Worksheet_Change
VB:
Option Explicit
Private SvgVal ' Pour qu'elle soit connue dans les deux procédures
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If Target.Address = "$BV$28" Then SvgVal = Me.[AN33].Value
   End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Address = "$BV$28" Then Me.[AG64].Value = SvgVal ' selon poste #5
   If Target.Address = "$BV$28" Then Me.[AO25:AO27].Value = SvgVal ' selon poste #7
   End Sub
 
Dernière édition:

pat66

XLDnaute Impliqué
re,

oui, c'est gênant de verser la valeur de AN33 si VB28 = ""

en tout cas merci pour toutes ces précisions, mais je capitule, cela dépasse mes connaissances et je ne veux pas vous faire perdre votre temps

bonne journée
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Vous parlez de AN3 maintenant et plus de AN33 ?
Si ce n'est pas gênant de la verser même si la BV28 ne sera pas changée à condition qu'elle soit renseignée, vous pouvez le faire dans la Sub Worksheet_SelectionChange
Mais la plage destinatrice c'est AG64 ou AO25:AO27 ?
Notez que vous pouvez aussi systématiquement la copier dans AG64, et aussi dans AO25:AO27 mais là seulement après qu'elle ait changé :
VB:
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If Target.Address <> "$BV$28" Then Exit Sub
   Me.[AG64].Value = Me.[AN33].Value
   End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Address <> "$BV$28" Then Exit Sub
   Me.[AO25:AO27].Value = Me.[AG64].Value
   End Sub
 
Dernière édition:

pat66

XLDnaute Impliqué
re,

je viens de voir votre solution, un grand merci pour votre aide, j'ai un peu d'espoir grâce à vous

la plage destinatrice c'est bien AO25:AO27

sinon j'ai testé votre macro, c'est presque ça, il y a juste une correction, à savoir :
SI BV28 = "", la moyenne est de AN33 = 178 dans mes calculs

si on saisit une valeur dans BV28, tout est ok, la valeur de AN33 (178) est bien collée dans AO25:AO27, mais si on vide BV28, AO25:AO27 doit être toujours de 178
dans l'exemple ci dessous, si je vide BV28, on colle 70 dans AO25:AO27 au lieu de 178

merci beaucoup

VB:
Option Explicit
Private SvgVal ' Pour qu'elle soit connue dans les deux procédures
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If Target.Address = "$BV$28" Then SvgVal = Me.[AN33].Value
   End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Address = "$BV$28" Then Me.[AO25:AO27].Value = SvgVal ' selon poste #7
   End Sub
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
C'est ce que fait le code, non ?
Dans la Sub Worksheet_SelectionChange on sauvegarde SvgVal = 70 puisque BV28 <> "",
et Dans la Sub Worksheet_Change on fait donc Me.[AO25:AO27].Value = 70 qui est la valeur sauvegardée.
Ça ne dit toujours pas s'il serait gênant que AO25:AO27 soit renseigne de la valeur de AN33 lors de la sélection de BV28 même si on ne la changera pas en fin de compte.
 

pat66

XLDnaute Impliqué
re,

oui je pense que ce serait gênant que AO25:AO27 soit renseigné de la valeur de AN33 lors de la sélection de BV28 même si on ne la changera pas en fin de compte. "

sachant que BV28 soit vide ou renseigné AO25:AO27 est toujours = AN33

une capture d'écran qui image selon que BV28 soit vide ou renseigné

merci
 

Pièces jointes

  • Capture d'écran 2023-09-29 104731.png
    Capture d'écran 2023-09-29 104731.png
    36.1 KB · Affichages: 10
  • Capture d'écran 2023-09-29 104841.png
    Capture d'écran 2023-09-29 104841.png
    41.7 KB · Affichages: 10

Dranreb

XLDnaute Barbatruc
Pourquoi n'avoir pas joint le classeur plutôt que des images ?
Ah vous dites AO25:AO27 doivent conserver leur valeur actuelle dans le cas particulier où on vide la BV28.
alors :
VB:
Option Explicit
Private SvgVal
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If Target.Address <> "$BV$28" Then Exit Sub
   SvgVal = Me.[AN33].Value
   End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Address <> "$BV$28" Then Exit Sub
   If Not IsEmpty(Target.Value) Then Me.[AO25:AO27].Value = SvgVal
   End Sub
Mais si au lieu de la vider on change sa valeur if faut bien toujours reprendre la valeur précédente, n'est-ce pas ? Parce que si la valeur de AN33 n'a d'intérêt que si BV28 est vide il faut encore faire autrement …
 

pat66

XLDnaute Impliqué
parce que le classeur original contient 75 pages

la macro du post précédent n'affiche le bon résultat qu'une fois sur deux, voir exemple sur la capture ci dessous

les 178 venant de AN33 devraient être dans toutes les lignes puisque BV28 est vide
 

Pièces jointes

  • Capture d'écran 2023-09-29 111231.png
    Capture d'écran 2023-09-29 111231.png
    32.5 KB · Affichages: 9

Discussions similaires

Statistiques des forums

Discussions
314 711
Messages
2 112 125
Membres
111 430
dernier inscrit
rebmania67