VBA Scripting.Dictionary匹配粘贴异常:未处理首行数据问题
问题分析与解决方案
嘿,我一眼就揪出问题所在了——你的代码直接跳过了检查器表前17行的WO#数据,这就是已清理条目没被复制的核心原因,咱们来一步步拆解:
问题根源
- 循环起始行设置错误:你写的
For j = 18 To lastRow1(读取检查器表)和For i = 18 To lastRow2(更新主表),意味着程序从第18行才开始处理数据。如果检查器表中已清理的WO#在18行之前,自然会被完全忽略,根本不会被存入字典,主表对应行也就得不到更新。 - 潜在的重复键报错风险:原代码里如果检查器表存在重复的WO#,执行
AVals.Add时会直接抛出错误——因为字典的键必须是唯一的。
修正后的代码
Sub dates() Application.ScreenUpdating = False Dim AVals As Object: Set AVals = CreateObject("scripting.dictionary") Dim i As Long, j As Long, lastRow1 As Long, lastRow2 As Long Dim sh_insp As Worksheet, sh_2018 As Worksheet ' 修正:补全变量类型声明 Dim MyName As String Set sh_insp = ActiveSheet Set sh_2018 = Sheets("2018") With sh_insp ' 优化:更可靠的获取最后一行方式 lastRow1 = .Cells(.Rows.Count, "G").End(xlUp).Row ' 修正:改成你表格实际的数据起始行(比如表头在第1行,就写2;无表头就写1) For j = 2 To lastRow1 MyName = .Cells(j, "G").Value ' 补充:避免重复键报错,同时确保数据有效 If Len(MyName) > 0 And Len(.Cells(j, "R").Value) > 0 And Not AVals.Exists(MyName) Then AVals.Add MyName, .Cells(j, "R").Value End If Next j End With With sh_2018 lastRow2 = .Cells(.Rows.Count, "G").End(xlUp).Row ' 同样修正为主表数据的实际起始行 For i = 2 To lastRow2 MyName = .Cells(i, "G").Value If AVals.Exists(MyName) Then .Cells(i, "R").Value = AVals(MyName) ' 简化写法:Item关键字可省略 End If Next i End With Application.ScreenUpdating = True End Sub
关键修正说明
- 调整循环起始行:把
j = 18和i = 18改成你表格中实际数据开始的行号(比如第1行是表头,数据从第2行开始就写2),这样前几行的WO#就能被正常读取和匹配了。 - 优化最后一行获取逻辑:用
.Cells(.Rows.Count, "G").End(xlUp).Row替代原来绕弯的写法,更简洁也更不容易出错。 - 避免重复键错误:添加
Not AVals.Exists(MyName)判断,防止检查器表出现重复WO#时程序崩溃。 - 规范变量声明:补全
sh_insp的类型声明为As Worksheet,避免默认的Variant类型带来的潜在问题。
内容的提问来源于stack exchange,提问作者R.E.L.
相关产品推荐
相关产品推荐

