Excel VBA运行时错误'1004':Range类Select方法失败问题
解决Run-time Error '1004': Select方法失败的问题
问题根源
当你从Sheet2的按钮触发代码时,当前活动工作表是Sheet2,但你的代码直接调用了Sheet1.Range(...).Select——VBA的Select方法要求目标工作表必须是当前活动工作表,否则就会抛出1004错误。这就是你遇到问题的核心原因。
最佳修复方案:移除不必要的Select和Selection
使用Select和Selection不仅容易引发这类错误,还会降低代码运行效率,最佳实践是直接操作单元格对象。下面是你的代码修改要点:
- 替换ClearContents和赋值语句
把所有类似下面的冗余代码:
Sheet1.Range("C2:GS2").Select Selection.ClearContents FA_TBL = Sheet1.Range("A2:GS2")
修改为直接操作对象的写法:
Sheet1.Range("C2:GS2").ClearContents FA_TBL = Sheet1.Range("A2:GS2").Value ' 加上.Value让赋值更明确
同理处理其他几处Select+ClearContents的代码:
' 原代码 Sheet1.Range("C4:GS4").Select Selection.ClearContents RW_TBL = Sheet1.Range("A4:GS4") ' 修改后 Sheet1.Range("C4:GS4").ClearContents RW_TBL = Sheet1.Range("A4:GS4").Value ' 原代码 Sheet1.Range("C5:GS5").Select Selection.ClearContents RN_TBL = Sheet1.Range("A5:GS5") ' 修改后 Sheet1.Range("C5:GS5").ClearContents RN_TBL = Sheet1.Range("A5:GS5").Value ' 原代码 Sheet1.Range("A9:GS208").Select Selection.ClearContents Sheet1.Range("C9").Select NG_TBL = Sheet1.Range("A8:GS208") ' 修改后 Sheet1.Range("A9:GS208").ClearContents NG_TBL = Sheet1.Range("A8:GS208").Value
- 修改排序代码
原排序代码依赖Select,而且Key1没有指定所属工作表,容易出现作用域问题:
Sheet1.Range("A8:" & TotalCellx & "100").Select Selection.Sort Key1:=Range(TotalCellx & "9"), Order1:=xlDescending, Header:=xlGuess _ , OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin Sheet1.Range("C9").Select
修改为直接对Range调用Sort,并明确指定Key1属于Sheet1:
Sheet1.Range("A8:" & TotalCellx & "100").Sort _ Key1:=Sheet1.Range(TotalCellx & "9"), _ Order1:=xlDescending, _ Header:=xlGuess, _ OrderCustom:=1, _ MatchCase:=False, _ Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin ' 如果不是必须定位到C9单元格,最后那个Select可以直接删掉
- 修复语法错误
你的DataUpdate函数里有一处多余的End If,会导致编译错误:
If (validateVer() = False) Then Exit Function End If ' 这里多余,直接删除
临时解决方案(不推荐)
如果你一定要保留Select语句,可以在操作Sheet1之前先激活它,比如在Model01开头添加:
Sub Model01() Sheet1.Activate ' 先激活Sheet1,确保Select能正常执行 Sheet1.Range("C8:GF8").Value = Sheet1.Range("C240:GF240").Value Sheet1.Range("B7").Value = Sheet1.Range("B240").Value r = DataUpdate() End Sub
但这种方法会切换用户的活动工作表,影响使用体验,而且代码更容易受用户操作干扰,所以优先推荐第一种方案。
内容的提问来源于stack exchange,提问作者MightGuy
相关产品推荐
相关产品推荐

