VBA表格数据复制迁移问题求助:粘贴位置、排序及Resize
解决VBA数据复制与表格操作的三个问题
针对你提到的三个问题,以下是对应的修正方案及完整代码:
问题1:粘贴到目标工作表Col3而非Col1
原代码中获取目标表格最后一行的逻辑错误,改为直接从目标列表对象tblMSFT获取最后一行,确保粘贴起始位置为第一列。
问题2:源数据未排序导致「无法对多选区运行命令」错误
在过滤前添加源表格按A列排序的代码,确保数据区域连续,避免多选区问题。
问题3:更新后未调整目标表格范围
粘贴完成后,将目标列表对象的范围扩展至包含新增行,自动纳入表格。
修正后的完整代码
Sub UpdateSupplierMaster() Const PROC_TITLE As String = "Update Master Supplier File" Dim MFST_LastRow As Long Dim wsf As Worksheet, wst As Worksheet Dim tblMSFT As ListObject, tblMAV As ListObject Dim visRange As Range ' 获取工作表 Set wsf = Sheets("TASK - Map and Validation") Set wst = Sheets("MASTER - Supplier File") ' 获取表格对象 Set tblMSFT = wst.ListObjects("MSF_Table") Set tblMAV = wsf.ListObjects("MAV_Table") ' 按A列排序源表格,避免多选区错误 With tblMAV.Sort .SortFields.Clear .SortFields.Add Key:=tblMAV.ListColumns(1).Range, SortOn:=xlSortOnValues, Order:=xlAscending .Header = xlYes .Apply End With ' 过滤源表格中标记为"New"的行 tblMAV.Range.AutoFilter Field:=1, Criteria1:="New" ' 获取可见数据区域(限定B:R列) On Error Resume Next ' 处理无可见行的情况 Set visRange = Application.Intersect(tblMAV.DataBodyRange.SpecialCells(xlCellTypeVisible), wsf.Columns("B:R")) On Error GoTo 0 If Not visRange Is Nothing Then Application.ScreenUpdating = False ' 获取目标表格最后一行的下一行 MFST_LastRow = tblMSFT.ListRows.Count + 1 ' 粘贴为值到目标表格第一列起始位置 visRange.Copy tblMSFT.ListRows.Add(MFST_LastRow - 1).Range.PasteSpecial xlPasteValues ' 调整目标表格范围,自动包含新增行 tblMSFT.Resize wst.Range(tblMSFT.HeaderRowRange, wst.Cells(wst.Cells(Rows.Count, tblMSFT.ListColumns(1).Index).End(xlUp).Row, tblMSFT.ListColumns.Count)) ' 清除筛选 tblMAV.AutoFilter.ShowAllData MsgBox "New Records Added", vbExclamation, PROC_TITLE Application.ScreenUpdating = True Else MsgBox "No new records found.", vbInformation, PROC_TITLE End If End Sub
关键修改说明
- 排序逻辑:通过
tblMAV.Sort对象实现按A列排序,确保数据区域连续,避免多选区错误。 - 最后行获取:直接使用
tblMSFT.ListRows.Count获取目标表格已有行数,保证粘贴位置准确。 - 表格范围调整:通过
tblMSFT.Resize方法将表格扩展至包含新增数据的最后一行,自动更新表格范围。
内容的提问来源于stack exchange,提问作者craig crowhurst
相关产品推荐
相关产品推荐

