Excel VBA运行时错误1004:_Worksheet对象范围失败求助
解决VBA运行时错误1004:Range对象引用失败
这个错误的核心原因其实很清晰——你在Set myrange = ws.Range(Cells(15, 3), Cells(lrow, 3))这行代码里,Cells(15,3)和Cells(lrow,3)没有明确绑定到ws(也就是Sheet9)这个工作表对象上。
VBA里如果不给Cells指定所属工作表,它默认会引用当前活动工作表的单元格。当你的用户窗体触发代码时,如果Sheet9不是当前激活的工作表,或者在Excel 2010这类对对象引用要求更严格的版本中,就会出现1004错误——本质是你试图用来自不同工作表的单元格,去定义Sheet9的Range对象,这就造成了引用冲突。
修正后的完整代码
Option Explicit ' 强制变量声明,避免潜在的拼写/未初始化错误 Sub AutoSRIn() Dim ws As Worksheet Dim lrow As Long Dim myrange As Range Dim cell As Range Dim i As Long ' 显式声明计数器变量 Set ws = Sheet9 i = 0 ' 初始化序列号起始值 ' 关键:获取C列最后一行时,给Rows.Count也加上ws前缀,避免跨表引用 lrow = ws.Cells(ws.Rows.Count, 3).End(xlUp).Row ' 处理边界情况:如果C列最后一行数据在C15之上,直接退出 If lrow < 15 Then MsgBox "C15及以下无数据,无需生成序列号" Exit Sub End If ' 核心修正:给所有Cells加上ws前缀,确保引用的是Sheet9的单元格 Set myrange = ws.Range(ws.Cells(15, 3), ws.Cells(lrow, 3)) ' 遍历生成序列号,同时移除不必要的Select操作(Select会降低效率且易出错) For Each cell In myrange cell.Offset(0, -1).Value = i + 1 i = i + 1 Next cell End Sub
额外优化说明
Option Explicit:这是VBA编写的最佳实践,强制所有变量必须声明,能帮你提前发现拼写错误、未初始化变量这类隐性问题。- 初始化变量
i:原代码里i没有显式初始化,虽然VBA会默认给变体类型赋值0,但显式初始化更清晰可靠。 - 边界情况处理:如果C列最后一行数据在C15之上,直接弹出提示并退出,避免创建无效的Range对象。
- 移除
Select操作:ws.Range("B15").Select完全没必要,直接操作单元格对象不仅效率更高,还能避免因工作表切换导致的意外错误。
修正后的代码在Excel 2010及更高版本都能稳定运行,不管Sheet9是不是当前活动工作表。
内容的提问来源于stack exchange,提问作者RkVeer
相关产品推荐
相关产品推荐

