La combinaison de VBA et d'Excel permet d'enregistrer le suivi d'utilisation de vos fichiers dans un ou multiples fichiers journaux (fichiers texte). Ceci peut être intéressant de point de vue de sécurité, de statistiques (par ex. des statistiques d'utilisation) ou de débogage. Cette fonctionnalité n'est pas, comme on pourrait le croire, réservée à des "vraies" langages de programmation comme Java ou .NET. On peut même parler d'un exemple typique de "sous-utilisation d'Excel/VBA par sa sous-estimation"…
Et pourtant: VBA est capable de faire bien plus que ce que la plupart des utilisateurs imaginent!
Dans ce tutoriel, vous trouverez tout ce qui est nécessaire pour créer un fichier journal ("log file") pour suivre l'activité des utilisateurs.
Sommaire
- Étape 1: Analyse de la situation – le but du log
- Étape 2: Choix du type de fichier journal
- Étape 3: le code VBA à utiliser pour loguer les actions
- Étape 4: des exemples pratiques d'utilisation du fichier journal
- Étape 5: le fichier démo (fichier Excel contenant le code VBA et les explications)
- Pour aller plus loin en VBA…
Étape 1: Analyse de la situation – le but du log
Avant de commencer, il est très important d'analyser la situation que nous voulons suivre. Comme c'est le cas pour la programmation en générale, plus l'analyse de départ est complète, plus rapide est le développement et plus sûre sera l'utilisation finale.
Avant de commencer une procédure qui permettra le suivi de l'utilisation, posez-vous les questions suivantes:
- le fichier à suivre/surveiller sera-t-il utilisé par plusieurs utilisateurs différents?
- les utilisateurs ont-ils les mêmes droits?
- quelles sont les actions que vous voulez enregistrer? Ouverture / modification / … ?
- l'utilisateur est-il censé savoir que l'utilisation du fichier est suivie?
- où sera/seront stocké(s) le(s) fichier(s) de suivi (les "logs")? S'agira-t-il d'un emplacement fixe ou une partie de chemin sera-t-elle variable?
- …
Étape 2: Choix du type de fichier journal
Le fichier journal (log) se présente généralement sous forme d'un fichier texte. Ceci a plusieurs avantages comme une taille de fichier réduite et la rapidité de son utilisation qui en découle. La création des fichiers journaux est, dans la plupart des cas une fonctionnalité "secondaire" et ne devrait donc pas ralentir la fonctionnalité principale du fichier Excel ou d'une application de manière générale.
Un autre avantage de fichier texte est qu'il est possible de lui attribuer n'importe quelle suffixe sans que cela modifie son fonctionnement (à vous de choisir si vos fichiers porteront le suffixe habituel ".txt", plus explicite ".log" ou toute autre suffixe comme par exemple ".abc123").
Autre paramètre à définir est le caractère qui sera utilisé comme séparateur de différentes parties du fichier – vous pouvez opter pour la virgule (,), le point-virgule (;) ou pour toute autre signe qui ne risque pas d'apparaître dans l'information même qui sera inscrite dans le fichier journal.
Enfin, une information primordiale est la manière d'utiliser le fichier journal. Il y aura:
- un seul fichier log pour toutes les actions et tous les utilisateurs?
- un fichier journal par utilisateur?
- chaque action aura-t-elle un fichier journal (chaque "log" est un fichier séparé)?
- un fichier log par jour (la date fait partie du nom de fichier)?
- …
Ceci va déterminer de quel code VBA nous aurons besoin. De manière générale, nous aurons besoin du code générique pour manipuler les fichiers texte (création d'un fichier texte, ajout des données au fichier existant) et du code spécifique pour déterminer quelle information sera stockée.
Le plus simple est de créer une fonction séparée à laquelle on fera appel dans le code principal de votre fichier. Cela évitera de répéter inutilement le même code. Cette fonction peut avoir comme argument le contenu du log ainsi que (en cas des multiples fichiers log) le chemin vers le fichier journal.
Étape 3: le code VBA à utiliser pour loguer les actions
Pour créer la procédure du suivi d'utilisation (log), nous aurons besoin des codes VBA qui suivent. Attention, pour qu'ils fonctionnent correctement, vous devez activer la Référence Microsoft Scripting Runtime
(dans l'éditeur VBA: Outils -> Références -> cocher "Microsoft Scripting Runtime").
a) Code VBA pour créer un fichier texte
Cette fonction qui crée un nouveau fichier texte utilise 2 arguments – le chemin & le nom du fichier et le contenu du fichier. Ces deux arguments sont de type String
.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Public Function SauvegarderChaineCommeFichierTexte(Contenu As String, CheminFichier As String) 'par Excel-Malin.com ( https://excel-malin.com ) Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") Dim oFile As Object Set oFile = FSO.CreateTextFile(CheminFichier) oFile.WriteLine Contenu oFile.Close Set FSO = Nothing Set oFile = Nothing End Function |
b) Code VBA pour ajouter du texte à un fichier existant
La fonction suivante ajoute une ligne de texte à un fichier texte existant. Ce code sera nécessaire si l'on opte pour la possibilité d'un fichier journal commun. Egalement cette fonction utilise deux arguments – le chemin & nom du fichier auquel on doit ajouter du contenu ainsi que le contenu à ajouter. Les deux arguments sont de type String
.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Public Function AjouterAuFichierTexte(ContenuAAjouter As String, CheminFichier As String) 'par Excel-Malin.com ( https://excel-malin.com ) Dim oFSO As FileSystemObject Set oFSO = New FileSystemObject Dim oFS As TextStream Set oFS = oFSO.OpenTextFile(CheminFichier, ForAppending) oFS.WriteLine ContenuAAjouter oFS.Close Set oFS = Nothing Set oFSO = Nothing End Function |
c) Code de la fonction VBA à utiliser pour enregistrer une action dans le fichier journal
Le code avec le chemin et nom du fichier journal fixes (et qui est donc inclus directement dans le code):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Function EnregistrerAction(ActionNom As String) Dim CheminCompletFichierJournal As String Dim ContenuEnregistrement As String CheminCompletFichierJournal = "C:\DossierLog\FichierLog.txt" 'création du contenu à enregistrer ContenuEnregistrement = ActionNom 'vérifier si le fichier journal existe déjà & enregistrer l'information VerificationFichierJournal = Len(Dir(CheminCompletFichierJournal)) If VerificationFichierJournal = 0 Then 's'il n'existe pas encore -> créer un nouveau LogResult = SauvegarderChaineCommeFichierTexte(ContenuEnregistrement, CheminCompletFichierJournal) Else 's'il existe -> ajouter la nouvelle ligne LogResult = AjouterAuFichierTexte(ContenuEnregistrement, CheminCompletFichierJournal) End If End Function |
Le code avec le chemin/nom du fichier journal variables qui est utilisé en tant qu'argument de la fonction:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Function EnregistrerAction(ActionNom As String, CheminCompletFichierJournal As String) Dim ContenuEnregistrement As String 'création du contenu à enregistrer ContenuEnregistrement = ActionNom 'vérifier si le fichier journal existe déjà & enregistrer l'information VerificationFichierJournal = Len(Dir(CheminCompletFichierJournal)) If VerificationFichierJournal = 0 Then 's'il n'existe pas encore -> créer un nouveau LogResult = SauvegarderChaineCommeFichierTexte(ContenuEnregistrement, CheminCompletFichierJournal) Else 's'il existe -> ajouter la nouvelle ligne LogResult = AjouterAuFichierTexte(ContenuEnregistrement, CheminCompletFichierJournal) End If End Function |
Ce code est donc tout à fait générique et vous pouvez l'utiliser dans toutes les situations et dans n'importe quel projet sans devoir le modifier.
Attention: vous aurez besoin, pour faire fonctionner le tout, d'inclure dans votre projet les trois codes VBA – le code "a)", le code "b)" et un des deux codes "c)".
Étape 4: des exemples pratiques d'utilisation du fichier journal
Voici, par exemple, comment enregistrer les informations sur l'utilisateur qui a consulté le fichier Excel que vous suivez. Copiez ce code à des endroits spécifiés de votre Projet VBA, modifiez le nom du fichier journal (à la ligne indiquée de la fonction EnregistrerAction
) et la procédure va fonctionner sans aucune autre modification nécessaire.
Code VBA à copier dans "ThisWorkbook"
1 2 3 |
Private Sub Workbook_Open() Call EnregistrerAction("Ouverture de Classeur") End Sub |
Code VBA à copier dans un Module
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
Public Function AjouterAuFichierTexte(ContenuAAjouter As String, CheminFichier As String) 'par Excel-Malin.com ( https://excel-malin.com ) Dim oFSO As FileSystemObject Set oFSO = New FileSystemObject Dim oFS As TextStream Set oFS = oFSO.OpenTextFile(CheminFichier, ForAppending) oFS.WriteLine ContenuAAjouter oFS.Close Set oFS = Nothing Set oFSO = Nothing End Function Public Function SauvegarderChaineCommeFichierTexte(Contenu As String, CheminFichier As String) 'par Excel-Malin.com ( https://excel-malin.com ) Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") Dim oFile As Object Set oFile = FSO.CreateTextFile(CheminFichier) oFile.WriteLine Contenu oFile.Close Set FSO = Nothing Set oFile = Nothing End Function Public Function EnregistrerAction(ActionNom As String) 'par Excel-Malin.com ( https://excel-malin.com ) Dim CheminCompletFichierJournal As String Dim ContenuEnregistrement As String CheminCompletFichierJournal = "C:\DossierLog\FichierLog.txt" '<-- changez le chemin et le nom du fichier journal 'création du contenu à enregistrer ' -> exemple: date, temps, nom d'utilisateur, action ActionMoment = Now ContenuEnregistrement = _ Year(ActionMoment) & Right("0" & Month(ActionMoment), 2) & Right("0" & Day(ActionMoment), 2) & ";" _ & Right("0" & Hour(ActionMoment), 2) & ":" & Right("0" & Minute(ActionMoment), 2) & ":" & Right("0" & Second(ActionMoment), 2) & ";" _ & Environ("UserName") & ";" _ & ActionNom 'vérifier si le fichier journal existe déjà & enregistrer l'information VerificationFichierJournal = Len(Dir(CheminCompletFichierJournal)) If VerificationFichierJournal = 0 Then 's'il n'existe pas encore -> créer un nouveau LogResult = SauvegarderChaineCommeFichierTexte(ContenuEnregistrement, CheminCompletFichierJournal) Else 's'il existe -> ajouter la nouvelle ligne LogResult = AjouterAuFichierTexte(ContenuEnregistrement, CheminCompletFichierJournal) End If End Function |
Étape 5: le fichier démo (fichier Excel contenant le code VBA et les explications)
Ce fichier démo contient la mise en pratique de tout ce que vous auriez pu trouver dans ce tutoriel – c'est-à-dire la création et l'utilisation des fichiers journaux. Le code VBA est accessible et vous servira de guide pour vos propres créations.
La démo crée un dossier ("Excel-Malin") sur votre bureau et les fichiers journaux sont stockés dans ce dossier. Quand vous ne voudrez plus utiliser cette démo, il suffit simplement d'effacer ce dossier.
- Si après l'ouverture du fichier Excel, vous voyez un avertissement concernant la source du fichier, veuillez suivre cette procédure de déblocage…
Taille de fichier: 36,3 Ko
Pour aller plus loin en VBA…
Si ce tutoriel vous a été utile, n'hésitez pas à consulter d'autres nombreux articles sur Excel-Malin.com. Ils devraient rendre votre travail avec VBA plus agréable et plus efficace.
En voici quelques uns…
- Liste de toutes les fonctions disponibles en VBA
- Tutoriel sur la Manipulation des fichiers en VBA
- Envoyer un email (automatique) à partir d'Excel – oui, oui, c'est possible!
- Gestion des dates et du temps en VBA
- Comment utiliser la fonction RECHERCHEV en VBA – ce qui est bien plus rapide qu'une boucle!
50 commentaires sur “VBA: suivre l’activité de l’utilisateur (log)”
Excellent! Merci!
super bien merci.
Par contre j'essaie de mettre une instruction avant la fermeture du classeur pour faire une copie du fichier créé vers un autre répertoire, sans succès hélas. Je dois faire des erreurs dans la syntaxe.
help please.
Bonjour Arnaud,
vous devez utiliser l'événement Workbook_BeforeClose (à placer dans l'objet "ThisWorkbook").
Pour ce qui est de faire la copie du fichier, vous trouverez plus d'info ici: Manipulation basique des fichiers en VBA
Donc dans votre cas, cela devrais donner quelque chose comme ceci:
Vous devez évidemment modifier les noms de fichiers.
Ce code est à placer dans l'objet "ThisWorkbook" du fichier qui va contenir la macro.
J'espère que j'ai répondu à votre question.
Bien à vous, Martin
Bonjour Martin,
J'avais vu le sujet sur la manipulation des fichiers, et j'essayais de l'adapter dans le prolongement du code LOG(user) dans le fichier démo, c'est dire en me servant des variables existantes :
filecopy CheminCompletFichierJournal , "\\bidule\truc\" & nomfichierjournal
Mais ça ne marche pas.
Bonne journée.
En fait, dans la démo, la variable
CheminCompletFichierJournal
ne fonctionne qu'à l'intérieur de la fonctionEnregistrerAction
car ce n'est pas une variable globale.Vous avez donc deux possibilités: 1) soit créer une fonction séparée qui va renvoyer le même résultat que CheminCompletFichierJournal ou 2) définir cette fonction à l'intérieur de l'événement "BeforeClose"
Donc solution 1: vous gardez votre code et vous copiez la fonction suivante dans un Module
Solution 2: vous mettez ce code dans l'objet "ThisWorkbook"
Et normalement, cela devrait marcher…
PS: attention aux guillemets (parfois, la copie à partir du site internet utilise autres guillemets – il suffit de les récrire dans l'éditeur VBA)
Hello,
Bon c'est nikel, la solution 2 fonctionne bien (pas la solution 1), le seul soucis c'est que le FileCopy fonctionne très bien lorsque l'on reste sur des répertoires avec des chemins désignés par une lettre, en revanche lorsque l'on utilise "\\" ça ne marche plus (erreur76 chemin d'accès introuvable).
Je cherche encore……
Normalement, FileCopy peut être utilisé avec des chemns UNC (chemins vers serveurs – commencent par "\\…").
êtes-vous sûr d'avoir les droit d'accès (write) dans le dossier? Essayez d’accéder dans ce dossier là avec le Windows Explorer et d'y créer un fichier "manuellement". Est-ce possible?
Hello,
Les droits sont normalement bons vu que les manip par windows (copier/coller/supprimer) fonctionnent.!!!
Je vois pas…….
C'est alors que vient le pragmatisme du VBA:
Vous pouvez tester si l'écriture d'un fichier fonctionne? Le code VBA: Sauvegarder texte comme un fichier
Si cela marche, on n'a qu'à 1) lire le contenu du fichier log de base (code VBA: Lire un fichier texte en VBA), le placer dans une variable et 2) via cette variable le sauvegarder comme un nouveau fichier texte sur le serveur…
Si l'écriture marche mais vous ne vous en sortez pas pour combiner les deux opérations, faites moi signe et je vous le ferai…
Bon la fin de mon précédent message m'a mis sur la piste! : j'ai pris rdv chez mon ophtalmo; bref la syntaxe entre un o et 0. Du coup ça fonctionne maintenant, après une manip supplémentaire dans Outils->Références + cocher Microsoft Scripting Runtime
Merci, @+
Parfait alors… 😉
Bonjour,
Votre code est parfait. Tout fonctionne correctement.
J'ai essayé d'adapter ce code pour récupérer en plus de l'emplacement modifié, la valeur. En utilisant Target.Value ça fonctionne pour la modification d'une cellule, mais lorsque j'ai l'insertion d'une plage (copier coller d'une ligne) ça plante.
1.Pouvez-vous m'aider à coder pour récupérer la valeur de la cellule avant et après modification, tout en gardant le code actuel (adresse des cellules modifiées) ?
2. Autre point, j'aimerais tracer le déroulement (lancement, choix utilisateur sur les boites de dialogue/user form,…) des procédures est-ce réalisable ? C'est peut-être trop général pour que vous puissiez me répondre.
Merci de votre aide.
Bonjour Ethan,
ravi d'entendre que mon code est utile.
Concernant vos questions:
1A) Le code utilise l'événement Worksheet_Change qui se comporte de manière suivante:
– Target.Address est disponible pour une cellule unique ET pour une plage
– Target.Value n'est disponible QUE pour une cellule unique.
Vous pouvez donc par exemple extraire l'information quelle ligne a été ajoutée/supprimée mais vous ne pouvez pas obtenir les valeurs directement. C'est éventuellement possible via un "loop" dans toutes les cellules de la plage modifiée.
1B) Il n'existe pas d'événement "BeforeChange". Il est donc impossible de loguer la valeur initiale. C'est le changement même qui lance l'enregistrement de log et à ce moment-là, seule la nouvelle valeur est disponible.
2) Ce que vous demandez est tout à fait réalisable.
Vous pouvez utiliser tous les "events" qui sont disponibles dans VBA pour déclencher l'enregistrement dans le log.
Vous trouverez l'exemple dans la démo pour le log de: ouverture, enregistrement, fermeture du classeur (cela se trouve dans l'objet ThisWorkbook).
Pour les formulaires, voyez le fichier de la démo améliorée plus bas.
Je vous ai ajouté quelques fonctionnalités dans le fichier démo:
– il logue l'ajout et suppression des lignes/colonnes
– il fait la distinction entre l'effacement et l'ajout/modification du contenu des cellules
– j'ai ajouté un UserForm avec un menu déroulant qui logue la valeur que l'utilisateur choisi. Dans l'exemple, il logue directement dès que l'utilisateur fait son choix. Il est évidemment possible de déclencher le log à un autre moment (par exemple lors de la soumission du formulaire)
Conclusion pour la question 2:
1) le code reste toujours le même: utilisez la fonction "EnregistrerAction"
2) tout dépend où sera placé l'appel à cette fonction. Cela peut être dans n'importe quel "événement" (Event) – que ce soit pour le classeur, la feuille, le formulaire, un élément du formulaire etc.
Fichier démo avec les fonctionnalités supplémentaires
C'est parfait. Grace à vos précisions, j'ai compris comment ça marchait.
Encore merci pour votre aide.
@+
Avec plaisir…
Merci pour ce fichier ! Il est Top !
bonjour,
j'ai copier les modules de code dans mon fichier.
et j'ai l'erreur suivante
Erreur de compilation
Type défini par l'utilisateur non défini
le déboggeur me renvoie sur
Public Function AjouterAuFichierTexte(ContenuAAjouter As String, CheminFichier As String)
et fait le focus sur
Dim oFSO As FileSystemObject
pouvez vous m'aider ?
merci
Bon c'était juste un problème de librairie.
Bonjour Jean-Séb,
j'allais vous répondre la même chose 🙂
Content que vous ayez trouvé la solution.
BàV,
Martin
Bonjour,
Super boulot !
Cette fonction est-elle adaptable pour un classeur partagé en ligne sous google sheet ?
Quelle stratégie envisager pour inscrire ce journal sous forme de feuille masquée dans le fichier excel lui-même ?
Bien à vous !
Jérôme
Bonjour et merci Jérôme!
pour répondre à vos questions:
1) Malheureusement, il n'est pas possible d'utiliser ce code dans Google Sheets. Cette application n'utilise pas VBA comme langage de script. Les applications Google (Sheets, Docs, Calendar, …) utilisent le "Google Apps Script" basé sur JavaScript – vous pouvez y jeter un coup d'œil ici.
2) Si vous voulez utiliser le fichier Excel lui-même pour stocker les logs, cela simplifie grandement la chose car vous pouvez laisser tomber toute la partie qui gère les fichiers texte (création, modification etc.).
A votre place, je m'y prendrais de manière suivante:
J'espère que cela répond à votre question et que cela vous aidera à faire ce dont vous avez besoin…
Sinon, vous pouvez toujours poser d'autres questions et je vous aiderai dans la mesure de mon temps disponible.
Bien à vous, Martin
Bonjour et merci pour la réponse rapide !
Pour le point 2 je ne suis pas vraiment certain d'y arriver mais je vais tenter la chose 🙂
Jérôme
Re-Bonjour Jérôme,
je vous ai préparé le fichier qui fait ce qu'il vous faut 😉
Vous pouvez le trouver ici: Demo-Suivi_D_Utilisation_dans_le_meme_fichier.xlsm
Les logs sont mis dans la feuille "log" qui est cachée.
La nouvelle fonction VBA se trouve dans le Module "FonctionLog_FeuilleCachee".
Cela devrait vous aider.
Martin
Bonjour,
Merci beaucoup c'est vraiment cool ! Je n'en demandais pas autant ! Mais merci je vais lire et essayer de bien comprendre le code pour le réutiliser !
Bonne journée…sous la neige…
Jérôme
De rien et bonne lecture 😉
Bonjour,
Tout d’abord un grand merci pour votre travail. Il ma vraiment été utile sans vous je n'y serais jamais arrivé.
Je suis tout neuf dans le monde de la VBA. pouriez-vous m'expliquer comment noté sur la feuille de log quel feuille à été modifier.
avec le classeur Demo-Suivi_D_Utilisation_dans_le_meme_fichier.xlsm, in indique uniquement quel case à été modifier, hors dans mon fichier j'ai 4 feuille à surveillé.
Merci pour votre retour.
Bonjour Phips,
ce n'est pas difficile: il suffit de modifier le code qui se trouve dans la feuille "Suivi" et qui doit être copié dans chaque feuille que vous devez suivre.
Le nouveau code qui indiquera dans le log la feuille:
Bien à vous,
Martin
Ha bein oui merci
ça parait logique mais je ne connaissais pas la formule.
Dans tout les cas merci.
Il n'y a pas de quoi
Bonjour,
Je viens vers vous puisuqe j'ai encore des sousci avec une formule VBA.
J'ai dans un tableau plusieurs lignes de donnée.
A la fin de chauqe ligne j'ai une cellule avec une formule qui m'indique qui a modifier une des cellules de la ligne.
La formule est la suivante :
=SI(A1:B1)>0;login();"")
Pour que cette formule fonctionne j'ai fait cette formule VBA :
Function login() As String
login = Application.UserName
End Function
Dans un module.
Le problème c'est que quand je tri mon tableau chaque ligne indique qui a trié le tout.
J'aimerai que quand j'effectue un tri la formule ne s'exécute pas.
Pouvez-vous m'aider ?
Bonjour Phips,
ce que vous demandez est plutôt complexe.
Le "problème" des formules est qu'elles se recalculent (ce qui est logique) – votre formule login() indiquera donc le nom de l'utilisateur ou moment où la formule est exécute.
Et le changement de tri ou de filtre lance d'office un recalcule…
J'aurais 2 pistes pour vous – dont l'utilité dépend de la manière dont vous utilisez le fichier.
Private Sub Worksheet_Change(ByVal Target As Range)
Cells(Target.Row, 10).Value = Application.UserName
End Sub
Cette fonction ajoutera le nom de l'utilisateur dans la 10ème colonne (= "J") de la ligne qu'il vient de modifier…
Si vous avez besoin d'une condition (comme le "A1:B1″>0 ), vous pouvez soit l'inclure directement dans cette fonction,
soit l'ajouter dans une autre colonne.
Exemple: dans la cellule "K2" vous mettez la formule
=SI(A1:B1)>0;L2;"")
J'espère que je me suis fait comprendre et que cela résoudra votre problème.
Bàv, Martin
Bonjour,
J'ai un gros soucis de tableaux sous excel. Les lignes vont jusqu'à plus d'un million alors que je n'ai besoin que de 455 lignes.
Auriez-vous une idée pour réduire les lignes et les colonnes qui elles aussi vont très loin sur la droite.
Le fichier de 7 volets (tableau de max 500 lignes) pèse 8,228ko et aucun moyen de l'envoyer par mail. Il est en réseau bloqué…
J'ai tout essayé mais en vain 🙂
Merci
Bonjour Zoé,
ceci est un problème assez courant. Mais relativement simple à corriger.
En fait, Excel stocke non seulement les valeurs dans les cellules mais également leur formatage. Donc si vous sélectionnez par ex. une colonne entire et vous la mettez en "gras", c'est plus d'1 million de cellules pour lesquelles Excel va stocker le format. De là vient la taille de votre fichier…
Solution:
Il existe deux solutions faciles à ce problème, je vous les mets toutes les deux, à vous de choisir celle qui vous convient le mieux…
Solution 1) vous allez dans chaque feuille et vous supprimez (pas seulement effacer!) toutes les colonnes après la dernière colonne utilisée et toutes les lignes après la dernière ligne utilisée.
Pour faire cela facilement: sélectionnez la première colonne vide et appuyer sur
Crtl
+Shift
+flèche vers la droite
ensuite click droit et choisissez "supprimer". La même chose pour les lignes (sélectionner la première vide et appuyer surCtrl
+Shift
+flèche vers le bas
…)Vous faites cela sur toutes les 7 feuilles et vous sauvegardez le fichier.
Solution 2) vous ouvrez un nouveau fichier, vous créez 7 feuilles et leur donnez les mêmes noms que dans le fichier d'origine.
Ensuite, vous copiez le contenu de chaque feuille du fichier d'origine vers la feuille correspondante du nouveau fichier.
Attention! Ne copiez pas toute la feuille mais seulement les cellules utilisées. Soit vous les sélectionnez avec la souris, soit vous sélectionnez la cellule "A1" et vous appuyez sur
Crtl
+Shift
+flèche vers la droite
+flèche vers le bas
.Finalement, vous sauvegardez le nouveau fichier. Ainsi, il ne contiendra que les cellules utilisées, toutes les autres restant vides (sans valeurs et surtout sans formats).
J'espère que cela résout votre problème.
Cordialement, Martin
Exccellent Tutorial
Bonjour M,
Merci vraiment pour vos astuces car j'apprends énormément avec ce site depuis que je l'ai découvert il y'a 3jours. J'aimerais savoir s'il est possible de modifier et comment le code pour récupérer le contenu même des cellules en valeurs comme en formule et que ce code soit valable pour n'importe quel classeur ouvert sur son ordinateur en gros pour toute l'application Excel même. Merci
Bonjour Kara,
ce serait un "gros morceau" et beaucoup de travail pour le mettre au point.
Il faudrait choisir une autre méthode que celle présentée ici car la méthode dans ce tutoriel a besoin que le code soit présent dans chaque Classeur qui doit être suivi…
D'ailleurs, je ne suis même pas sûr que ce soit possible: il faudrait trouver un moyen de capter les "événements" dans d'autres classeurs que dans celui où se trouve le code. Et cela me semble difficilement atteignable. Peut-être en passant par un add-in…
Bien à vous, Martin
Bonjour,
pour commencer, un grand merci
je me permets de vous poser ici quelques petites questions quant à l'utilisation et l’évolution de votre script.
1. Lorsque je sélectionne plusieurs cellules pour les effacer aucune entrée ne se rajoute au journal
2. Est-il possible de rajouter une entrée dans le journal si la feuille est imprimée ?
3. Est-il possible de rajouter une entrée si un TCD est actualisé ?
Merci de vos réponses 😉
Bonjour EfferNath,
merci pour votre message.
Voici les réponses à vos questions:
1. C'est étonnant, je viens de tester avec le fichier démo et l'événement est logué comme il faut:
20190806;00:08:29;xxxxxx;Ouverture de Classeur
20190806;00:09:02;xxxxxx;Plage modifiée [D19:G20]
2. copiez le code suivant dans
ThisWorkbook
:3. copiez le code suivant dans chaque Feuille:
J'espère que cela répond à vos questions…
Cordialement, Martin
Bonjour, bonjour,
c'est de nouveau moi, je sais 6 mois plus tard, et je viens de m'apercevoir, sans avoir dit merci de votre réponse :'(
Bonjour,
ne vous en faites pas… ça arrive! 😉
Cordialement, Martin
bonjour,
je voulais savoir si on pouvait mettre de la couleur
genre l'utilisateur par exemple
Merci
super utile merci
Bonjour,
Merci pour ce code grandement utile !
Pourriez vous me dire comment faire pour ajouter au journal quand quelqu'un déprotège la feuille ?
Merci.
Bonjour,
Bravo et merci pour ce tutoriel et le code.
Est-il possible d'enregistrer les logs dans une des feuilles du classeur plutôt que dans un fichier textesur le poste ?
Si oui comment procéder ?
Merci d'avance 😉
Eric
Vraiment très utile votre Site, il me de débloque certaines situation.
BRAVO pour vos compétences et vos différents retour
Bonjour
Comment puis-je faire pour vous posser une question et joindre un fichier
Merci
Bonjour,
vous pouvez m'envoyer un email à contact@excel-malin.com
Bonjour, merci beaucoup pour ce tutorial, je l'ai testé et tout fonctionne parfaitement!! Par contre je l'ai testé sur un fichier excel en mode lecture seulement et ca ne marche pas. Le log ne récupére pas les utilisateurs qui ont le droit de lecture sans modification? Par avance merci
Bonjour cyrine,
j'avoue que je n'ai pas testé ce cas particulier. Quand j'aurai un peu de temps, je vais le tester pour voir.
Bàv, Martin
Bonjour et merci pour ce petit article,
je propose les quelques améliorations suivantes :
Year(ActionMoment) & Right("0" & Month(ActionMo. etc……………..
peut être réduit à :
ActionMoment = Format(ActionMoment, "yyyymmdd hh:mm:ss")
et l'autre point:
j'essaye au max de ne pas utiliser les références dans le code pour la portabilité du code.
du coup je teste (pour bénéficier de l'autocompletion) en activant la ref, mais en version finale, j'utilise ceci:
Set truc = CreateObject("Scripting.FileSystemObject")
cela permet d'éviter les erreurs dues à une référence manquante.
cordialement