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

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

关键修改说明

  1. 所有Range绑定指定工作表:比如ws.Range("B" & x),确保读取和写入的都是当前遍历的目标工作表,彻底避免误操作RF表。
  2. 参数改为按引用传递:QtyWs中ByRef wnCntr As Long,让子程序统计的数量能传递回主过程。
  3. 优化工作表判断逻辑:用Select Case替代多个Or,代码更清晰易维护。
  4. 表头处理:循环从第2行开始(若你的数据从第一行开始,可改回x=1),避免处理表头数据导致的错误。
  5. 计数器重置:在QtyWs开头重置计数器,确保每次统计都是独立的。

内容的提问来源于stack exchange,提问作者Jannette

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:53:20