首页 > 解决方案 > Excel VBA Target.Address 被修改并导致错误 13 类型不匹配

问题描述

原型帖子:VBA 新手,在阅读了多个帖子/网站后无法解决问题,现在转向这里所有出色的人,他们的帖子让我走到了这一步。

我在 C 列中有一个带有数据验证的工作表(列表;强制选择是/否选项)。如果用户在 C7 中选择“否”,则 C9:C11 需要自动立即填充为“否”。我已经通过以下方式使它起作用:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$C$7" And Target.Value = "No" Then
    Range("$C$9").Value = "No"
    Range("$C$10").Value = "No"
    Range("$C$11").Value = "No"
    End If
End Sub

我在同一个工作表(即 Sheet5)上还有一个文本框,单击该文本框会触发一个清除 C6:C7 内容的宏。此重置宏位于 General 下的模块中。

Sub C_B_Reset()
Sheet5.Range("C6:C7").ClearContents
End Sub

单独来说,这些都可以正常工作,但是当两者都存在时,它会在触发 Reset 宏后导致 Target.Address 出现 Type 13 错误。触发 Reset 宏后,“If Target.Address”部分解析为 Reset 宏中引用的范围(即 C6:C7)。因为“If Target.Address”需要一个单一的、绝对的单元格引用(例如,$C$7),所以它会抛出不匹配代码,因为当鼠标悬停在它上面时它会解析为 (C6:C7)。

即使完全删除了 Reset 宏,如果在 Target.Address 代码中使用以下内容,也会出现同样的问题:

Range("$C$9:$C$11").Value = "No"

Target.Address 然后解析为 "$C$9:$C$11" 并抛出 Type 13 mismatch 错误。

看来,如果“范围”用于引用任何其他宏中的单元格范围,它会自动分配为 Target.Address。但是,如果 Range 仅引用单个单元格,则不会发生这种情况(这就是 Worksheet_Change 代码中 C9 到 C11 有单独行的原因)。

我确定我使用了不正确的术语,但我希望我解释得足够好,因为我肯定会感谢一些帮助。

谢谢参观,

标签: excelrangetype-mismatch

解决方案


“Excel VBA Target.Address 被修改并导致错误 13 类型不匹配”

Target.Address不是这里的问题...Target是已更改的单元格,当您同时清除和时Target.Address也会如此。$C$6:$C$7C6C7

主要问题是这样的:

... And Target.Value = "No" ...

当是一个多单元格范围时,这将失败并出现Type Mismatch错误,因为 then是一个二维数组,您无法与.TargetTarget.ValueVariant"No"

此外,通常的方法是使用Intersect而不是考虑Target.Address.

如果你只关心C7,那么也许这样写:

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Me.Range("C7")) Is Nothing Then
       If Me.Range("C7").Value = "No" Then
            On Error GoTo SafeExit
            Application.EnableEvents = False ' Avoid re-triggering the event
            Me.Range("C9:C11").Value = "No"
       End If
    End If

SafeExit:
    Application.EnableEvents = True
End Sub

推荐阅读