VBA循环复制行至目标工作表时LastRowBlue未逐次更新的问题求助
嘿,我来帮你搞定这个VBA循环复制的问题!你猜的完全没错,问题核心确实是LastRowBlue的计算逻辑有漏洞,导致每次循环都拿到同一个行号,最终所有数据都覆盖到了blue表的第2行。咱们一步步拆解问题并修正:
问题根源分析
你的代码里,LastRowBlue = Sheets("blue").Cells(Rows.Count).End(xlUp).Row + 1这一行有两个关键问题:
Cells(Rows.Count)没有指定具体列,默认会沿用当前活动表(也就是data表)的列上下文,而非blue表的目标列(A列),这会导致行号计算不准确。- 没有明确绑定blue表的
Rows.Count,虽然多数情况下Excel工作表行数一致,但规范写法能避免活动表切换带来的意外错误。
另外,代码里没有明确指定操作的工作表,一旦运行时活动表切换,Range或Cells会指向错误的表,也可能引发隐藏问题。
修正后的代码
Sub CopyPasteInOtherSheetWithLoop() Dim wsData As Worksheet, wsBlue As Worksheet Dim BallsColorList As Range Dim LastRowBallsColorList As Long Dim LastRowBlue As Long Dim Ball As Range ' 明确绑定目标工作表,避免活动表切换的风险 Set wsData = ThisWorkbook.Sheets("data") Set wsBlue = ThisWorkbook.Sheets("blue") ' 计算data表B列的最后一行(用Long类型避免行号溢出) LastRowBallsColorList = wsData.Cells(wsData.Rows.Count, "B").End(xlUp).Row Set BallsColorList = wsData.Range(wsData.Cells(2, "B"), wsData.Cells(LastRowBallsColorList, "B")) For Each Ball In BallsColorList ' 基于blue表A列动态计算最新的下一个可用行 LastRowBlue = wsBlue.Cells(wsBlue.Rows.Count, "A").End(xlUp).Row + 1 ' 精准复制data表中当前行的A-C列,粘贴到blue表的目标位置 wsData.Range(Ball.Offset(0, -1), Ball.Offset(0, 2)).Copy wsBlue.Cells(LastRowBlue, "A") Next Ball End Sub
关键优化点
- 明确工作表绑定:用
wsData和wsBlue变量固定操作的工作表,彻底避免活动表切换导致的错误。 - 动态行号计算:每次循环都基于blue表的A列重新计算最后一行,确保拿到的是最新的可用行号。
- 使用Long类型:Excel的行号可能超过Integer的最大值(32767),用Long存储行号更安全,防止溢出报错。
修改后运行代码,就能把data表的6行数据依次粘贴到blue表的连续行里,不会再出现覆盖问题啦。
内容的提问来源于stack exchange,提问作者Francisco Augusto Varela Aguir
相关产品推荐
相关产品推荐

