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.

vous a donné une bonne réponse. Penser de façon plus générale, si plusieurs cellules sont changés à la fois, voulez-vous le journal?
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