Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 Logger les modifications faites sur un autre classeur

ThierryP

XLDnaute Occasionnel
Bonjour le forum,

Je voudrais logger les modifications faites sur un fichier ouvert par une macro depuis un autre fichier et que ce log soit enregistré dans le classeur appelant. Typiquement : Machin a modifié la cellule B4, valeur avant =xxx, valeur après: xxx.
Ayant un peu de mal à imaginer une solution "simple", pour l'instant je logge dans un .txt depuis le fichier appelé, puis je recopie le .txt sur une feuille du classeur appelant.

Si quelqu'un a une idée pour éviter de passer par un fichier intermédiaire sans devoir construire une usine à gaz, je suis preneur !
Merci d'avance à tout généreux contributeur

P.S. : je ne demande pas un produit tout fait prêt à l'emploi, juste un point de départ !!
 

xUpsilon

XLDnaute Accro
Bonjour,

Pour trigger un évènement à la modification, je dirais de passer par un évènement Worksheet_Change, sauf que celui-ci se déclenche une fois la modification constatée, ce qui veut dire que l'on perd les données d'avant la modification, on peut simplement constater le présent.

Bonne journée,
 

ThierryP

XLDnaute Occasionnel
Bonjour xUpsilon,

Merci de ton retour... mais je ne suis pas tout à fait d'accord avec toi : il suffit d'un Undo et hop on chope l'ancienne valeur !
Evidemment OK pour le Worksheet_Change.... mais celui-ci se déclenche dans le classeur appelé et du coup je viens d'avoir une idée (si,si ça m'arrive et le premier qui rigole attention à lui !) : si je passe les adresses des cellules, la valeur avant, la valeur après etc... dans un array, je dois pouvoir récupérer ça dans mon fichir appelant ?
 

xUpsilon

XLDnaute Accro
Re,

En fouillant un peu, j'ai trouvé une technique vraiment pas mauvaise pour éviter d'avoir à Undo : on peut avoir une macro liée à l'évènement SelectionChange, qui ne sert qu'à stocker une valeur tampon dans une variable publique. Ainsi, à chaque fois que l'on clique qqpart, cette valeur se stocke temporairement, jusqu'au prochain changement de sélection.
Donc on a la valeur avant d'y apporter la modification, celle-ci étant donc stockée/constatée à l'évènement Worksheet_Change.

J'ai du mal avec ta définition de "fichier appelant". Pour moi un fichier appelant c'est un fichier qui déclenche l'exécution de la macro. En l'occurrence pour utiliser Worksheet SelectionChange / Change, il faut que la macro soit stockée dans le fichier en cours de modification.
Mais sinon oui, on pourrait tout à fait stocker tout ça dans un array, ce serait d'ailleurs probablement la manière de procéder la moins lourde pour le système (dans un premier temps en tout cas). Ensuite, il faudrait définir à intervalles réguliers l'évènement qui déclenche la sauvegarde dans une autre base de données (une BDD Access par ex ?).

Bonne journée,
 

ThierryP

XLDnaute Occasionnel
Merci de continuer à t'intéresser à mon problème !!

Effectivement c'est bien mieux que le Undo, on ne risque plus de perdre la modif en cas de plantage !
Dans mon petit crâne, le fichier appelant est celui qui ouvre le classeur que l'on souhaite modifier.

De mon côté, j'ai commencé à pondre un truc, mais je bute sur un point !
Comment passe-t-on une variable d'un classeur à un autre ? Voilà où j'en suis rendu :
VB:
'Module standard
Public Tableau_Feuille() As Variant
'
'ThisWorbook
Private Sub Workbook_Open()
Dim Feuille As Worksheet

Set Feuille = Sheets(1)
Tableau_Feuille = Feuille.UsedRange
End Sub
'
'Feuille
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
Dim Log_Message As String
Dim Cible As Workbook

Set Cible = Workbooks("Classeur Log.xlsm")
For i = 1 To Target.Count
    If Target(i).Value <> Tableau_Feuille(Target(i).Row, Target(i).Column) Then
        Log_Message = Date & " " & Application.UserName & Target(i).Address _
        & Tableau_Feuille(Target(i).Row, Target(i).Column) & Target(i).Value
        Application.Run "Classeur Log.xlsm!Modif", Log_Message
        Tableau_Feuille(Target(i).Row, Target(i).Column) = Target(i).Value
    End If
Next
End Sub
Erreur sur la ligne Application.run.... : "Imposssible d'exécuter la macro etc... etc...". Pourtant d'après mes recherches sur le net, ça avait l'air d'être bon

Si tu as une idée....
 

ThierryP

XLDnaute Occasionnel
ça sent la fin de semaine, les neurones fatiguent...... Une demi-heure que je tourne en rond alors qu'il y avait juste une faute dans le nom de la macro

Merci de t'être penché sur mon souci !
Bon week-end,
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…