为何VBA代码中ActiveSheet.Range("C" & intA + 2)里的intA会变为0?
问题原因分析
你的代码核心问题是循环逻辑嵌套冲突,导致intA被错误递减,具体拆解:
- 初始赋值
Total = ActiveWorkbook.Worksheets.Count、intA = Total是正常的,但你同时嵌套了For Each ws和Do While intA > 1两个循环。 - 第一次进入
For Each循环时,Do While会持续执行,每次循环都执行intA = intA - 1,直到intA递减到1,此时Do While intA > 1的条件不再成立。 - 后续所有
For Each迭代中,Do While循环完全不会运行。若你观察到intA变为0,大概率是调试时单步执行到了intA = intA - 1,或工作表数量出现异常(但Excel工作簿至少有1个工作表,正常情况下intA会停在1)。
修复后的代码
你的需求应该是将所有工作表的指定单元格内容汇总到当前活动表,无需嵌套循环,直接用索引遍历即可:
Sub MySum() Dim wsIndex As Integer Dim wsCount As Integer wsCount = ActiveWorkbook.Worksheets.Count ' 从最后一个工作表往第一个遍历(和原代码顺序一致) For wsIndex = wsCount To 1 Step -1 ActiveSheet.Range("C" & wsIndex + 2).Value = Worksheets(wsIndex).Range("Y11").Value ' 单个单元格无需Sum,直接取Value ActiveSheet.Range("D" & wsIndex + 2).Value = Worksheets(wsIndex).Range("G11").Value ActiveSheet.Range("E" & wsIndex + 2).Value = Worksheets(wsIndex).Range("P11").Value ActiveSheet.Range("B" & wsIndex + 2).Value = Worksheets(wsIndex).Name ' DATE Next wsIndex End Sub
额外优化建议
- 单个单元格不需要用
WorksheetFunction.Sum,直接取.Value效率更高。 - 尽量避免依赖
ActiveSheet,可以直接指定汇总表(比如ThisWorkbook.Worksheets("汇总表")),防止活动表切换导致错误。 - 变量名改用语义化命名(比如
wsIndex、wsCount),提升代码可读性。
内容的提问来源于stack exchange,提问作者rookie
相关产品推荐
相关产品推荐

