基于输入次数将最后一行数据复制为多行的VBA代码修改求助
修正后的VBA代码及问题说明
原代码的核心问题是粘贴目标行的计算逻辑错误,导致每次粘贴的位置跳跃甚至重叠,同时存在工作表引用不统一的问题。以下是修正后的代码:
Sub CopyDataFromLastRowAndPaste() Dim ws As Worksheet Dim originalLastRow As Long Dim copyRange As Range Dim numCopies As Integer Dim i As Integer ' 明确指定目标工作表,避免依赖ActiveSheet Set ws = ThisWorkbook.Sheets("Sheet1") ' 获取初始最后一行行号(使用指定的ws,而非ActiveSheet) originalLastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row MsgBox "初始最后一行: " & originalLastRow ' 获取需要复制的次数,增加输入合法性判断 numCopies = InputBox("Enter the number of copies to make:") If numCopies < 1 Then MsgBox "请输入大于0的整数" Exit Sub End If ' 设置要复制的范围(最后一行整行) Set copyRange = ws.Rows(originalLastRow) ' 循环复制粘贴到初始最后一行的下方 For i = 1 To numCopies ' 每次粘贴到originalLastRow + i的位置,确保连续向下粘贴 copyRange.Copy ws.Rows(originalLastRow + i).PasteSpecial Paste:=xlPasteValues Next i Application.CutCopyMode = False MsgBox "数据已成功复制到最后一行下方。" End Sub
关键修改点:
- 统一工作表引用:将
ActiveSheet替换为已指定的ws,避免因当前激活工作表不同导致的错误。 - 固定初始最后一行:用
originalLastRow保存初始的最后一行行号,循环中不再修改这个值,确保每次粘贴的位置是originalLastRow + i,实现连续向下粘贴。 - 增加输入合法性判断:避免用户输入非正整数导致的错误。
- 简化粘贴位置逻辑:直接基于初始最后一行计算每次的目标行,逻辑更清晰,不会出现行号跳跃或重叠的问题。
如果想要更高效的实现(避免循环复制粘贴),可以用批量插入行后一次性填充的方式:
Sub CopyLastRowBatch() Dim ws As Worksheet Dim originalLastRow As Long Dim numCopies As Integer Set ws = ThisWorkbook.Sheets("Sheet1") originalLastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row numCopies = InputBox("Enter the number of copies to make:") If numCopies < 1 Then MsgBox "请输入大于0的整数" Exit Sub End If ' 批量插入需要的行数 ws.Rows(originalLastRow + 1 & ":" & originalLastRow + numCopies).Insert Shift:=xlDown ' 将原最后一行的值批量填充到插入的行中 ws.Rows(originalLastRow).Copy ws.Rows(originalLastRow + 1 & ":" & originalLastRow + numCopies).PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False MsgBox "数据已批量复制完成。" End Sub
这种方式减少了循环次数,在需要复制大量行时效率更高。
内容的提问来源于stack exchange,提问作者Ashish Srivastava
相关产品推荐
相关产品推荐

