Worksheet_Change事件未触发

时间:2018-04-04 02:27:40

标签: excel vba excel-vba events onchange

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

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

代码中要指出两件事:

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

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

  3. 我很感激建议和详细解释,以帮助我学习。

    screenshot

    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
    

4 个答案:

答案 0 :(得分:3)

可能有很多因素导致了这个问题。诊断的一种方法是进行故障排除:

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

Private Sub Worksheet_Change(ByVal Target As Range)

...添加临时行:

MsgBox "Changed: " & Target.Address

...然后改变工作表中的内容(无论发生什么变化都不会像你期望的那样触发事件)。

将会发生以下两件事之一

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

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

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

    • 其他安全设置可能是个问题。你有没有在这些机器上运行VBA?您可以确认确保代码能够在Excel中运行'安全设置:
      文件选项信任中心信任中心设置宏设置

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

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

  3. 请记住删除您临时添加的行,或者每次更改时弹出MsgBox会很快出现问题。 :)

答案 1 :(得分:0)

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

另外,你真的不应该在你的VBA代码中对像“L3”这样的单元格引用进行硬编码,因为如果你(或用户)稍后在这些上方/左侧插入行/列,每个硬引用都需要修改引用。而是在Excel中为这些单元格分配有意义的命名区域,并在VBA中使用它们。

此外,在使用像您一样的事件处理程序时,您应该使用类似If not intersect(Target, InputRange) is nothing then...的内容,以便代码仅在感兴趣的内容发生更改时才会运行。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

韦德