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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:40:31