1

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

因此,如果有人设置 B4,然后更改 B2,则会出现无效组合。所以,如果上面的单元格值被改变,它会强制下面的单元格为默认值(如果B1为值2时B4只能为值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 为其默认值,但我收到编译错误“未定义子或函数”

老实说,我不知道是什么原因造成的。M$ help 说这是因为 sub 过程拼写错误,但我复制了其中的一些代码,并根据很多来源进行了检查。

4

2 回答 2

9

您正在使用Sheet而不是Sheets.

通过使用Sheet编辑器认为您正在寻找一个名为的新函数Sheet并且在任何地方都找不到它定义(因为它不是 VBA 定义的函数),因此它给出了该错误。

此外,您可能会想要使用"around humanDwarf此外,除非在某处定义了这些,否则

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

于 2012-10-02T15:13:37.797 回答
2

除了 enderland 涵盖的内容之外的三件事。

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

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

  3. 每当您关闭事件时,请使用错误处理,否则如果您遇到错误,代码将不会在下次运行。

这是一个例子

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
于 2012-10-02T20:47:08.967 回答