首页 > 解决方案 > vba excel:找出自动清除单元格的原因

问题描述

有一个问题我真的需要解决并需要您的帮助。

我查看了许多不同的 VBA Excel 网站来找到我的问题的答案,但不幸的是我一直无法找到我正在寻找的答案。我的“personal.xlsb”中有大约 200 个模块,其中包含大量代码。我还有很多用于几件事的表单和类模块。

这是我的问题: 由于某种原因,Activesheet 中的 range("B4") 在运行代码后会被自动清除。一般来说,使用哪个代码无关紧要,但在使用代码范围后,B4 将被清除。例如,我可以运行代码将 Activeworkbook.Fullname 复制到剪贴板。

当我在单元格被清除之后在 B4 中输入文本或其他内容时,之后它也会自动被清除。如果没有自动清除,我无法在单元格中输入任何文本。

我试图找出正在运行哪些代码来清除 B4,例如使用 Worksheet_SelectionChange(ByVal Target As Range) 或使用 Watch 窗口,但不幸的是到目前为止它对我没有帮助。

我没有在我的所有代码中找到引用 B4 的特定代码,或引用第 2 列第 4 行。我或多或少拼命寻找负责自动清除范围 B4 的代码。

例如,当我将它放在直接窗口中时:Range("B4").value = "B4 changed"它会自动删除。Worksheet_SelectionChange(ByVal Target As Range) 为时已晚,无法看到单元格被清除的原因,并且 B4 上的监视窗口没有发现任何东西,即使我认为应该这样做。我已经尝试了很多东西(轻描淡写)。

当我在直接窗口中更改它时:Application.Calculation = xlManual然后当我输入文本时它不会清除 B4,但是在我把它放回 xlAutomatic 之后,B4 无论如何都会被清除。我还检查了 usingApplication.EnableEvents = False是否有帮助,但它不会改变自动清除 B4 的任何内容。我还检查了一些公共声明是否会引用 B4,但它们没有。也没有涉及条件格式。

请帮我找出哪些代码正在自动运行以清除 B4,我真的很感激!!

亲切的问候,

理查德

标签: excelvba

解决方案


我会逐步解决这个问题。首先创建一个新的标准模块并包括:

Public WhoAmI As String

Sub ev_on()
    Application.EnableEvents = True
End Sub

Sub ev_off()
    Application.EnableEvents = False
End Sub

并在工作表代码区域:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Be_4 As Range
    Set Be_4 = Range("B4")
    If Intersect(Target, Be_4) Is Nothing Then Exit Sub
    MsgBox WhoAmI
End Sub
  1. 在您的流程中,您知道如果您尝试在其中手动输入一个值, B4将自动清除。
  2. ev_off
  3. 验证工作表是否未受保护且B4已解锁
  4. 验证B4不受数据验证的约束
  5. 尝试在B4中输入值
  6. 注意是否发生自动清除。

如果自动清除仍然发生,你有一个超出我能力的问题。如果自动清除被阻止,您将开始一个非常繁琐的过程,将您的潜艇一一更新以包括在顶部:

Sub anyroutine()
    WhoAmI = "anyroutine"
    ' more stuff
End Sub

所以所有可疑的潜艇都会在全局字符串中记录他们的名字。然后运行ev_on并尝试检测歹徒。


推荐阅读