【问题标题】:Worksheet_Change Event not firingWorksheet_Change 事件未触发
【发布时间】:2018-09-13 11:21:04
【问题描述】:

我的 Excel 项目在家中正常运行(使用 Excel 2010),但不能在两台工作计算机上正常运行(使用 Excel 2016),我怀疑 Worksheet_Change 事件是问题。

当用户进行更改时,黄色条(在屏幕截图中)应该再次变为白色,但事实并非如此。我在 2 台工作计算机上收到 2 种不同的响应。

在代码中需要指出两点:

  1. 在某些地方我使用 vbColor 扩展名,在其他地方我必须使用数字代码。

  2. 一台计算机根本没有触发Worksheet_Change 事件。我会注意到更改事件位于代码的顶部,尽管这与它没有任何关系。

感谢您的建议和详细解释,以帮助我学习。

Private Sub Worksheet_Change(ByVal Target As Range) 'Check for On-Time and Delays then change the Command Button Colors to show completed.  

'Return headers to white after jump to
Range("B3:I3,O3:V3,B28:I28,O28:V28,B53:I53,O53:V53,B78:I78,O78:V78,B103:I103,O103:V103,B128:I128,O128:V128,B153:I153,O153:V153").Interior.Color = vbWhite
'Check for On Time and Delayed Trips
'Trip 1 Scan Ready
If IsEmpty(Range("L3").Value) = False Then
    If Range("L3").Value > Range("I3").Value Then 'If actual is greater than Departure
        'If Delayed check for a delay code
        If IsEmpty(Range("L24").Value) Then 'If Delay code is missing
            Range("K24:L25").Interior.Color = 16711935
            CommandButton1.BackColor = 16711935
            CommandButton1.ForeColor = vbBlack
        Else 'If Delay Code is present check for delay time
            If IsEmpty(Range("L25").Value) Then
                Range("K24:L25").Interior.Color.Index = 16711935
                CommandButton1.BackColor = 16711935
                CommandButton1.ForeColor = vbBlack
            Else
                CommandButton1.BackColor = vbRed
                CommandButton1.ForeColor = vbWhite
                Range("K24:L25").Interior.Color = vbWhite
            End If
        End If
    Else
        'Flight was on Time
        CommandButton1.BackColor = 32768 '32768 = Green
        CommandButton1.ForeColor = vbWhite
        Range("K24:L25").Interior.Color = vbWhite
    End If
End If

【问题讨论】:

  • not firing the Worksheet_Change 可能是安全设置,颜色尝试使用 Excel RGB 颜色示例.Color = RGB(0, 0, 0)
  • ^ 对于触发事件,请尝试运行此行 Application.EnableEvents = True,对于白条,在行 If Range("L3").Value > Range("I3").Value 上放置一个断点并检查两个单元格的值(和时间格式)
  • 保罗,我在第一次活动之前把那句话放进去吗。
  • 像这样创建一个单独的 Sub:Sub ee(): Application.EnableEvents = True: End Sub,然后按 F5
  • @pica - 同样,他不得不在代码中的某个位置禁用事件;我不明白是什么让你相信他这样做了?我不是要争论——只是好奇是什么导致了这种“预感”。另外 - 一个快速确认的方法是 [CTRL]+[G] 然后 ?Application.EnableEvents[Enter]

标签: vba excel events onchange


【解决方案1】:

我有一个不同的问题。我以新名称保存了我的工作表,然后添加了该事件的代码。为了让它工作,我不得不关闭工作表并重新打开它。然后它显示了启用宏的按钮,代码开始工作。希望这对某人有所帮助。

