Excel VBA按表头匹配合并工作表数据触发1004错误如何解决
问题原因排查
- 致命错误:目标单元格拼接逻辑错误。原代码写的
ovsheet.Range(j & lRowOv + 1),j是列序号(数字),lRowOv+1是行序号,直接拼接会变成类似210这样的字符串,被Excel识别为第210列而非第2列第10行,导致范围非法触发1004错误。 - 表头统计逻辑错误:计算
qrmheaders(qrm req表的表头总数)时误用了ovsheet(requisition表)来统计,导致遍历表头的范围不对。 - 行数统计不规范:计算
lRowQRM时误用了ovsheet.Rows.Count,应该用当前表qrmsheet的行数,避免不同Excel版本工作表最大行数差异引发的问题。 - 变量未声明:循环变量
i、j以及单元格对象qrmCell、ovCell未声明,容易引发隐式变量错误,建议开头加Option Explicit强制变量声明。
修复后的完整代码
Option Explicit Sub testr() Dim headers As Range Dim qrmheaders As Long Dim ovheaders As Long Dim ovsheet As Worksheet Dim qrmsheet As Worksheet Dim lRowOv As Long Dim lRowQRM As Long Dim i As Long, j As Long Dim qrmCell As Range, ovCell As Range ' 初始化工作表对象 Set ovsheet = ThisWorkbook.Sheets("requisition") Set qrmsheet = ThisWorkbook.Sheets("qrm req") ' 统计requisition表的最大行、表头总数 lRowOv = ovsheet.Cells(ovsheet.Rows.Count, "A").End(xlUp).Row ovheaders = ovsheet.Cells(1, ovsheet.Columns.Count).End(xlToLeft).Column ' 统计qrm req表的最大行、表头总数(修复工作表引用错误) lRowQRM = qrmsheet.Cells(qrmsheet.Rows.Count, "B").End(xlUp).Row qrmheaders = qrmsheet.Cells(1, qrmsheet.Columns.Count).End(xlToLeft).Column ' 循环匹配表头 For i = 1 To qrmheaders Set qrmCell = qrmsheet.Cells(1, i) For j = 1 To ovheaders Set ovCell = ovsheet.Cells(1, j) If ovCell.Value = qrmCell.Value Then ' 修复目标单元格引用错误,直接用Cells定位行和列 qrmsheet.Range(qrmsheet.Cells(2, i), qrmsheet.Cells(lRowQRM, i)).Copy _ Destination:=ovsheet.Cells(lRowOv + 1, j) End If Next j Next i ' 清理剪贴板 Application.CutCopyMode = False End Sub
额外优化建议
- 如果数据量较大,可以关闭屏幕刷新提升运行速度,在代码开头加
Application.ScreenUpdating = False,结束前恢复为True即可。 - 如果表头可能存在大小写、空格差异,可以把匹配条件改成
If UCase(Trim(ovCell.Value)) = UCase(Trim(qrmCell.Value)) Then,避免匹配遗漏。
内容的提问来源于stack exchange,提问作者Andrew D
相关产品推荐
相关产品推荐

