如何调整Excel VBA代码实现跨表复制并添加到表格?
搞定VBA跨表复制+添加到Excel表格的问题
嘿,我来帮你解决这个问题!你的现有代码能把Client receipt表的E2、B2数据复制到Total表的最后一行,但只是直接写入单元格,没把数据纳入Excel的结构化表格(也就是咱们常说的Table,VBA里叫ListObject)里。我给你两种实用方案,按需选就行。
方案1:直接往表格里加新行(最规范推荐)
如果Total表里已经有个结构化表格(比如默认的Table1,你换成自己的表格名就行),直接用ListObject的ListRows.Add方法是最稳妥的,能保证表格自动扩展,还不会破坏表格的样式和结构。
修改后的代码长这样:
Sub CopyToTable() Application.ScreenUpdating = False Dim srcWs As Worksheet Dim destWs As Worksheet Dim destTable As ListObject Dim newRow As ListRow ' 先把源表和目标表定好 Set srcWs = ThisWorkbook.Sheets("Client receipt") Set destWs = ThisWorkbook.Sheets("Total") ' 指定要添加数据的表格(把"Table1"改成你实际的表格名称) Set destTable = destWs.ListObjects("Table1") ' 给表格加一行,然后把数据填进去 Set newRow = destTable.ListRows.Add(AlwaysInsert:=True) newRow.Range(1, 1).Value = srcWs.Range("B2").Value ' 对应表格第1列 newRow.Range(1, 2).Value = srcWs.Range("E2").Value ' 对应表格第2列 Application.ScreenUpdating = True End Sub
为啥这么写?
ListRows.Add(AlwaysInsert:=True):不管表格有没有在筛选,都能在底部插新行,不会出问题。newRow.Range(1,1)就是新行的第一个单元格,对应表格的第一列,要是你的表格有更多列,接着往后加newRow.Range(1,3)这类就行。
方案2:兼容你原来的逻辑,确保数据进表格
要是你想保留原来“找最后一行写入”的习惯,那也可以调整代码,保证写完数据后表格自动把这行纳入进去。代码如下:
Sub CopyAndExtendTable() Application.ScreenUpdating = False Dim srcWs As Worksheet Dim destWs As Worksheet Dim destTable As ListObject Set srcWs = ThisWorkbook.Sheets("Client receipt") Set destWs = ThisWorkbook.Sheets("Total") Set destTable = destWs.ListObjects("Table1") ' 同样,换成你的表格名 ' 直接加一行并赋值,一步到位 destTable.ListRows.Add(AlwaysInsert:=True).Range = Array(srcWs.Range("B2").Value, srcWs.Range("E2").Value) ' 要是你非要用原来的单元格写入方式,就用下面这两行(记得注释掉上面那行) ' destWs.Cells(destTable.DataBodyRange.Row + destTable.DataBodyRange.Rows.Count, 1).Resize(,2).Value = Array(srcWs.Range("E2"), srcWs.Range("B2")) ' destTable.Resize destTable.Range.Resize(destTable.Range.Rows.Count + 1) ' 手动把表格范围扩大一行 Application.ScreenUpdating = True End Sub
注意事项:
- 一定要确认表格名称没错!你可以在Excel顶部的「表格设计」选项卡看到当前表格的名字,别写错了。
- 要是表格列数多,就往
Array里加对应的单元格值就行,顺序要和表格列对应上。 - 开头关
ScreenUpdating是为了让代码跑更快,最后记得开回来哈。
踩坑提示:
- 要是运行时弹出“对象变量未设置”,十有八九是表格名写错了,或者
Total表里根本没建结构化表格。 - 要是新行没表格样式,要么检查表格的「自动套用格式」开了没,要么就用方案1的
ListRows.Add方式,自动继承样式。
内容的提问来源于stack exchange,提问作者user1
相关产品推荐
相关产品推荐

