Excel VBA Rows.Count方法异常:指定工作表仍返回错误行数
问题分析与解决方案
嘿,这个坑我之前也踩过!问题出在你代码里的Cells对象没有明确指定归属的工作表——VBA里如果不写清楚,它会默认调用当前活动工作表,而不是你以为的src.Worksheets("Example")。
你看这段出问题的代码:
iTotalRows = src.Worksheets("Example").Range("B1:B" & Cells(src.Worksheets("Example").Rows.Count, "B").End(xlUp).Row).Rows.Count
这里的Cells(src.Worksheets("Example").Rows.Count, "B")其实是在调用当前活动工作表的Cells,而不是源工作簿里Example工作表的Cells!这就导致当你切换过其他工作表再关闭后,活动工作表变了,返回的行数自然不对。
修复方案
核心就是所有Range、Cells对象都要明确指定所属的工作表(甚至工作簿),彻底避免VBA使用默认的活动对象。
给你修改后的代码,加了详细注释:
Sub Example() On Error GoTo ErrHandler Application.ScreenUpdating = False Dim src As Workbook Dim wsSrc As Worksheet ' 新增工作表变量,方便后续统一调用 '//以只读模式打开源Excel工作簿 Set src = Workbooks.Open(Cells(103, 103).Value, True, True) 'Set src = Workbooks.Open("E:\Example\Example\Example.xlsx", True, True) '//明确指定目标工作表,后续所有操作都绑定这个变量 Set wsSrc = src.Worksheets("Example") '//从源工作簿获取总行数 Dim iTotalRows As Long ' 所有Cells、Range都绑定到wsSrc,彻底摆脱活动工作表的干扰 iTotalRows = wsSrc.Range("B1:B" & wsSrc.Cells(wsSrc.Rows.Count, "B").End(xlUp).Row).Rows.Count MsgBox iTotalRows Dim iCnt As Long Dim 행 As Integer ....... ErrHandler: Application.ScreenUpdating = True ' 记得恢复屏幕更新,避免Excel卡住 If Err.Number <> 0 Then MsgBox "错误:" & Err.Description, vbExclamation End If End Sub
额外的最佳实践
- 尽量给工作表、工作簿定义专属变量(比如上面的
wsSrc),不仅代码更清晰,还能从根源避免对象归属错误 - 永远不要依赖VBA的默认对象(比如不指定工作表的Cells、Range,不指定工作簿的Worksheets),除非你明确知道自己在做什么
- 错误处理块里一定要恢复
ScreenUpdating,不然Excel会一直处于不刷新状态,影响正常使用
内容的提问来源于stack exchange,提问作者박영종
相关产品推荐
相关产品推荐

