如何在Target对象中使用Defined Name替代单元格地址?
问题原因
- 访问
Target.Name报错的核心原因:只有当Target对应的单元格本身是某个定义名称的唯一引用对象时,该属性才会正常返回值,否则会直接抛出运行时错误,这个属性不适合用来做范围匹配判断。 If Not Intersect(Target, [Test]) Is Nothing Then写法报错的常见原因:[Test]是Evaluate("Test")的语法糖,若Test是工作簿级名称、或引用范围不在当前工作表、或Evaluate返回结果不是Range类型时,就会触发类型不匹配错误。
修正后的代码
同时修复了原代码中事件开关可能永久关闭的问题:
Private Sub Worksheet_Change(ByVal Target As Range) Dim testRng As Range ' 错误捕获,避免异常导致事件永久关闭 On Error GoTo ErrHandler Application.EnableEvents = False ' 显式获取定义名称Test对应的Range,避免方括号语法的隐式问题 ' 如果Test是全局工作簿级名称,用下面这句 Set testRng = ThisWorkbook.Names("Test").RefersToRange ' 如果Test是当前工作表专属的名称,换成下面这句 ' Set testRng = Me.Names("Test").RefersToRange ' 用Intersect判断范围匹配 If Not Intersect(Target, testRng) Is Nothing Then [Quarter_Select].Value = Target.Value End If ExitHandler: ' 无论是否报错都恢复事件开关 Application.EnableEvents = True Exit Sub ErrHandler: ' 可按需自行添加错误提示逻辑 Resume ExitHandler End Sub
额外注意事项
- 原代码仅在满足判断条件时才恢复
Application.EnableEvents = True,如果判断不成立事件开关会一直处于关闭状态,后续所有工作表事件都会失效,修正代码中增加了统一的退出恢复逻辑,避免该问题。 - 如果
Test定义名称引用的是多单元格范围,当前的Intersect判断逻辑也可以正常兼容,不需要额外修改。
内容的提问来源于stack exchange,提问作者Leedo
相关产品推荐
相关产品推荐

