Excel VBA Target.Address 正在修改并导致错误 13 类型不匹配

Excel VBA Target.Address being modified and causing Error 13 type mismatch

原型 post:VBA 的新手,在阅读多个 posts/websites 后无法解决问题,现在求助于这里所有很棒的人 post让我走到这一步。

我有一个在 C 列中进行数据验证的工作表(列表;强制选择 Yes/No 选项)。如果用户在 C7 中选择 "No",则 C9:C11 需要自动并立即填充为 "No." 我已经通过以下方式实现了它:

Private Sub Worksheet_Change(ByVal Target As Range)

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

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

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

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

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

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

然后 Target.Address 解析为“$C$9:$C$11”并抛出类型 13 不匹配错误。

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

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

感谢观看,

"Excel VBA Target.Address being modified and causing Error 13 type mismatch"

Target.Address 不是这里的问题... Target 是已更改的单元格,因此当您清除时 Target.Address 将是 $C:$C C6C7.

主要问题是:

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

Target 是一个多单元格范围时,这将失败并出现 Type Mismatch 错误,因为 Target.Value 是一个二维 Variant 数组,您可以'与 "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

考虑:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$C" And Target.Value = "No" Then
    Application.EnableEvents = False
        Range("$C").Value = "No"
        Range("$C").Value = "No"
        Range("$C").Value = "No"
    Application.EnableEvents = True
End If
End Sub

和:

Sub C_B_Reset()
    Application.EnableEvents = False
        Sheet5.Range("C6:C7").ClearContents
    Application.EnableEvents = True
End Sub

编辑#1:

Try this event macro instead:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$C" Then
        If Target.Value = "No" Then
            Application.EnableEvents = False
                Range("$C").Value = "No"
                Range("$C").Value = "No"
                Range("$C").Value = "No"
            Application.EnableEvents = True
        End If
    End If
End Sub