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

点击单元格A10运行VBA宏时出现Run-time error '1004'问题求助

解决VBA运行时错误'1004':Range类的Select方法执行失败

错误原因

你遇到的1004错误,核心问题在于依赖Select/Activate方法操作单元格:

  • 虽然你先选中了OT Requests & Hours工作表,但Range("B5:AA22").Select没有明确指定所属工作表,若工作表处于保护状态、窗口锁定或其他环境干扰,就会触发选择失败;
  • Select/Activate是VBA中最容易出问题的写法之一,它依赖当前活动对象,一旦对象状态变化就会报错。

修复方案:移除Select/Activate,直接引用对象

下面是重构后的代码,彻底避免Select/Activate,同时明确指定工作表对象,从根源解决错误:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim wsOT As Worksheet
    Dim wsSun As Worksheet
    
    ' 只在点击A10时执行逻辑
    If Not Intersect(Me.Range("A10"), Target) Is Nothing Then
        ' 初始化工作表对象
        Set wsOT = ThisWorkbook.Worksheets("OT Requests & Hours")
        Set wsSun = ThisWorkbook.Worksheets("Sun")
        
        ' 检查OT工作表是否被保护,若保护则临时取消(根据实际情况修改密码)
        If wsOT.ProtectContents Then
            wsOT.Unprotect Password:="" ' 有密码就填在引号里
        End If
        
        ' 执行排序操作,全程不使用Select
        With wsOT.Sort
            .SortFields.Clear
            .SortFields.Add2 Key:=wsOT.Range("C5:C22"), _
                             SortOn:=xlSortOnValues, _
                             Order:=xlDescending, _
                             DataOption:=xlSortNormal
            .SortFields.Add2 Key:=wsOT.Range("Z5:Z22"), _
                             SortOn:=xlSortOnValues, _
                             Order:=xlAscending, _
                             DataOption:=xlSortNormal
            .SortFields.Add2 Key:=wsOT.Range("AA5:AA22"), _
                             SortOn:=xlSortOnValues, _
                             Order:=xlAscending, _
                             DataOption:=xlSortNormal
            .SetRange wsOT.Range("B5:AA22")
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        
        ' 恢复工作表保护(如果之前取消了的话)
        If Not wsOT.ProtectContents Then
            wsOT.Protect Password:="" ' 对应上面的密码
        End If
        
        ' 直接设置A10单元格公式,无需Select
        wsSun.Range("A10").FormulaR1C1 = _
            "=IF(AND(R[2]C[4]=""OT"",'OT Requests & Hours'!R[-5]C[2]=""Mid""),'OT Requests & Hours'!R[-5]C[1],"""")"
    End If
End Sub

额外优化点

  • 使用Me.Range("A10")代替Range("A10"),明确引用当前代码所在工作表的A10单元格;
  • 用工作表变量wsOT和wsSun统一管理,避免重复写长串的工作表引用;
  • 添加了工作表保护检查逻辑,防止因工作表保护导致的操作失败(如果你的工作表没有保护,可以删除这部分代码)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:10:26