Excel VBA跨表复制符合条件数据不全,求代码错误排查
你的VBA代码问题分析与修正方案
我帮你捋捋现有代码里的几个明显问题,这些大概率是导致数据没完全转移的原因:
1. 循环范围逻辑错误
你先获取了DaysReport表A列的最后一行,然后又执行了LastRow = LastRow + 1,这会让循环多跑一行空行,而且原本的有效数据行是到LastRow - 1,循环范围应该直接用原始的LastRow,不需要加1——不然要么会遍历到空行,要么会漏掉部分有效数据。
2. 变量类型存在溢出风险
你把循环变量c定义成了Integer,但Excel的行数早就超过了Integer的最大值(32767),如果你的数据行数较多,直接会触发溢出错误,导致代码中途中断,自然复制不全。应该改成Long类型。
3. 目标表处理缺失
代码里定义了fgLastRow但完全没使用,说明你没正确计算目标表的最后一行位置——如果每次复制都写到同一行,就会覆盖之前的数据,看起来像是“部分数据没转移”。
4. 代码不完整(推测)
你的代码写到.Sheets("DaysRe...就断了,大概率是复制逻辑没写完,比如没把符合条件的行放到目标表的正确位置。
给你一份修正后的完整代码示例(假设目标表是FIlist,你可以根据实际情况调整):
Private Sub FIlist() Dim LastRow As Long, fgLastRow As Long Dim c As Long ' 改成Long避免行数过多溢出 With ActiveWorkbook.Sheets("DaysReport") ' 先取消筛选(如果有的话),避免End(xlUp)获取错误的最后一行 If .AutoFilterMode Then .AutoFilterMode = False ' 获取A列最后一行有效数据行(用Rows.Count代替硬编码的1000000,适配所有Excel版本) LastRow = .Range("A" & .Rows.Count).End(xlUp).Row End With Call StartCode With ActiveWorkbook ' 获取目标表的初始最后一行 fgLastRow = .Sheets("FIlist").Range("A" & .Rows.Count).End(xlUp).Row ' 遍历DaysReport的每一行有效数据 For c = 1 To LastRow ' 检查B列是否为"ACCEPT"(如果有第二个条件,直接在这里补充即可) If .Sheets("DaysReport").Range("B" & c).Value = "ACCEPT" Then ' 复制整行到目标表的下一行 .Sheets("DaysReport").Rows(c).Copy Destination:=.Sheets("FIlist").Rows(fgLastRow + 1) ' 更新目标表最后一行,确保下一条数据写到新行 fgLastRow = fgLastRow + 1 End If Next c End With End Sub
额外优化点:
- 用
.Range("A" & .Rows.Count)代替硬编码的A1000000,适配Excel 365等大行数版本; - 增加了取消筛选的逻辑,避免筛选状态下获取错误的最后一行;
- 直接用
Range("B" & c)代替Offset(c-1,0),代码可读性更强。
内容的提问来源于stack exchange,提问作者musicalpoet
相关产品推荐
相关产品推荐

