我的Excel项目在家中正常运行(使用 Excel 2010 ),但不能在两台工作计算机上运行(使用 Excel 2016 ),我怀疑Worksheet_Change
事件是问题。
当用户进行更改时,黄色条(在屏幕截图中)应该再次变白,但事实并非如此。我在2台工作计算机上收到2个不同的回复。
代码中要指出两件事:
在某些地方,我使用vbColor
个扩展程序,而在其他地方,我必须使用数字代码。
一台计算机根本没有触发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
答案 0 :(得分:3)
可能有很多因素导致了这个问题。诊断的一种方法是进行故障排除:
在程序开始时,就在这一行之后:
Private Sub Worksheet_Change(ByVal Target As Range)
...添加临时行:
MsgBox "Changed: " & Target.Address
...然后改变工作表中的内容(无论发生什么变化都不会像你期望的那样触发事件)。
将会发生以下两件事之一:
您将弹出一个消息框,显示刚刚更改的内容的单元格引用。
这表明事件正在正常触发,因此问题必须在您的代码中。
或者,您不会弹出一个消息框。这表明事件不触发,这可能是由几种可能性引起的:
工作簿中是否完全禁用了宏?这通常是在从外部来源收到的工作簿上自动完成的。将工作簿保存到本地计算机或网络上的受信任位置(而不是从电子邮件中打开)。代码的其他部分是否正常运行?关闭/重新打开文件时,是否有关于宏安全性的警告?另外,请尝试重新启动计算机。
其他安全设置可能是个问题。你有没有在这些机器上运行VBA?您可以确认确保代码能够在Excel中运行'安全设置:
文件→选项→信任中心→信任中心设置→宏设置
除了确保在那里启用宏之外,您还可以在信任中心检查受信任位置,并将文档保存在列出的位置,或添加新位置。安全设置将减少"用于保存在这些位置的文档。
代码中的其他位置是否故意禁用EnableEvents
?如果您编写了所有代码,则应该知道是否在某个时刻设置了EnableEvents = False
。也许这是故意的,但它没有被重新启用。
请记住删除您临时添加的行,或者每次更改时弹出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)
我有一个不同的问题。我用新名称保存了工作表,然后添加了该事件的代码。为了使其正常工作,我不得不关闭工作表并重新打开它。然后显示了启用宏的按钮,代码开始工作。希望这对某人有帮助。
韦德