Excel VBA 2016中Worksheet_Change事件报错Error 1004咨询
解决Worksheet_Change中无命名单元格触发1004错误的问题
嘿,我完全懂你碰到的这个坑——当你修改没有定义名称的单元格时,Target.Name.Name会直接抛出1004运行时错误,这时候你用IsNull或者Is Nothing根本没机会生效,因为还没走到判断那一步就报错了。
原因很简单:当单元格没有定义名称时,访问Target.Name属性本身就会触发错误,它不会返回Nothing或者Null,所以你之前的判断逻辑根本执行不到。我们得用错误捕获的方式来处理这个场景。
方案一:直接在事件中添加错误捕获
修改你的代码,先捕获访问Target.Name时可能出现的错误,再进行后续判断:
Private Sub Worksheet_Change(ByVal Target As Range) Dim targetName As String ' 临时启用错误捕获,避免无命名单元格直接报错 On Error Resume Next targetName = Target.Name.Name ' 检查是否成功获取到名称(无名称时Err.Number会不为0) If Err.Number = 0 Then If Left(targetName, 6) = "CritFA" Then critFA targetName End If End If ' 恢复默认的错误处理机制 On Error GoTo 0 End Sub
方案二:封装一个安全获取名称的辅助函数
如果需要在多个地方用到这个逻辑,可以写一个辅助函数,让代码更清晰:
' 安全获取单元格的定义名称,无名称时返回空字符串 Function GetRangeName(rng As Range) As String On Error Resume Next GetRangeName = rng.Name.Name ' 捕获错误,返回空字符串表示无名称 If Err.Number <> 0 Then GetRangeName = vbNullString End If On Error GoTo 0 End Function ' 修改后的Worksheet_Change事件 Private Sub Worksheet_Change(ByVal Target As Range) Dim targetName As String targetName = GetRangeName(Target) ' 只有当获取到名称且前缀符合时才执行逻辑 If targetName <> vbNullString And Left(targetName, 6) = "CritFA" Then critFA targetName End If End Sub
额外优化:避免事件递归触发
在Worksheet_Change事件中,如果你在critFA过程里修改了单元格内容,可能会递归触发这个事件。建议加上事件禁用的包裹:
Private Sub Worksheet_Change(ByVal Target As Range) Dim targetName As String Application.EnableEvents = False ' 禁用事件,防止递归 On Error Resume Next targetName = Target.Name.Name If Err.Number = 0 Then If Left(targetName, 6) = "CritFA" Then critFA targetName End If End If On Error GoTo 0 Application.EnableEvents = True ' 恢复事件 End Sub
内容的提问来源于stack exchange,提问作者Luis Pulido
相关产品推荐
相关产品推荐

