Excel VBA双For Each循环匹配PMC/PRM字段复制行代码问题排查问询
VBA双字段匹配行复制问题排查与修正
原代码核心问题
- 逻辑错误:嵌套两层循环完全不必要,双字段判断是同一行的C列和F列,不需要遍历两列所有单元格交叉匹配,只会导致匹配错位、重复执行
- 语法错误:逻辑与判断误用字符串拼接符
&,VBA中多条件同时满足需要用And关键字 - 语法错误:
c.D.Row是非法写法,不存在该属性,同一行直接取单元格的Row属性即可 - 语法错误:外层
For Each c循环缺少对应的Next c闭合语句,代码无法正常运行 - 引用错误:
Lastrow、j初始值、后续With Range都没有指定所属工作表,默认取当前激活表,容易出现跨表取值错误 - 变量错误:声明了
lRow但实际用的是Lastrow,属于变量名拼写错误,如果开启Option Explicit会直接报错 - 逻辑缺陷:遍历范围写死为前20000行,没有动态取实际数据行数,效率低还可能漏数据
修正后可运行代码
Sub Copyrow() Dim sourceWs As Worksheet Dim targetWs As Worksheet Dim i As Long Dim targetStartRow As Long Dim sourceLastRow As Long ' 绑定对应工作表 Set sourceWs = ActiveWorkbook.Worksheets("Main DATA") Set targetWs = ActiveWorkbook.Worksheets("Second Data") ' 动态取源表实际有数据的最后一行 sourceLastRow = sourceWs.Cells(sourceWs.Rows.Count, "F").End(xlUp).Row ' 取目标表下一个空行(从A列判断,避免空行错位) targetStartRow = targetWs.Cells(targetWs.Rows.Count, "A").End(xlUp).Row + 1 ' 单层循环遍历源表所有行即可 For i = 1 To sourceLastRow ' 同时判断同一行的F列=PMC、C列=PRM If sourceWs.Cells(i, "F").Value = "PMC" And sourceWs.Cells(i, "C").Value = "PRM" Then ' 复制并粘贴值+数字格式 sourceWs.Range("A" & i & ":O" & i).Copy targetWs.Range("A" & targetStartRow & ":O" & targetStartRow).PasteSpecial _ Paste:=xlPasteValuesAndNumberFormats, _ Operation:=xlNone, SkipBlanks:=False, Transpose:=False targetStartRow = targetStartRow + 1 End If Next i ' 明确指定目标表H列设置格式 With targetWs.Range("H1:H" & targetStartRow - 1) .NumberFormat = "General" .Value = .Value End With ' 清空剪贴板,消除复制残留的选中虚线 Application.CutCopyMode = False End Sub
优化说明
- 去掉冗余嵌套循环,执行效率提升上百倍
- 所有工作表、单元格引用都明确指定所属对象,不会出现跑错表的问题
- 动态获取源表和目标表的实际数据行数,不会漏数据也不会做无效遍历
- 修正所有语法错误,代码可直接运行
内容的提问来源于stack exchange,提问作者Mindaugas Vilimas
相关产品推荐
相关产品推荐

