vba suivi modifs

s.blancou

XLDnaute Nouveau
Bonjour!
Après quelques heures de recherches vaines, je viens profiter de vos talents:

Pour résumer, j'aimerais le code :
Si une cellule en A est modifiée, alors récup ancienne valeur de A dans la cellule B même ligne.

J'en suis là:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
ActiveSheet.Cells(Target.Row, "B").Value = Target.Value
End If
End Sub

Petit problème supplémentaire: la fameuse "erreur de frappe"...
Si la personne se trompe dans la saisie de la nouvelle valeur, la valeur récupérée ne sera plus la bonne
ex:
> l'attendu:
A1 = "01.01.2009", doit être modifiée en "01.01.2010", et récupération de "01.01.2009" en B1
> l'erreur:
saisie en A1 = "01.05.2010" > B1 = "01.01.2009"
correction en A1 = "01.01.2010" > B1 = "01.05.2010"

Ou bien quelqu'un a-t-il le code vba de l'option "suivi des modifications" dans les Outils qui serait modifiable (remplacer le commentaire par une plage de cellules)?

Merci beaucoup à ceux qui prendront le temps de m'aider
 

job75

XLDnaute Barbatruc
Re : vba suivi modifs

Bonjour s.blancou,

Pour récupérer l'ancienne valeur, 2 solutions :

1) récupérer cette valeur par une macro SelectionChange et la mémoriser dans une variable déclarée en haut de la feuille,

2) dans la macro Change, utiliser Application.Undo (2 fois) couplé avec Application.EnableEvents = False puis True.

Bon courage, et revenez si vous n'y arrivez pas.

A+
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : vba suivi modifs

Bonjour,

-Mémoriser l'ancienne valeur dans une variable avec selection_change() ne fonctionne pas à l'ouverture du classeur si le curseur est déjà positionné sur la valeur à modifier.
-Sur l'exemple ci dessous, la valeur actuelle est mémorisée dans un nom(mémo) . Cette valeur est sauvegardée avec le classeur, donc disponible à l'ouverture.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Column = 1 And Target.Count = 1 Then
     Application.EnableEvents = False
     Target.Offset(0, 1) = [mémo]
     Application.EnableEvents = True
 End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Column = 1 And Target.Count = 1 Then
    ActiveWorkbook.Names.Add Name:="mémo", RefersToR1C1:="=" & Chr(34) & Target.Value & Chr(34)
  End If
End Sub

http://boisgontierjacques.free.fr/fichiers/Evenementiel/WorkSheetChangeEvolution.xls

JB
 
Dernière édition:

s.blancou

XLDnaute Nouveau
Re : vba suivi modifs

Bonjour s.blancou,

Pour récupérer l'ancienne valeur, 2 solutions :

1) récupérer cette valeur par une macro SelectionChange et la mémoriser dans une variable déclarée en haut de la feuille,

2) dans la macro Change, utiliser Application.Undo (2 fois) couplé avec Application.EnableEvents = False puis True.

Bon courage, et revenez si vous n'y arrivez pas.

A+
Je n'y arrive pas!!:(
 

job75

XLDnaute Barbatruc
Re : vba suivi modifs

Bonjour s.blancou, salut JB,

