VBA代码可批量复制多行数据至目标表,但无法复制单行数据
问题分析
你的代码在源表有多条匹配记录时正常,但单条时失效,核心问题出在目标表行的访问方式以及d的计算逻辑不够严谨:
- 若目标表
InputTable2(i)初始为空(无数据行),直接访问ListRows(b)会触发错误,因为空表的ListRows集合为空,无法通过索引访问不存在的行。 d的计算依赖Match返回的位置减1,若源表表头行结构有变化(比如合并单元格),会导致索引偏移错误。
修正后的代码
Dim sourceTable As ListObject Dim targetTable As ListObject Dim matchPos As Variant Dim rw As Long Dim targetRow As ListRow Set sourceTable = DBTable2(i) Set targetTable = InputTable2(i) ' 获取匹配记录数 RecordRows = Application.CountIf(sourceTable.ListColumns(IDColumn.Index).Range, IDCurrent) If RecordRows = 0 Then Exit Sub ' 无匹配记录直接退出 ' 获取第一条匹配记录的位置(转换为数据行索引) matchPos = Application.Match(IDCurrent, sourceTable.ListColumns(IDColumn.Index).Range, 0) If IsError(matchPos) Then Exit Sub ' 匹配失败直接退出 d = matchPos - sourceTable.HeaderRowRange.Rows.Count ' 适配表头行数量,得到ListRows的起始索引 ' 清空目标表现有数据(可选,根据需求决定是否保留原有数据) If Not targetTable.DataBodyRange Is Nothing Then targetTable.DataBodyRange.Delete End If ' 循环复制每条匹配记录 For rw = 1 To RecordRows ' 为目标表主动添加新行 Set targetRow = targetTable.ListRows.Add(AlwaysInsert:=True) ' 复制源表行数据 targetRow.Range.Value = sourceTable.ListRows(d).Range.Value ' 设置指定列公式 targetRow.Range(1).FormulaR1C1 = "=CU_ID" d = d + 1 Next rw
关键改进点
- 安全访问目标行:使用
ListRows.Add主动创建新行,彻底避免空表时直接通过索引访问不存在行的错误。 - 严谨的索引计算:通过
sourceTable.HeaderRowRange.Rows.Count动态减去表头行数,适配可能的复杂表头结构(比如多行表头)。 - 增加错误防护:提前判断无匹配记录或匹配失败的情况,避免无意义的执行流程。
- 提升代码可读性:引入
sourceTable和targetTable变量简化重复调用,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Philippe
相关产品推荐
相关产品推荐

