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
C6
和 C7
.
主要问题是:
... 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
原型 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
C6
和 C7
.
主要问题是:
... 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