Prenez la solution de Jacques Boisgontier, elle est meilleure, et il n'y a plus qu'à mettre les 2 macros dans le code de la feuille (clic droit sur l'onglet et Visualiser le code).

A+
 

s.blancou

XLDnaute Nouveau
Re : vba suivi modifs

Bonjour,

-Mémoriser l'ancienne valeur dans une variable avec selection_change() ne fonctionne pas à l'ouverture du classeur si le curseur est déjà positionné sur la valeur à modifier.
-Sur l'exemple ci dessous, la valeur actuelle est mémorisée dans un nom(mémo) . Cette valeur est sauvegardée avec le classeur, donc disponible à l'ouverture.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Column = 1 And Target.Count = 1 Then
     Application.EnableEvents = False
     Target.Offset(0, 1) = [mémo]
     Application.EnableEvents = True
 End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Column = 1 And Target.Count = 1 Then
    ActiveWorkbook.Names.Add Name:="mémo", RefersToR1C1:="=" & Chr(34) & Target.Value & Chr(34)
  End If
End Sub

http://boisgontierjacques.free.fr/fichiers/Evenementiel/WorkSheetChangeEvolution.xls

JB

Merci beaucoup JB, ça fonctionne effectivement au top!
mon problème additif: je crains que l'utilisateur ne se trompe dans la saisie... et il ne me faut récupérer que la 1ère ancienne valeur.
En fait il faudrait figer la cellule B1 dès qu'elle a pris en compte la modification (quelque soit ensuite la/les valeur /s saisie/s en A1) pour garder la valeur d'origine de la case A1
 

job75

XLDnaute Barbatruc
Re : vba suivi modifs

Rebonjour s.blancou,

Cela paraît tout bête :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column > 1 Or Target.Count > 1 Then Exit Sub
If Target.Offset(, 1) <> "" Then Exit Sub
Target.Offset(0, 1) = Target
End Sub

Evidemment la colonne B doit être vide à l'origine...

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : vba suivi modifs

Re,

Il y aurait aussi ça, qui évite de revalider toutes les 1ères valeurs en colonne A :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column > 1 Or Target.Count > 1 Then Exit Sub
If Target.Offset(, 1) <> "" Then Exit Sub
Dim valprem As Variant
Application.EnableEvents = False
Application.Undo
valprem = Target
Application.Undo
Target.Offset(0, 1) = valprem
Application.EnableEvents = True
End Sub

A+
 

s.blancou

XLDnaute Nouveau
Re : vba suivi modifs

Job, c'est parfait :) un immense merci!

Je n'ose en profiter, mais quand même... question:

j'ai en I7 la formule suivante: =si(estvide($B7);"";si(et(recherchev($b7;bddetablissement;17;faux)="we et feries";ou(joursem(i$5)=1;joursem(i$5)=7));"X";si(ou(et($g7>0;$g7<i$5);(i$5<$f7));"F";si(ou(et($h7>0;$h7<=i$5);($h7="en attente"));"EA";""))))

bref. est-il possible de créer un bouton "maj formules" qui permettrait automatiquement de copier cette formule dans la plage I7:AM160 ?

faut que je me forme en vba, je suis nulle... autant que les fonctions si :(
 

job75

XLDnaute Barbatruc
Re : vba suivi modifs

Re,

Vous avez bien raison d'en profiter, surtout quand ça ne prend pas trop de temps :)

N'oubliez pas que dans une feuille il ne peut y avoir qu'une macro Worksheet_Change, donc :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False

If Not Intersect(Target, Range("I7:AM160")) Is Nothing Then _
Range("I7:AM160").FormulaR1C1 = _
"=IF(ISBLANK(RC2),"""",IF(AND(VLOOKUP(RC2,bddetablissement,17,FALSE)=""we et feries"",OR(WEEKDAY(R5C)=1,WEEKDAY(R5C)=7)),""X"",IF( OR(AND(RC7>0,RC7<R5C),(R5C<RC6)),""F"",IF(OR(AND(RC8>0,RC8<=R5C),(RC8=""en attente"")),""EA"",""""))))"

If Target.Column > 1 Or Target.Count > 1 Then GoTo 1
If Target.Offset(, 1) <> "" Then GoTo 1
Dim valprem As Variant
Application.Undo
valprem = Target
Application.Undo
Target.Offset(0, 1) = valprem

1 Application.EnableEvents = True
End Sub

A+
 
Dernière édition:

Discussions similaires

Réponses
7
Affichages
360
Réponses
1
Affichages
613
Réponses
2
Affichages
952

Statistiques des forums

Discussions
312 505
Messages
2 089 070
Membres
104 017
dernier inscrit
annboi19