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 SubEdit 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.
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 SubBonjour,
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