Excel,WorkSheet_Change给Sub或Function未定义

我正在尝试创build一些代码来重置另一个单元格更改时的单元格。 有三个下拉单元,每个单元依赖于它之前的单元(B3依赖于B2,而B4依赖于B3和B2)。

所以,如果有人设置了B4,那么改变B2,就会出现无效组合。 因此,如果上面的单元格值发生变化,它将强制下面的单元格为默认值(如果B4只能在值为2时为值3,那么如果B1被更改为值1,则B4被强制为值1)

我现在使用的代码是这样的:

Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Target.Worksheet.Range("B2")) Is Nothing Then If Sheet("Talent Sheet").Range("B2") = Human Then Sheet("Talent Sheet").Range("B3") = Warrior Sheet("Talent Sheet").Range("B4") = "Human Noble" Else If Sheet("Talent Sheet").Range("B2") = Elf Then Sheet("Talent Sheet").Range("B3") = Warrior Sheet("Talent Sheet").Range("B4") = "City Elf" Else If Sheet("Talent Sheet").Range("B2") = Dwarf Then Sheet("Talent Sheet").Range("B3") = Warrior Sheet("Talent Sheet").Range("B4") = "Dwarf Commoner" End If End If End If 

这将会,当B2改变时,强制B3和B4为默认值,但是我得到一个编译错误“Sub or Function is not defined”

我真的不知道是什么原因造成的。 M $的帮助说这是因为子程序拼错了,但我已经复制了一些代码,并检查了很多来源。

您正在使用Sheet而不是Sheets

通过使用Sheet ,编辑器认为您正在寻找名为Sheet的新函数,并且无法在任何地方find它(因为它不是VBA定义的函数),所以会出现该错误。

另外,你很可能会想要使用" humanDwarf等等,除非这些是在某个地方定义的。

最后,我强烈build议在每个模块的顶部使用Option Explicit ,因为这将有助于防止许多错误(例如Human Dwarf文本不在此类中)。

除了恩德兰已经涵盖的三件事。

  1. 您不需要工作表名称。 据了解,代码将在当前表单上运行

  2. 每当您使用Worksheet_Change事件。 如果要将数据写入单元,请始终closures事件。 这是必需的,以便代码不会进入可能的无限循环

  3. 无论何时closures事件,如果出现错误,请使用error handling,否则代码将不会在下一次运行。

这是一个例子

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo Whoa Application.EnableEvents = False ' '~~> Rest of the code ' LetsContinue: Application.EnableEvents = True Exit Sub Whoa: MsgBox Err.Description Resume LetsContinue End Sub