Excel VBA:提取第二组数据计算差值返回0的问题排查
问题排查与修正
错误原因分析
你修改后的代码返回0,核心问题在于定位第二组数据最后行的逻辑错误:
- 原代码中
ws.Cells(5, "J").End(xlDown)是找到J列第5行开始的第一组连续数据的最后一行,直接Offset(1,0)会跳到该行的下一行——如果这一行是空单元格,ws.Range("J" & ...).Value会取到0(空单元格在VBA中默认值为0)。 - 同时你对I列和J列分别用了独立的
End(xlDown).Offset(1),可能导致取到的不是同一行的对应数据,最终计算出0的差值。
修正方案
正确的逻辑应该是:先定位第一组数据的结束行,再从该行的下一行开始,查找第二组连续数据的最后一行,确保I列和J列取到的是同一行的对应值。
修正后的代码
Sub ExtractTableData() Dim ws As Worksheet Dim lastRow As Long ' 改用Long避免行号超过Integer上限 Dim i As Integer Dim outflows() Dim validWsCount As Integer Dim firstGroupLastRow As Long Dim secondGroupLastRow As Long ' 先统计符合条件的工作表数量,避免数组冗余 validWsCount = 0 For Each ws In Worksheets If Left(ws.Name, 10) = "Semaine du" Then validWsCount = validWsCount + 1 End If Next ws ' 根据有效工作表数重新定义数组 ReDim outflows(1 To validWsCount, 1 To 2) i = 1 For Each ws In Worksheets If Left(ws.Name, 10) = "Semaine du" Then ' 定位第一组数据的最后行(以J列为例,假设I/J组行号一致) firstGroupLastRow = ws.Cells(5, "J").End(xlDown).Row ' 从第一组下一行开始,定位第二组数据的最后行 secondGroupLastRow = ws.Cells(firstGroupLastRow + 1, "J").End(xlDown).Row ' 提取日期与计算差值 outflows(i, 1) = Mid(ws.Name, 12) outflows(i, 2) = ws.Range("J" & secondGroupLastRow).Value - ws.Range("I" & secondGroupLastRow).Value i = i + 1 End If Next ws ' 将数据写入Sheet1,避免多余空行 If validWsCount > 0 Then Sheets("Sheet1").Range("A2:B" & 1 + validWsCount).Value = outflows End If End Sub
额外优化点
- 将
lastRow的类型从Integer改为Long:Excel行号可能超过Integer的最大值(32767),避免溢出错误。 - 先统计符合条件的工作表数量,再定义数组大小:避免原代码中
Worksheets.Count -1导致的数组冗余空行。 - 统一用J列定位第二组行号:假设I列和J列的分组行号完全对应,确保取到的是同一行的对应数据。
内容的提问来源于stack exchange,提问作者Bikat Uprety
相关产品推荐
相关产品推荐

