VBA代码遍历工作表行统计数量始终返回0,请求排查
VBA代码排查:统计结果为0且意外修改RF工作表的问题
核心问题分析
你的代码存在两个关键缺陷,直接导致统计结果为0且RF工作表被误修改:
- 未限定Range所属工作表:所有
Range("B" & x)这类写法未指定工作表,默认会使用当前活动工作表。比如遍历Parts工作表时,如果活动表是某个RF工作表,就会错误读取RF表的B列,写入F列时也会误改RF表,同时无法匹配到目标数据,统计结果自然为0。 - 参数传递方式错误:
QtyWs子程序中wnCntr As Long默认是按值传递(ByVal),子程序内对计数器的修改不会同步回主过程,主过程拿到的始终是初始值0。
另外还有两个次要问题:定义了wsSheet但未使用;循环从x=1开始可能会处理表头数据(如果第一行是表头)。
修正后的代码
Sub GetQuantity() Dim ws As Worksheet Dim x As Long, lLastRow As Long Dim wsString As String Dim wnCntr As Long For Each ws In ActiveWorkbook.Worksheets ' 只处理指定的三个工作表 Select Case ws.Name Case "Parts", "Pipe", "Misc" lLastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row ' 从第2行开始(跳过表头,若数据从第1行开始则改回x=1) For x = 2 To lLastRow ' 排除开头为Par或Sto的行 If Left(ws.Range("B" & x).Value, 3) <> "Par" And Left(ws.Range("B" & x).Value, 3) <> "Sto" Then wsString = ws.Range("B" & x).Value ' 按引用传递计数器,确保修改能同步回主过程 QtyWs wsString, wnCntr ' 写入当前工作表的F列 ws.Range("F" & x).Value = wnCntr ' 重置计数器 wnCntr = 0 End If Next x End Select Next ws End Sub ' 修改参数为ByRef,让统计结果能返回给主过程 Sub QtyWs(wsString As String, ByRef wnCntr As Long) Dim ws As Worksheet Dim xx As Long, llLastRow As Long wnCntr = 0 ' 先重置计数器,避免累计之前的统计值 For Each ws In ActiveWorkbook.Worksheets ' 匹配名称包含RF的工作表 If ws.Name Like "*RF*" Then llLastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row ' 同样跳过表头(若数据从第1行开始则改回xx=1) For xx = 2 To llLastRow ' 严格限定当前RF工作表的Range,避免引用错误 If ws.Range("B" & xx).Value = wsString Then wnCntr = wnCntr + ws.Range("F" & xx).Value End If Next xx End If Next ws End Sub
关键修改说明
- 所有Range绑定指定工作表:比如
ws.Range("B" & x),确保读取和写入的都是当前遍历的目标工作表,彻底避免误操作RF表。 - 参数改为按引用传递:
QtyWs中ByRef wnCntr As Long,让子程序统计的数量能传递回主过程。 - 优化工作表判断逻辑:用
Select Case替代多个Or,代码更清晰易维护。 - 表头处理:循环从第2行开始(若你的数据从第一行开始,可改回x=1),避免处理表头数据导致的错误。
- 计数器重置:在
QtyWs开头重置计数器,确保每次统计都是独立的。
内容的提问来源于stack exchange,提问作者Jannette
相关产品推荐
相关产品推荐

