VBA代码问题:如何将指定列复制到周报工作簿的最后一行
解决周度滚动报表粘贴至最后一行的VBA代码问题
原代码的核心问题是粘贴位置固定在表头行,且复制了数据源的表头内容,导致无法实现周度数据的滚动追加。以下是修改后的代码及关键说明:
修改后的完整代码
Sub pull_columns() Dim head_count As Integer Dim row_count As Integer Dim col_count As Integer Dim i As Integer Dim j As Integer Dim ws As Worksheet Dim sourceWb As Workbook Dim sourceWs As Worksheet Dim lastRow As Long ' 用Long避免行号超过Integer范围导致溢出 Application.ScreenUpdating = False Set ws = ThisWorkbook.Sheets("Sheet2") ' 统计当前报表工作簿的表头列数 head_count = WorksheetFunction.CountA(ws.Range("A1", ws.Range("A1").End(xlToRight))) ' 打开数据源工作簿并直接引用工作表(避免依赖Active对象) Set sourceWb = Workbooks.Open(Filename:="C:\Users\ritwi\Desktop\Book1.xlsm") Set sourceWs = sourceWb.Sheets(1) ' 统计数据源的有效行数和列数 row_count = WorksheetFunction.CountA(sourceWs.Range("A1", sourceWs.Range("A1").End(xlDown))) col_count = WorksheetFunction.CountA(sourceWs.Range("A1", sourceWs.Range("A1").End(xlToRight))) For i = 1 To head_count j = 1 Do While j <= col_count ' 匹配表头列 If ws.Cells(1, i).Text = sourceWs.Cells(1, j).Text Then ' 获取目标列的最后一行行号,Offset定位到下一行作为粘贴起点 lastRow = ws.Cells(ws.Rows.Count, i).End(xlUp).Row ' 复制数据源从第2行开始的数据(跳过表头,避免重复粘贴) sourceWs.Range(sourceWs.Cells(2, j), sourceWs.Cells(row_count, j)).Copy ' 粘贴到目标列的最后一行下方 ws.Cells(lastRow + 1, i).PasteSpecial xlPasteValues Application.CutCopyMode = False j = col_count ' 退出当前列的循环,提升效率 End If j = j + 1 Loop Next i sourceWb.Close savechanges:=False ws.Cells(1, 1).Select Application.ScreenUpdating = True End Sub
关键修改点说明
- 替换Active对象引用:用
sourceWb和sourceWs变量直接绑定数据源工作簿和工作表,避免操作过程中焦点变化导致的错误,代码稳定性更高。 - 调整复制范围:从数据源的第2行开始复制内容,跳过表头,因为报表工作簿已经有固定表头,无需重复粘贴。
- 精准定位最后一行:通过
ws.Cells(ws.Rows.Count, i).End(xlUp).Row获取目标列的最后有数据行号,再用lastRow + 1定位到下一行,实现数据滚动追加。 - 行号类型优化:改用
Long类型存储行号,避免Excel行号超过Integer最大值(32767)时出现溢出错误。
内容的提问来源于stack exchange,提问作者Ritwik Nautiyal
相关产品推荐
相关产品推荐

