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.
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 !
Bonjour,
Je voudrai savoir comment je pourrai suivre les modifications d'une cellule en inscrivant dans une autre cellule la date de la dernière modification.
Mon objectif est de suivre les modifications faites par plusieurs utilisateurs dans un fichier partagé contenant des données financières.
Je suis conscient de ne pas être très clair, et veuillez donc excuser mon inexpérience.
Bonjour Richard,
Je te propose un fichier de JB BOIGONTIER que j'avais trouvé déjà il y a quelque temps sur le site d'Excellabo (Ce lien n'existe plus. Ce dernier devrait te permettre d'avancer un peu car il liste toutes les modifications d'une plage de cellule définie. Voilà à adapter à tes besoins.
Bonne journée.
voici en Pièce jointe, une solution faisant appel à des procédures événementielles. ( pour stocker la valeur initiale puis si il y a modif, générer un rapport de suivi sur une autre feuille).
A + Luc
Edition!!!
je viens de voir la solution proposée par Criscris, c'est la même approche, très intéressante en commentaire. Tout dépend si les modifications doivent être visibles à l'utilisateur.
Je vous remercie encore mais le problème c'est mon niveau en excel.
Disons que je suis un utilisateur ordinaire. Au mieux je gère des tdc avec des calculs de base.
Donc je ne sais pas coder ni intégrer les macros que vous avez eu la gentillesse de me communiquer. C'est très mystérieux pour moi même si j'ai su faire fonctionner les feuilles de calcul envoyées.
A part me former plus avant, je ne sais donc pas comment intégrer ces solutions.
Merci quand même.
richard
Salut Richard,
Je pense que si tu postes ton fichier ou une partie tout du moins, on pourra jetter un coup d'oeil et peut-être intégrer l'une deux deux solutions. Je ne dis pas que c'est moi qui le ferais car je n'est pas un niveau très haut en VBA mais sur ce forum il y en a d'autres qui maîtrisent comme des dieux. Alors fais comme tu veux, mais moi je n'hésiterais pas un seul instant.
Bonne journée.
Si c'est mystérieux et que ça marche, c'est que c'est bien programmé!
Quelques explications sur le fichier que je t'ai joint et comment l'utiliser:
- Dans la feuille 1, j'ai nommé la plage de cellules encadrées "ListeA", seules les cellules de cette plage seront prisent en compte.
- Dans le module de code de cette feuille se trouvent les macros, qui vont réagir auévénements qui se passent dans cette feuille et uniquement dans celle-ci.
- pour accéder à ce code : ALT+F11 pour ouvrir l'éditeur VBA puis dans l'explorateur de projets, double clic sur "feuil1"
- 2 variables sont déclarées au niveau module ( avant les macros) pour utilisables par les 2 macros.
-Il y a 2 macro. La première réagit lorsque la sélection change dans la feuille :
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
- la deuxième réagit lorsque tu saisis quelque chose dans une cellule:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Pour voir ce qui se passe, ajoute un point d'arrêt au début de chaque macro ( clic gauche dans la barre verticale grise à gauche du code). Au moment ou elle se déclenchent, elle vont s'arrêter dessus. Tu pourras continuer leur exécutions en pas à pas avec la touche F8.
Ci dessous le code complet du module "Feuille1":
Code:
Option Explicit
Dim RgCible As Range 'variable qui sert à stocker la plage qui est prise en compte
Dim OldValue As Variant ' Variable servant à stocker provisoirement la valeur de la cellule sélectionée
' cette macro réagit en premier et stocke la valeur de la cellule si elle est dans la plage voulue
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set RgCible = Range("ListeA") ' Affecte la plage qui doit être prise en compte à la variable
If Not Intersect(RgCible, Target) Is Nothing Then OldValue = Target.Value ' si la sélection est dans la plage voule, la valeur de la cellule est stockée dans une variable.
End Sub
' cette macro réagit ensuite et si la valeur de la cellule change, récupère la valeur stockée pour l'écrire dans la feuille de rapport.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim WksRapport As Worksheet ' variable pour stocker une feuille
Dim Li As Long ' variable pour stocker une valeur numérique de type long
Set WksRapport = Worksheets(2) 'affecte la feuille "rapport" à la variable
If Not Intersect(RgCible, Target) Is Nothing Then ' si l'intersection de la plage choisie et de la cellule sélectionée (Target) ne donne rien, la macro passe
'à la suite ( directement à End if) sinon execute le code si dessous.
With WksRapport
Li = .Range("A65536").End(xlUp).Row + 1 'cherche la dernière ligne utilisée dans la feuille rapport pour ecrire à la suite
.Cells(Li, 1) = Target.Address ' ecrit l'adresse de la cellule
.Cells(Li, 2) = OldValue ' écrit l'ancienne valeur
.Cells(Li, 3) = Target.Value ' écrit la nouvelle valeur
.Cells(Li, 4) = Now 'écrit la date
End With
End If
End Sub
Je reposte le fichier avec ses commentairespour que tu puisse faire des essais. Dis moi si tu comprends tout!
Merci encore à tous, et en particulier à LUKI
Je suis arrivé à transférer la macro dans un fichier d'essai et à la faire fonctionné.
Comme je ne connais le code et son vocabulaire une dernière question comment puis-je affecter le rapport à un autre fichier ?
Merci bien
Richard
Bien sûr que l'on peut générer le rapport dans un autre fichier. Toutefois, j'attire ton attention sur le fait que ça implique de gérer pas mal de paramètres: le fichier est -il ouvert?, existe-il ?, se trouve-il sur un serveur?, sur ce poste? Qui a le droit de l'ouvrir? etc.... Tout ça peut-être fait, mais, si tu débutes en VBA, celà peut vite devenir difficile à gérer.
Si tu pouvais préciser la finalité de ton projet, ça permettrait de chercher les solutions les plus adaptées à ton besoin et à ton niveau en VBA. Par exemple, simplement une feuille cachée dans ton classeur....
Effectivement je pense qu'il vaut mieux rester modeste.
Donc j'opterai pour la solution de cacher la feuille afin d'éviter les interventions de groupe sur une base partagée.
Mon objectif est de suivre des modifications comme y répond ton programme afin d'identifier l'origine de certaines évolutions budgétaires dans un ensemble. D'une façon générale, un reprérage assez grossier -la modification d'une cellule- doit suffire.
Donc je m'en tiendrai à ta proposition de masquer la feuille, et je t'en remercie d'avance.
J'en profite, et j'abuse, si je trouve le temps, à partir de quoi je pourrai m'initier à la programmation sous excel.
Encore merci.
j'utilise le code suivant pour avoir un commentaire dès qu'il y a un changement d'une range
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Target.Column <> 0 Then
On Error Resume Next
Err = 0
temp = Target.Comment.Text
If Err <> 0 Then Target.AddComment
Target.Comment.Text Text:=Target.Comment.Text & _
Target.Value & " Modifié par:" & NomUtil() & _
" Le " & Now & vbLf
Target.Comment.Visible = True
Target.Comment.Shape.Select
Selection.AutoSize = True
Target.Comment.Visible = False
On Error GoTo 0
End If
Application.EnableEvents = True
End Sub
je voudrais utiliser ce même code sous Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'met un commentaire directement si on clique ou on va avec le curser sur une range
mais uniquement avec la condition que s'îl y a couleur de fond mis,
qu'est affiché l'historique de changement dans commentaire,
sinon si on clique quelque part, y figure déjà un commentaire,
- 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.