Suivi des modifications en VBA

Bonjour ,

Je cherche désespérément un code en VBA qui me permettrait d'avoir un suivi sur les modifications faites sur mon fichier dans l'entreprise où je suis. Je connais l'option de suivi des modifications déjà intégré à Excel mais celle-ci ne marche pas lorsque l'on a des macros...

J'ai trouvé un début de piste qui me convient assez bien :

Dim PreviousValue
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Value <> PreviousValue Then
Sheets("log").Cells(65000, 1).End(xlUp).Offset(1, 0).Value = _
Application.UserName & " a modifie la cellule " & Target.Address _
& " de " & PreviousValue & " en " & Target.Value & " a: " & Format(Time, "hh:mm:ss") & " le: " & Format(Date, "dd/mm/yy")
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
PreviousValue = Target.Value
End Sub

Mais le problème est que lorsque l'on souhaites insérer une ligne en plus, le code affiche une erreur. Il n'y a pas le nom de la page qui est inscrit dans la page "log" et il faudra que s'il on insère une ligne cela prenne en compte le fait que les modifications d'avant étaient en A1 par exemple, et qu'après elles devraient s'afficher en A2.

Une âme charitable a envie de relever ce défit ?

Bonjour,

Un simple test de combien de cellules modifiées ...

Ainsi, en ajoutant une ligne, ça ne bogue plus ...

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Count > 1 Then Exit Sub   ' << j'ai ajouté cette ligne
    If Target.Value <> PreviousValue Then
        Sheets("log").Cells(65000, 1).End(xlUp).Offset(1, 0).Value = _
        Application.UserName & " a modifie la cellule " & Target.Address _
            & " de " & PreviousValue & " en " & Target.Value & " À: " & _
            Format(Time, "hh:mm:ss") & " le: " & Format(Date, "dd/mm/yy")
    End If
End Sub

ric

Super, merci !

Et par contre maintenant il manque encore le nom de la page pour laquelle ça a été modifié, et.. également pour je ne sais quelle raison il manque toujours le mot qui à remplacer le nouveau.

Exemple : "Cédric Pillonel a modifie la cellule $A$1 de en mot2 À: 20:43:54 le: 28/05/20"

L'idéal serait donc : "Cédric Pillonel a modifié la cellule $A$1 de la page feuil1 de mot1 en mot2 à: 20:43:54 le: 28/05/20"

Quelque chose du genre du moins .

Et le petit truc encore en plus mais qui aurait beaucoup d'importance, c'est que si une ligne est rajouté manuellement dans la page feuil1 par exemple, que dans le fichier log ça décale le commentaire en conséquence, donc que ça noterait du $A$2

Bonjour,

... Et le petit truc encore en plus mais qui aurait beaucoup d'importance, c'est que si une ligne est rajouté manuellement dans la page feuil1 par exemple, que dans le fichier log ça décale le commentaire en conséquence, donc que ça noterait du $A$2

Oulà, Oulà, Oulà

Et dis-moi donc ... si par le plus grand des zhazards ... les informations d'un événement étaient séparées dans chacune leur cellule ... d'une ligne est-ce que ça serait envisageable ?

Car, fouiller dans les string pour modifier la ligne des cellules Oulà, Oulà, Oulà

Ça va prendre un meilleur que moi.

ric

Bonjour,

La partie log (standard) fonctionne bien.

Mais l'ajout de lignes complexifie la chose.

Et là ... je n'ose imaginer la suppression de lignes.

Puis, j'ai vu ton virus ( de la page feuil1 ) > vilain, il va falloir gérer l'insertion et la suppression de lignes avec incrémentation et décrémentation des adresses selon la feuille touchée.

Que vois-je à l'horison ??? ... ... Les colonnes

Une usine à gaz pour employer l'expression lue à maintes reprises.

En tout cas pour mon faible niveau.

ric

Bonjour,

Pour l'ajout de lignes ... je laisse tomber ... désolé.

L'action sur plusieurs feuilles ...

Place ce code dans "ThisWorkbook" ...

Le log va fonctionner sur toutes les feuilles ... sauf la feuille "log" bien sûr.

Dim PreviousValue
Dim x As Long

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    If Not StrComp(Sh.Name, "log", vbTextCompare) Then Exit Sub

    If Target.Count > 1 Then Exit Sub

    With Sheets("log").Cells(Rows.Count, 1).End(xlUp)

    '''            .Offset(1, 0).Value = Application.UserName & " a modifie la cellule "
        .Offset(1, 0).Value = Environ("UserName") & " a modifier la cellule "
        .Offset(1, 1).Value = Target.Address
        .Offset(1, 2).Value = " de la page " & ActiveSheet.Name & " ... de "
        .Offset(1, 3).Value = PreviousValue
        .Offset(1, 4).Value = " en "
        .Offset(1, 5).Value = Target.Value
        .Offset(1, 6).Value = " À:_  " & Format(Time, "hh:mm:ss") & "  le:_  " & Format(Date, "dd/mm/yy")
    End With
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If Sh.Name = "log" Then Exit Sub
    PreviousValue = Target.Value
End Sub

ric

Salut ric ,

Merci à toi pour ce superbe travail que tu as déjà fait pour moi !

Quelqu'un d'autre arriverais à compléter ce travail ?

J'ai remarqué au passage que si l'on effectue une sélection de cellule et que l'on les supprimes, cela ne note pas dans log. Je sais pas s'il est possible de faire quelque chose par rapport à ça également =/.

Salutations,

Cédric Pillonel.

Bonjour,

tu es bien au courant que ça oblige a appeler une macro sur chaque saisie, et que cela supprime toute possibilité d'annulation d'une action ?

Ca risque de ne pas plaire aux utilisateurs...

eric

Bonjour ric ,

Non je ne pensais pas que cela serait autant complexe à réaliser je dois dire .

Peut être que si je pose un peu plus le contexte vous auriez une autre idée :

J'ai plusieurs pages où les utilisateurs rentrent des données dans une plage de cellule défini à l'avance. Lorsque ceux-ci finissent de remplir les données, ils cliquent sur un bouton qui a pour but d'insérer de nouvelles lignes (copier depuis une page template) au dessus des précédentes pour ainsi insérer de nouvelles données et avoir un ordre chronologique sur la page.

Mon but est uniquement de savoir qui a entré quoi, quand, et où, et s'il y a eu des modifications qu'est-ce qu'il y avait avant.

Après avoir écrit toutes ces lignes, je me suis demandé s'il était pas peut être plus simple (si réalisable) de simplement ajouté l'utilisateur avant et après la saisie (dans le cas où il y aurait déjà une donnée entrée auparavant). Ainsi, cela me permettrait de savoir qui a entré les données et si elles ont été effacés par qui.

J'espère que cela peut aider

Tu n'as pas répondu à principale la question : les utilisateurs accepteront-ils de ne plus pouvoir faire Ctrl+z ou Annuler ?

Si c'est rédhibitoire il faut changer tes plans.

eric

Les utilisateurs accepteront de ne plus pouvoir le faire 🤗.

Par contre ils doivent continuer de pouvoir remodifier leurs saisies même s'ils sauront que ce changement sera notifié.

Rechercher des sujets similaires à "suivi modifications vba"