Enregistrement des modifications (ou logging en anglais)

Bonjour,

Vous (et en particulier Jean_Eric que je remercie) m'avez fait découvrir l'intérêt de "Power Query".

Le petit développement VBA suivant enregistre dans une feuille unique ( ici nommée "log") les modifications réalisées dans les autres feuilles. Voici ce code qui fonctionnait (sauf qu'il ne pouvait pas gérer des modifications sur des plages/groupe de cellules).

Dim PreviousValuePrivate

Sub Worksheet_Change(ByVal Target As Range)

Dim i As Long
Dim ws As Worksheet

Set ws = Sheets("log")

i = ws.Range("A" & Rows.Count).End(xlUp).Row + 1

If Target.Value <> PreviousValue Then
With ws
.Range("A" & i).Value = ActiveSheet.Name
.Range("B" & i).Value = Cells(Target.Row, 3)
.Range("C" & i).Value = Format(Now(), "dd/mm/yyyy, hh:mm:ss")
.Range("D" & i).Value = Application.UserName
.Range("E" & i).Value = Cells(1, Target.Column)
.Range("F" & i).Value = Target.Address
.Range("G" & i).Value = PreviousValue
.Range("H" & i).Value = Target.Value
End With
End If

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
PreviousValue = Target.Value
End Sub

Edit modo : merci de mettre le code entre balises grâce au bouton </>

Pour mieux exploiter (via Power Query) les infos collectées dans la feuille "log", j'ai transformer la plage en table .... et le code VBA ne semble plus fonctionner.

Si j'osais un diagnostic, je dirais que cela est normal, car l'adressage d'une cellule est différent dans une plage que dans une table ....

Je crois que je devrais remplacer les adressages par quelque chose de la forme de "ActiveSheet.ListObjects("LogData").DataBodyRange(3, 2) ....

Voici mes deux questions ....

1) Peut-être pourriez-vous me recommander une façon plus élégante pour "logger" les changements dans certaines feuilles ...

2) Si mon code est correct, que dois-je modifier pour gérer la transition entre plage et table ?

Merci pour vos avis !

Marc

Bonjour,

Joins un fichier à ta demande pour une aide adaptée du forum.

Cdlt.

Bonjour,

Une réponse ?

Cdlt.

8ml62.xlsm (18.15 Ko)
Option Explicit

Dim PreviousValue, bln As Boolean

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.CountLarge > 1 Then
        MsgBox "Veuillez sélectionner une unique cellule !...", 64, "Information"
        bln = False
    Else
        PreviousValue = Target.Value
        bln = True
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lo As ListObject, rCell As Range, arr(7)
    If bln = True Then
        If Target.Value <> PreviousValue Then
            Set lo = Worksheets("Log").Range("T_Log").ListObject
            With lo
                If .InsertRowRange Is Nothing Then
                    Set rCell = .HeaderRowRange.Cells(1).Offset(.ListRows.Count + 1)
                Else
                    Set rCell = .InsertRowRange.Cells(1)
                End If
            End With
            arr(0) = ActiveSheet.Name
            arr(1) = Cells(Target.Row, 3)
            arr(2) = Format(Now(), "dd/mm/yyyy, hh:mm:ss")
            arr(3) = Application.UserName
            arr(4) = Cells(1, Target.Column)
            arr(5) = Target.Address
            arr(6) = PreviousValue
            arr(7) = Target.Value
            rCell.Resize(, 8) = arr
        End If
    End If
End Sub

Bonjour,

Mes remerciements à Jean-Eric. L'exemple est parfait.

Une question supplémentaire pour implémenter ce code dans mon contexte , j'avais créé une table 'log'!$A$2:$J$5000 et bien entendu le premier insert se place en 5001 ...

J'ai pu redimensionner la table ( via Table Design / Rezize Table ) avec la valeur =$A$1:$J$978 mais la macro se termine avec une erreur "Run Time error 9, Subscript out of range .... Quelque chose m'échappe dans la création des tables.

J'aimerai conserver l'ancien contenu de cette table .... si possible !

Comment faire ?

Merci

Marc

Rechercher des sujets similaires à "enregistrement modifications logging anglais"