我正在尝试创建一些代码,以便在另一个单元格发生更改时重置单元格。有三个下拉单元格,每个单元格依赖于它之前的单元格(B3依赖于B2,B4依赖于B3和B2)。
所以,如果某人设置B4,然后更改B2,则会出现无效组合。因此,如果更改上面的单元格值,它将强制下面的单元格为默认值(如果B1为值2时B4只能为值3,则如果B1更改为值1,则B4强制为值1)< / p>
我现在使用的代码是:
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 $帮助说这是因为子程序拼写错误,但是我已经复制了一些代码并针对很多来源进行了检查。
答案 0 :(得分:8)
您使用Sheet
代替Sheets
。
通过使用Sheet
编辑器认为您正在寻找一个名为Sheet
的新函数,并且无法在任何地方找到它(因为它不是VBA定义的函数),因此它会给出该错误。< / p>
此外,您可能希望在"
,human
等处使用Dwarf
,除非在某处定义了这些内容。
最后,我强烈建议您在每个模块的顶部使用Option Explicit
,因为这有助于防止出现许多错误(例如Human
{{1}这个文本不在Dwarf
)中。
答案 1 :(得分:2)
除了恩德兰所涵盖的三件事之外。
您不需要工作表名称。据了解,该代码将在当前表格上运行
每当您处理Worksheet_Change
事件时。如果要将数据写入单元格,请始终关闭事件。这是必需的,以便代码不会进入可能的无限循环
每当您关闭事件时,请使用错误处理,否则如果收到错误,代码将无法在下次运行。
这是一个例子
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