韦德

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。 我检查了一切。 一切似乎都是正确的(启用的宏、EnableEvents=True 等)。 我关闭并打开 Excel。 问题依然存在。 我无能为力。 我重新启动了 Windows。 问题消失了。 重新启动花了 7 分钟(所有应用程序都关闭并重新启动),试图找出原因需要更多时间。也许我可以尝试在任务管理器中找到并杀死每个 Excel 进程。 我不喜欢给人们“尝试重新启动”的建议,但是,Windows 就是 Windows。

    【讨论】:

      【解决方案3】:

      可能有多种因素导致此问题。一种诊断方法是像这样进行故障排除:

      在您的程序开始时,就在这一行之后:

      Private Sub Worksheet_Change(ByVal Target As Range)
      

      ...添加一个临时行:

      MsgBox "Changed: " & Target.Address
      

      ...然后去更改您的工作表中的某些内容(任何更改都不会像您期望的那样触发事件)。

      会发生以下两种情况之一

      1. 您将弹出一个消息框,显示刚刚更改的单元格引用。
        这表明事件正在正确触发,因此问题必须在您的代码中。

      2. 或者,您不会弹出消息框。这表明事件触发,这可能是由以下几种可能性引起的:

        • 工作簿中的宏是否完全禁用?这通常在从外部来源收到的工作簿上自动完成。将工作簿保存到本地计算机或网络上的受信任位置(而不是从电子邮件中打开)。其他代码部分是否正常运行?当您关闭/重新打开文件时,是否会收到有关宏安全性的警告?另外,请尝试重新启动计算机。

        • 其他安全设置可能是个问题。你曾经在这些机器上运行过 VBA 吗?您可以在以下位置确认代码能够在 Excels 的安全设置中运行:
          文件选项信任中心信任中心设置宏设置

          除了确保在那里启用宏之外,您还可以在信任中心检查受信任的位置,然后将您的文档保存在列出的位置,或添加一个新位置。将“减少”保存在这些位置的文档的安全设置。

        • EnableEvents 是否在您的代码的其他地方被故意禁用?如果您编写了所有代码,您应该知道您是否在某个时候设置了EnableEvents = False。也许这是故意的,但它没有被重新启用。

      请记住删除您临时添加的行,否则每次进行更改时,MsgBox 都会很快弹出来烦人。 :)

      【讨论】:

      • 要快速测试 EnableEvents 部分,您可以在即时窗口中输入 Application.EnableEvents = True,按回车键,然后重试。
      • Application.EnableEvents 是我的杀手! +1
      【解决方案4】:

      您说“更改事件位于代码的顶部”。只有将代码放入相关的工作表模块时,才会触发工作表更改事件。如果您已将相关代码放在非工作表模块中(例如,“模块 1”或类似的,列在对象资源管理器中的“模块”分支下),那么这就是问题所在。

      此外,您真的不应该在 VBA 代码中硬编码单元格引用,例如“L3”,因为如果您(或用户)稍后在这些行/列的上方/左侧插入行/列,则每个硬引用都需要修改参考。相反,在 Excel 中为这些单元格分配有意义的命名范围,并在您的 VBA 中使用这些单元格。

      此外,当使用像你正在做的事件处理程序时,你应该有类似If not intersect(Target, InputRange) is nothing then... 这样的代码只有在感兴趣的事情发生变化时才会运行。

      【讨论】:

      • ...但它在家里对他有用。 (我也删除了我的其他评论,我以为你指的是告诉他在事件中启用事件):)
      • 我在想(猜测)他可能将代码的位置移动到了工作和家用电脑之间。
      • 感谢所有 cmets 和建议。我们能够找到问题所在。我的同事正在尝试从 Outlook 运行该文件。当他真正将文件保存到计算机并以这种方式运行时,一切都按计划进行。
      • 酷。您能否将此添加为答案而不是评论,以便其他人知道问题已解决,而无需阅读所有 cmets?干杯。
      • 另外,杰夫,您的建议正是我的本意。以这种方式编码的原因是因为它的设置方式。我和我一样具体,以确保我们只捕获特定的信息变化。但是我会说,一切都是平等的,我边走边学。输入范围对我来说似乎有点困难,因为它们涵盖了很大的范围,但我了解到我可以列出要触发的代码的特定单元格并且有效,它处理我似乎是的其余 if 语句有困难。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 2010-11-08
      • 2019-01-31
      • 2013-04-09
      • 2015-07-25
      相关资源
      最近更新 更多