【问题标题】:How to determine what VBA code is changing the value of an Excel cell如何确定哪些 VBA 代码正在更改 Excel 单元格的值
【发布时间】:2020-02-29 00:26:29
【问题描述】:

我有一本由其他人编写的工作簿,并且某个特定单元格正在被某些代码更改。我无法弄清楚改变单元格值的代码。

除了在数百个程序中设置断点之外,我什至无法找到缩小代码可能性的策略。所以我会对战略构想感到满意。

我在 Microsoft Access 中使用 VBA 非常有经验,在 Excel 中使用 VBA 也有一点经验。

编辑 得拉夫。我什至不能从一开始就通过代码 F8。我的意思是.. 在我更改工作表中的值(实际上是一年)后,有问题的单元格会发生变化。所以我设置了一个子程序和断点如下。

Private Sub Worksheet_Change(ByVal Target As Range)
End Sub   '<== set breakpoint here

然后我按 F8,调试器没有输入其他代码,但单元格发生了变化。

问题可能是因为代码中正在进行大量的动态公式创建。没有把握。对 Excel 的怪癖了解不够。

编辑 2 有问题的单元格中缺少公式。很抱歉浪费了大家的时间。

那么缺少的公式如何改变单元格的值。不能! 问题应该是“如何确定一个单元格为什么没有变化”。 那我为什么不问呢?

我没有注意到与此单元格在同一列中的其他单元格包含公式。因为其他单元格正确更改了值而这个单元格没有正确更改,所以我认为是某些 VBA 代码无法正常工作,因此我试图追踪流氓代码。我想我不是一个经验丰富的 Excel 人,我不排除明显的流血,直接去了 VBA。呸!

【问题讨论】:

  • 您可以使用工作表更改事件并设置相交目标与单元格范围并设置断点。远射,但也许会给你提示
  • 按F8逐行运行代码,直到单元格内容发生变化,然后你就知道了?即使该行本身没有更改代码(可以调用另一个函数或过程),您也可以轻松地从那里回溯
  • 锁定单元格并保护工作表。这将防止单元格值发生变化,并且可能会在尝试设置值时打开您正在寻找的代码:如果可能存在错误处理程序,则将您的 VBA 选项设置为“中断所有错误”
  • @Ricardo 我做了,但没有调用堆栈。
  • @Danny 我猜 F8 就可以了。

标签: excel vba


【解决方案1】:

在包含您要跟踪的单元格的工作表上添加一个更改事件处理程序。

在该事件处理程序中,添加代码以在跟踪单元格发生更改时中断

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Cells(1, 1)) Is Nothing Then
        Stop
    End If

End Sub

Me.Cells(1, 1) 更改为您选择的单元格。

当代码中断时,打开调用堆栈,看看变化是从哪里来的

这是一个概念证明。我跑了ZX。调用堆栈在顶部显示 Change 事件。下一个函数是变为单元格的函数。

【讨论】:

  • 我这样做了,但没有调用堆栈。我在上面的评论中说过。
  • @notintoxs 那么更改您的单元格的代码在该工作簿中是 not 。您是否有其他工作簿打开运行代码,或安装了任何插件?
  • 和仅供参考,最好将此类信息添加到 Q
  • 对我来说,当更改单元格的代码从在同一个 excel 实例中打开的另一个工作簿运行时,调用堆栈方法仍然有效。
  • 谢谢@chris。你的 cmets 注意到了,我会再调查一下。
猜你喜欢
  • 2015-10-23
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
相关资源
最近更新 更多