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

遍历工作簿工作表匹配代码汇总工时的VBA代码调试求助

VBA代码总工时为0的问题排查与修复

核心问题与修复点

  • 未定义的Row变量导致赋值失败
    这是所有总工时为0的核心原因:代码中TotalsTemp = CDbl(Row.Cells(z, 10))里的Row是未声明的变量,VBA会将其视为空对象,无法获取J列(第10列)的工时值,累加操作完全失效。
    修复:将Row.Cells(z, 10)替换为ws.Cells(z, 10),确保从当前遍历的工作表中读取数据。

  • 遍历范围错误包含汇总表
    原代码For Each ws In ActiveWorkbook.Worksheets会遍历所有工作表,包括最后一张"Job Totals",既浪费资源,还可能引入无效数据。
    修复:添加判断跳过汇总表:

    For Each ws In ActiveWorkbook.Worksheets
        If ws.Name <> "Job Totals" Then ' 跳过目标汇总表
            ' 原有行循环逻辑放在此处
        End If
    Next ws
    
  • 循环范围不匹配
    原代码累加逻辑的x循环是For x = 2 To 53,但NumOfTotals被赋值为71,最后写回数据时是For x = 2 To NumOfTotals,导致x=54到71的行从未被累加,数据自然为0。
    修复:将累加循环的x范围改为For x = 2 To NumOfTotals,与后续写回范围保持一致。

  • 数据类型不匹配导致匹配失败
    如果Job Code/Sub-Code在不同工作表中是不同数据类型(比如一个是文本型数字,一个是数值型),=判断会返回False,无法触发累加。
    修复:统一转换为字符串后再比较:

    If CStr(ws.Cells(z, 11)) = CStr(Sheets("Job Totals").Cells(x, 2)) And _
       CStr(ws.Cells(z, 12)) = CStr(Sheets("Job Totals").Cells(x, 3)) Then
    

修正后的完整代码

Sub GetAllJobCodes()
    Dim ws As Worksheet
    Dim x As Integer
    Dim z As Integer
    Dim NumOfTotals As Integer
    NumOfTotals = (JobCodesSorted.Count * WorkCodes.Count) + 1

    Dim Totals(500) As Double
    Dim TotalsTemp As Double

    ' 初始化数组为0
    For x = 1 To NumOfTotals
        Totals(x) = 0
    Next

    ' 遍历所有汇总行
    For x = 2 To NumOfTotals
        ' 遍历除汇总表外的所有工作表
        For Each ws In ActiveWorkbook.Worksheets
            If ws.Name <> "Job Totals" Then
                ' 遍历目标区域的行(A19:L30)
                For z = 19 To 30
                    ' 统一类型后匹配代码组合
                    If CStr(ws.Cells(z, 11)) = CStr(Sheets("Job Totals").Cells(x, 2)) And _
                       CStr(ws.Cells(z, 12)) = CStr(Sheets("Job Totals").Cells(x, 3)) Then
                        ' 读取当前工作表的工时值并累加
                        TotalsTemp = CDbl(ws.Cells(z, 10))
                        Totals(x) = Totals(x) + TotalsTemp
                    End If
                Next z
            End If
        Next ws
    Next x

    ' 将累加结果写入汇总表
    For x = 2 To NumOfTotals
        Sheets("Job Totals").Cells(x, 1) = Totals(x)
    Next
End Sub

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:05:21