Comment faire un journal externe à l'aide de VBA Excel?
Le code a été mis à jour pour faire référence à des modifications ci-dessous.
Ce système de journal de créer un document externe pour Excel appelé Log.txt il va créer une ligne dans le log.txt fichier qui ressemble à ça:
11:27:20 AM Matthieu Ridge changé de cellule $N$55 ss pour
Ce ne sera pas vous dire si quelqu'un est entré dans une nouvelle ligne de code dans la feuille, mais si le code exige une réponse, il vous dira ce que cellule de réponse. Ce codes ci-dessous devrait fonctionner pour les deux systèmes Mac et PC confondus. Si des gens trouvent qu'il n'a pas s'il vous plaît dire.
Ce code a été créé avec l'aide des gens d'ici, et d'autres formes, donc je ne peux pas prendre d'entreprise à propriétaire unique du document, mais je peux prendre l'appropriation de la notion. Donc merci à ceux qui ont aidé, sans cela, il ne serait pas viable système de journalisation pour Excel à mon avis 😉
BTW, avant tout le monde capote et lui demande d'où vient ce code, il n'est pas évident à l'générale/les nouvelles de l'utilisateur final. Vous avez besoin d'aller à la L'Onglet Développeur l'ouvrir, cliquez sur Visual Basic, et lorsque la nouvelle fenêtre s'ouvre, recherchez Microsoft Excel Objet; en vertu de ce dossier devrait être votre classeur. Vous pouvez soit mettre sous ThisWorkbook ou à l'intérieur des feuilles en double-cliquant sur la feuille que vous voulez le code.
Une fois que la feuille est ouverte sur le panneau de droite, vous verrez l'Option Explicite, si vous n'en avez pas, il est préférable si vous pouvez l'activer en vous assurant que l' Exiger la Déclaration de la Variable est cochée. Cela se trouve à la fenêtre de Visual Basic à nouveau, et suivez ce chemin:
Outils-> Options -> Éditeur.
Si elle est cochée, vous avez pas de soucis, si non, alors vous les consultez. Option Explicit est une bonne chose pour vous de code, il vous oblige à déclarer les variables, ce qui est une bonne pratique pour commencer.
Une fois validé, vous pouvez copier le code ci-dessous, soit de le coller dans votre Classeur ou une feuille spécifique en fonction de vos besoins.
Version 2.01
Option Explicit
Dim PreviousValue
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sLogFileName As String, nFileNum As Long, sLogMessage As String
sLogFileName = ThisWorkbook.Path & Application.PathSeparator & "Log.txt"
On Error Resume Next ' Turn on error handling
If Target.Value <> PreviousValue Then
' Check if we have an error
If Err.Number = 13 Then
PreviousValue = 0
End If
' Turn off error handling
On Error GoTo 0
sLogMessage = Now & Application.UserName & " changed cell " & Target.Address _
& " from " & PreviousValue & " to " & Target.Value
nFileNum = FreeFile ' next file number
Open sLogFileName For Append As #nFileNum ' create the file if it doesn't exist
Print #nFileNum, sLogMessage ' append information
Close #nFileNum ' close the file
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
PreviousValue = Target(1).Value
End Sub
Comme le temps passe, je vais tenter de mettre à jour ce code pour ajouter plus de fonctionnalités, comme je le jugent bon.
Encore une fois merci à tous qui ont aidé, elle est très appréciée pour rendre cela possible.
Si la journalisation est activée à partir du début du classeur, vous ne devriez pas avoir besoin de capturer le "vieux" de la valeur, puisque vous devez disposer d'un enregistrement de toutes les valeurs saisies pour chaque cellule. Puis vous pouvez vous adresser Doug >1 cellule scénario juste en faisant une boucle par
Target.Cells
Matt - la seule différence entre les versions Windows et Mac est la ligne qui définit
sLogFileName
, correct? Vous pouvez créer une version unique de code qui fonctionne sur les deux plates-formes en remplaçant cette ligne avec `sLogFileName = ThisWorkbook.Chemin & Application.PathSeparator & "Log.txt". Application.PathSeparator sera de retour "\" à la Windows ":" sur Mac. Merci à Doug pour la référence.Doux je vais mettre à jour ce quand je suis au travail.
Ok, petite question pour ceux qui connaissent, est-il un moyen de rendre ce script fonctionne avec de multiples changements de fait à la fois? Ainsi, au lieu d'une cellule de changement à la fois, plusieurs changements de cellules à la fois?
OriginalL'auteur Matt Ridge | 2012-05-01
Vous devez vous connecter pour publier un commentaire.
Le problème est que lorsque vous entrez les cellules fusionnées, la valeur de mise en PreviousValue (en
Worksheet_SelectionChange
) est un tableau de toutes les cellules fusionnées, ce qui vous ne pouvez pas comparer à la nouvelle valeur. LorsqueWorksheet_Change
est tiré sur l'édition, la cible est seulement la partie supérieure gauche de la cellule de la fusion de gamme. Donc, nous allons simplement suivre que des cellules fusionnées plages. Remplacer votreWorksheet_SelectionChange
avec les éléments suivants:Avertissement: Cela a été testé sur Excel pour Mac 2011 que je n'ai pas accès à Excel pour Windows pour le moment, mais je suis assez sûr qu'elle fonctionne sur Excel pour Windows.
PreviousValue = Target(1).Value
sans le if/ELSE.Merci @DougGlancy. Beaucoup mieux. Fixe.
+1 Bonne explication.
A travaillé sur les mac avec un seul changement:
sLogFileName = ThisWorkbook.Path & "\OpenOrderLog.txt"
est devenusLogFileName = ThisWorkbook.Path & ":OpenOrderLog.txt"
(note du côlon); sans doute parce que Excel Mac est encore une application Carbon sous les couvertures, et ThisWorkbook.Chemin retourne une valeur comme"Macintosh HD:Users:jclark"
. Je n'ai pas vérifié pour voir si Excel VBA offre une plate-forme indépendante de la concaténation des chemins. Je n'ai toujours pas reçu ma mer-jambes avec Excel pour Mac.dans Windows Excel, il est d'Application.PathSeparator
OriginalL'auteur Jason Clark
Matt Ridge - je sais que vous avez demandé pour une solution en ce qui concerne de multiples changements fait à la fois, et je n'ai que 3 ans de retard, mais ici il est :).
J'ai fait quelques légères modifications au code original, mais cela permettra de manipuler des cellules fusionnées et journal de multiples changements de cellules.
OriginalL'auteur Matthew Schofield
un an plus tard, j'ai modifié le Code de Matthieu - maintenant, il suit les modifications apportées par copier/coller ou à traquer les souris aussi, merci Matthieu pour la bonne idée!:
OriginalL'auteur OtisLoomgard