求助:使用VBA For循环按250行间隔复制数据至其他工作表
修正后的VBA代码及问题解析
原代码的问题
- 变量类型错误:
lngLoopCtr被定义为Range,但实际用于存储行号,应改为Long类型。 - 复制区域未正确指定:原代码
lngLoopCtr.Value.copy未明确要复制的B列单元格范围,无法选中250行数据段。 - 粘贴位置错误:每次都粘贴到Sheet1的A列起始位置,会覆盖之前的内容,需动态计算Sheet1的下一个空行作为粘贴起点。
- 边界处理缺失:最后一段数据可能不足250行,未判断是否超过B列最后一行,容易复制空行。
正确代码
Sub CopyDataInSegments() Dim lngLastRow As Long Dim lngLoopCtr As Long Dim targetRow As Long ' 获取当前工作表B列最后一行行号 lngLastRow = ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row ' 初始化Sheet1的粘贴起始行 targetRow = 1 ' 按每250行循环处理 For lngLoopCtr = 1 To lngLastRow Step 250 ' 计算当前段的结束行,避免超过B列最后一行 Dim endRow As Long endRow = lngLoopCtr + 249 If endRow > lngLastRow Then endRow = lngLastRow End If ' 复制当前工作表B列的指定行范围 ActiveSheet.Range("B" & lngLoopCtr & ":B" & endRow).Copy ' 粘贴到Sheet1的对应位置 Sheets("Sheet1").Range("A" & targetRow).PasteSpecial Paste:=xlPasteValuesAndNumberFormats ' 更新下一次粘贴的起始行 targetRow = targetRow + (endRow - lngLoopCtr + 1) Next lngLoopCtr ' 清除剪贴板,避免弹窗提示 Application.CutCopyMode = False End Sub
代码说明
lngLastRow:获取当前工作表B列有数据的最后一行行号,避免处理空行。targetRow:记录Sheet1中下次粘贴的起始行,确保数据依次向下排列不覆盖。endRow:计算每段的结束行,当剩余行数不足250时,自动以最后一行作为结束,避免复制超出范围的空单元格。PasteSpecial:指定粘贴值和数字格式,可根据需求调整为xlPasteAll(粘贴全部格式)等其他类型。Application.CutCopyMode = False:清空剪贴板,防止Excel保留复制状态引发的提示。
内容的提问来源于stack exchange,提问作者Kuan Yoke Gei
相关产品推荐
相关产品推荐

