遍历工作簿工作表匹配代码汇总工时的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
相关产品推荐
相关产品推荐

