使用VBA将工作簿中Daily表复制到另一工作簿并自动保存关闭的咨询
VBA 跨工作簿复制表格实现方案
你的需求可以通过VBA实现,你现有代码存在拼写错误、逻辑颠倒、对象操作方法错误等问题,以下是核心修正点和可直接运行的代码:
原代码核心问题
- 多处拼写错误:
wookbooks应为Workbooks、woorksheet应为Worksheet、x1up应为xlUp、lasrow和你定义的变量名lastrow不一致 - 赋值逻辑颠倒:原代码将空的dt/line/shift/prod变量赋值给源表格单元格,实际应该读取源表格单元格的值存入变量
- 变量类型错误:
ws应为Worksheet类型,不是Sheets集合类型 - 操作逻辑错误:普通变量没有
Paste方法,不需要选中单元格再赋值,直接写入单元格即可 - 语法错误:关闭工作簿的参数应为
SaveChanges:=True,使用冒号加等号
修正后代码
Private Sub CommandButton3_Click() ' 声明变量 Dim ws As Worksheet Dim tbl As ListObject Dim dt As Variant Dim line As Variant Dim shift As Variant Dim prod As Variant Dim wb As Workbook Dim targetWs As Worksheet Dim FileName As String Dim lastrow As Long ' 配置参数 FileName = "C:\Users\john.bauer\Desktop\Archive.xlsx" Set ws = Sheet4 ' 源数据所在工作表 Set tbl = ws.ListObjects("Daily") ' 源结构化表 ' 读取源表第一行的4列数据,可根据实际需求调整读取范围 With tbl.DataBodyRange dt = .Cells(1, 1).Value line = .Cells(1, 2).Value shift = .Cells(1, 3).Value prod = .Cells(1, 4).Value End With ' 打开目标工作簿,获取目标工作表 Set wb = Workbooks.Open(FileName) Set targetWs = wb.Worksheets("Table") ' 计算目标表第一列最后一行的行号 lastrow = targetWs.Cells(targetWs.Rows.Count, 1).End(xlUp).Row ' 写入数据到目标表新行 targetWs.Cells(lastrow + 1, 1).Value = dt targetWs.Cells(lastrow + 1, 2).Value = line targetWs.Cells(lastrow + 1, 3).Value = shift targetWs.Cells(lastrow + 1, 4).Value = prod ' 保存并关闭目标工作簿 wb.Save wb.Close SaveChanges:=True ' 释放对象内存 Set targetWs = Nothing Set wb = Nothing Set tbl = Nothing Set ws = Nothing End Sub
使用注意事项
- 请确认目标工作簿
Archive.xlsx中确实存在名为Table的工作表 - 如果需要复制整个
Daily表格的全部数据,可修改读取逻辑批量写入,无需逐单元格赋值 - 若
Daily表格是普通区域不是结构化表,调整tbl相关的读取逻辑即可
内容的提问来源于stack exchange,提问作者user13596510
相关产品推荐
相关产品推荐

