如何在MS Access中使用VBA合并两个Excel工作表?
问题解决思路
你的代码主要有两个关键错误导致不符合预期:
粘贴位置偏移错误:你用了
Offset(lastRow2, 0),这会把sheet3的内容粘贴到sheet2现有数据的下一行起始列,而不是同一行的右侧空白列。你的需求是把sheet3的列追加到sheet2的右侧,所以不需要这个偏移。未限定工作表的行列对象:在Access VBA中直接调用
Columns.Count或Rows.Count,默认指向的是Access的对象模型,而非当前打开的Excel工作表。这会导致lastCol和lastRow2的计算结果错误,甚至出现单格粘贴的问题。
修正后的代码
Public Function copyFile(newFilePath As String) objFile.SaveCopyAs newFilePath ' Open the copied file Dim copiedFile As Object Set copiedFile = objExcel.Workbooks.Open(newFilePath) Dim sheet2 As Object Set sheet2 = copiedFile.Worksheets("sheet2") Dim sheet3 As Object Set sheet3 = copiedFile.Worksheets("sheet3") ' 限定为sheet2的列,避免Access对象干扰 Dim lastCol As Long lastCol = sheet2.Cells(1, sheet2.Columns.Count).End(xlToLeft).Column ' 获取sheet3的有效数据行数(从B列判断) Dim lastRow3 As Long lastRow3 = sheet3.Cells(sheet3.Rows.Count, "B").End(xlUp).Row ' 直接粘贴到sheet2的最后一列右侧,不需要偏移行 sheet3.Range("B1:I" & lastRow3).Copy _ sheet2.Cells(1, lastCol + 1) copiedFile.Save copiedFile.Close False End Function
关键修改说明
- 计算
lastCol时,用sheet2.Columns.Count替代全局的Columns.Count,确保针对目标工作表计算列数 - 移除了
Offset(lastRow2, 0),直接将sheet3的内容从sheet2的lastCol + 1列开始粘贴,这样表头和数据会自动对齐到对应行 - 单独计算sheet3的有效行数
lastRow3,避免和sheet2的行数混淆
运行修正后的代码后,就能实现你预期的效果:sheet3的B-I列内容会追加到sheet2现有列的右侧,表头和数据行一一对应。
内容的提问来源于stack exchange,提问作者bmfy131
相关产品推荐
相关产品推荐

