You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel VBA运行时错误1004:应用程序定义或对象定义错误求助

解决VBA Runtime Error 1004(Application-defined or Object-defined error)问题

常见诱因及对应解决方法

  • 事件循环触发:修改AC/AD列单元格时,会再次触发Worksheet_Change事件,递归调用引发错误。
    解决:操作前禁用事件,完成后恢复:

    Application.EnableEvents = False
    ' 执行单元格赋值操作
    Application.EnableEvents = True
    
  • Target包含多单元格范围:批量粘贴数据到E列时,Target为多单元格区域,直接调用Target.Row会导致逻辑错误或触发异常。
    解决:遍历交集内的每个单元格逐个处理:

    Dim cell As Range
    For Each cell In Intersect(Target, myTableRange)
        ' 针对单个cell执行逻辑
    Next cell
    
  • 工作表处于保护状态:工作表被保护时,修改AC/AD列会触发权限错误。
    解决:临时解除保护(有密码需添加密码参数),操作后重新保护:

    Me.Unprotect ' 带密码用Me.Unprotect Password:="yourpassword"
    ' 执行单元格赋值操作
    Me.Protect ' 带密码用Me.Protect Password:="yourpassword"
    

修正后的完整代码

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim myTableRange As Range
    Dim myDateTimeRange As Range
    Dim myUpdatedRange As Range
    Dim cell As Range
    
    Set myTableRange = Me.Range("E1:E1000") ' 用Me限定当前工作表,避免跨表引用错误
    
    If Intersect(Target, myTableRange) Is Nothing Then Exit Sub
    
    Application.EnableEvents = False
    
    For Each cell In Intersect(Target, myTableRange)
        Set myDateTimeRange = Me.Range("AC" & cell.Row)
        Set myUpdatedRange = Me.Range("AD" & cell.Row)
        
        If myDateTimeRange.Value = "" Then
            myDateTimeRange.Value = Now
        End If
        
        myUpdatedRange.Value = Now
    Next cell
    
    Application.EnableEvents = True
End Sub

额外注意事项

  • 用Me.Range替代直接Range,明确限定当前工作表,避免因激活其他工作表导致的引用错误。
  • 若需指定时间格式,可改用Format(Now, "yyyy-mm-dd hh:mm:ss")。

内容的提问来源于stack exchange,提问作者Lowie Feyt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:55:19