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

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,提问作者박영종

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:43:06