如何使用Excel VBA创建外部日志?

Mat*_*dge 9 excel events logging vba excel-vba

代码已更新,以引用以下更改.

这个日志系统为Excel创建了一个名为Log.txt的外部文档,它将在log.txt文件中创建一个如下所示的行:

11:27:20 AM Matthew Ridge从ss改为N $ 55

这不会告诉您是否有人在工作表中输入了新的代码行,但如果代码需要答案,它将告诉您答案所在的单元格.下面的代码适用于Mac和PC系统的组合.如果人们发现它没有请说.

这段代码是在这里的人和其他形式的帮助下创建的,所以我不能单独拥有该文件,但我可以拥有这个概念.所以感谢那些帮助过的人,没有这个,我认为现在不会有一个可行的Excel日志系统;)

顺便说一下,在有人吓坏了并询问这段代码在哪里之前,对于普通/新的最终用户来说这并不明显.您需要转到Developer选项卡打开它,单击Visual Basic,当新窗口打开时,查找Microsoft Excel Object; 在该文件夹下应该是您的工作簿.您可以将其放在ThisWorkbook下或任何工作表内,方法是双击您希望代码所在的工作表.

在右侧面板上打开工作表后,您将看到Option Explicit,如果不这样做,最好通过确保选中Require Variable Declaration来激活它.这可以再次在Visual Basic窗口中找到,并遵循以下路径:

工具 - > 选项 - > 编辑器.

如果它被检查,那么你不用担心,如果没有,那么你检查它.Option Explicit对你的代码来说是一件好事,它迫使你声明变量,这是一个好的做法.

验证完成后,您可以复制下面的代码,将其粘贴到工作簿中,或根据您的需要粘贴到特定的工作表中.

版本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
Run Code Online (Sandbox Code Playgroud)

随着时间的推移,我将尝试更新此代码,以便在我认为合适时为其添加更多功能.

再次感谢所有帮助,我们非常感谢能够实现这一目标.

Jas*_*ark 3

问题是,当您输入合并的单元格时,放入 PreviousValue (在Worksheet_SelectionChange)中的值是所有合并单元格的数组,您无法将其与新值进行比较。当在Worksheet_Change编辑时触发时,目标只是合并范围的左上角单元格。因此,让我们跟踪该单元格的合并范围。将您的替换Worksheet_SelectionChange为以下内容:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    PreviousValue = Target(1).Value
End Sub
Run Code Online (Sandbox Code Playgroud)

免责声明:这是在 Excel for Mac 2011 上进行测试的,因为我目前无法访问 Excel for Windows,但我非常确定它也适用于 Excel for Windows。