如何使用Excel VBA制作外部日志?

2023-11-21

代码已更新以引用以下更改。

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

11:27:20 AM Matthew Ridge 将单元格 $N$55 从 ss 更改为

这不会告诉您是否有人在工作表中输入了新的代码行,但如果代码需要答案,它会告诉您答案位于哪个单元格中。下面的代码应该同时适用于 Mac 和 PC 系统。如果人们发现它,请不要说。

该代码是在此处人员和其他形式的帮助下创建的,因此我不能独占该文档的所有权,但我可以拥有该概念的所有权。因此,感谢那些提供帮助的人,如果没有这个,我认为现在就不会有可行的 Excel 日志系统;)

顺便说一句,在有人惊慌失措并询问这段代码去哪里之前,它对于一般/新的最终用户来说并不明显。您需要前往开发者选项卡打开它,单击 Visual Basic,当新窗口打开时查找 Microsoft Excel 对象;该文件夹下应该是您的工作簿。您可以将其放在 ThisWorkbook 下,也可以通过双击您想要将代码放入其中的工作表来将其放在任何工作表中。

在右侧面板上打开工作表后,您将看到 Option Explicit,如果没有看到,最好通过确保需要变量声明已检查。再次在 Visual Basic 窗口中找到它,然后按照以下路径操作:

Tools-> Options -> Editor.

如果检查过,那么您就不用担心,如果没有检查过,那么您就检查一下。 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

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

再次感谢所有提供帮助的人,非常感谢使这一切成为可能。


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

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    PreviousValue = Target(1).Value
End Sub

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Excel VBA制作外部日志? 的相关文章

  • 如何获取 pandas 数据框并覆盖 Excel 工作簿中的特定工作表

    我想获取一个数据框并让它替换特定工作表中的现有数据 假设为sheet1 然后我想获取另一个数据框并将其附加到另一张工作表上的数据 比如说同一工作簿中的sheet2 目前 我必须将数据写入新的 Excel 工作簿 我无法在线找到如何实际替换我
  • 如何在 log4j2 中格式化堆栈跟踪?

    默认情况下 log4j2 在多行上打印堆栈跟踪 用newline人物 就像是 java lang NullPointerException error enovountered at at at 我希望我的堆栈跟踪在一行上 类似于 本质上使
  • iPhone 上的全屏视频播放器是否有“onClose”事件?

    我在网站上使用 html5 视频播放器 当用户开始播放时 播放器进入全屏模式并播放视频 视频结束后 我看到ended事件并通过关闭视频播放器myvideo webkitExitFullScreen 现在 当玩家实际获得时我需要另一个事件cl
  • 检测 html 选择框上的编程更改

    有没有办法让 HTML 选择元素在每次以编程方式更改其选择时调用函数 当使用 JavaScript 修改选择框中的当前选择时 IE 和 FF 都不会触发 onchange 此外 更改选择的 js 函数是框架的一部分 因此我无法更改它以在结束
  • 如何在Excel中创建关系矩阵

    给定一个三元组列表 我想得到一个关系矩阵 如下所示 1 A X 1 A Y 1 B X A B C 1 B Z 1 X Y X Z 2 A Z gt 2 Z X Y 2 B X 3 Y Z 3 A Y 3 A Z 2 C Y 如何 可以在
  • 使用 C# 在 Excel 中查找和替换文本

    我想使用 C 在 Excel 中查找并替换一组文本 而且我希望此替换仅发生在第一行中的文本 我已经使用Google并找到了一些付费资源 例如Aspose API Spire Xls等 但我正在寻找开源资源或任何其他有效的方法来实现这一目标
  • 向用户显示多条验证消息

    在 MS Access 中 如何将从 SELECT 语句检索到的行存储在数组中 并在一个消息框中显示多行 Dim rSEL rSUM rDes As DAO Recordset Dim vItem id vQnty vSum As Inte
  • 在 Python 中绘制 Excel 中的数据

    我必须从 Excel 文件中读取和绘制数据的代码是这样的 import pandas as pd import matplotlib pyplot as plt excel file file1 xlsx file1 pd read exc
  • 使用可执行 JAR 时指定 Log4j2 配置文件

    使用可执行 JAR 文件时 我在指定 Log4j2 配置文件位置时遇到问题 如果我将所有 JAR 分开 效果很好 但是当我尝试将它们组合成一个可执行 JAR 文件时 由于某种原因log4j2 xml未从命令行获取文件 我尝试过这两种指定位置
  • Excel ISNUMBER 函数与 IF 语句

    我有一个正在使用的 Excel 文件 有一个列包含数字和文本 有时只是其中之一 我正在尝试编写一个函数来扫描单元格的最左侧部分以查看它是否以数字开头 我以为我拥有它 但显然没有 这就是我所拥有的 IF ISNUMBER LEFT E8 1
  • Excel宏隐藏特定单元格和合并区域

    我试图根据另一个单元格的值隐藏特定单元格 到目前为止 我设法隐藏整行 但无法隐藏特定单元格 Local Currency value show hide item If Range Currency Value USD Then Range
  • excel使用单元格引用作为逻辑运算符并查找值

    我有一个表来查找这样的值 logical test points lt 0 1 lt 10 2 lt 20 4 gt 20 5 如果我的单元格 例如 A1 如果我的单元格 如果我的单元格 gt 20 则结果为 5 我可以为此使用多个 if
  • 通过 Excel VBA 保存并关闭 powerpoint

    下面的代码根据定义的名称创建多个图表 然后打开具有这些定义的名称的 powerpoint 文件并转储到图表中 除了最后一部分之外 一切都正常 保存并关闭文件 我已将尝试保存和关闭文件的尝试标记为绿色 任何帮助表示赞赏 Sub Slide19
  • Excel,多个 IF AND 更高效的公式

    我正在制作一个电子表格 如下所示 Index Diff Exc Sym Sec Result Criteria Met 3 42 2 07 0 86 0 92 1 83 1 95 0 38 2 93 0 87 0 23 2 01 0 09
  • android Studio 日志不起作用

    我无法在手机上使用日志 我只在 Android Studio 中收到此错误 11 01 03 28 56 427 24227 24375 com example segall caveofprogcourse E GED 无法获取 GED
  • 以独立于区域设置的方式读取 Excel 文件

    我使用以下代码从各种 Excel 文件读取数据 IMEX 1 to force strings on mixed data HDR NO to process all the available data Locale 1033 is en
  • 自动计算Excel VBA UDF与单元格属性相关

    我编写了一个 UDF 来计算特定颜色和特定线条样式的单元格 我发布了整个函数 Function CountTime rData As Range cellRefColor As Range As Variant Dim indRefColo
  • VBA 写入文件时对数值进行四舍五入 - 如何防止?

    在下面的代码中 我在确保文件编写器不会将我的数字四舍五入到一定的小数位数时遇到问题 我需要使用变体 因为有时该值是字符串 有时它是数字 我怎样才能强制它准确地写出变量是什么 例如 下面的代码可能显示 0 00038 我想显示确切的值 Dim
  • VBA删除列中的单元格并根据单元格的值左移?

    如果单元格为空 如何删除 B 列 和左移 中的单元格 下面是我所拥有的 但它给出了 应用程序定义或对象定义的错误 Sub DeleteCellShiftLeft For i 1000 To 1 Step 1 If Cells i B Val
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向

随机推荐