点击单元格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
相关产品推荐
相关产品推荐

