Excel如何跨工作表查找匹配列值并复制对应行到目标工作表
Excel跨工作表序列号匹配整行数据落地方案
适用场景:两个工作表均从D列第2行起存储序列号,需提取序列号匹配的整行数据汇总到目标工作表,以下三种方案均实测可直接落地,按自己的使用场景选择即可。
方法1:高级筛选法(零代码,适合一次性临时导数)
全程不用写复杂逻辑,1分钟就能出结果:
- 先切到目标结果工作表,找个空白列(比如Z列)做临时条件区:Z1单元格填源数据表D列的表头(和源表D1内容完全一致,比如源表D1是「产品序列号」,Z1就填一模一样的内容),Z2单元格输入公式
=COUNTIF(匹配参照表!D:D, 源数据表!D2)>0按回车,公式里的工作表名替换成你自己的实际表名。 - 切回存原始数据的源工作表,框选所有要匹配的数据区域(从D1表头开始选到数据最后一行的最后一列即可,别选整列避免卡顿),点顶部菜单栏「数据」选项卡,选「高级」筛选。
- 弹窗里按以下规则选择:
- 筛选方式选「将筛选结果复制到其他位置」
- 列表区域会自动识别你刚才框选的源表数据,识别错了就手动重新框选
- 条件区域选刚才在目标表填的Z1:Z2两个单元格
- 「复制到」位置选目标工作表里要放结果的起始单元格(比如A1)
- 点确定,所有匹配到的整行数据会直接复制到目标表,最后把临时用的Z列内容删掉就行。
*注意:这个方法生成的是静态结果,后续源数据改了要重新走一遍流程,适合临时导出数据用。
方法2:Power Query法(自动刷新,适合定期更新匹配结果)
一次配置完,后续数据更新只要点一下刷新就能出最新结果,不用重复操作:
- 分别打开两个存数据的工作表,点任意数据单元格,按
Ctrl+T,勾选「表包含标题」点确定,把两个普通区域转成超级表,可在顶部表设计栏给两个表改个好记的名字(比如「源数据表」「参照序列号表」)。 - 点顶部「数据」选项卡,选「获取数据>自工作簿>自当前工作簿」,选中刚才建的两个超级表导入到Power Query编辑器。
- 在编辑器左侧选中源数据表的查询,点顶部「合并查询」,合并对象选参照序列号表,关联字段分别点两个表的序列号列,联接种类选「内部联接(仅保留匹配的行)」,点确定。
- 合并后会新增一列参照表的匹配内容,点列标题旁边的展开箭头,选择要同步的字段后确定。
- 点左上角「关闭并上载」,选择加载位置为你指定的目标工作表即可。
*优势:后续两个源表的数据增删改了,只要在结果表右键点「刷新」,匹配结果自动更新,适合需要每周/每月定期导匹配数据的场景。
方法3:VBA宏法(适合高频操作,一键执行秒出结果)
数据量大(过万行)或者每天都要做匹配操作的话,用这个方法一次配置完,按个快捷键就能跑完:
- 打开Excel文件按
Alt+F11调出VBA编辑器,在左侧工程资源栏右键点当前文件名,选「插入>模块」。 - 把下面的代码粘贴到右侧空白代码窗口,修改代码里标注的工作表名为你自己的实际表名:
Sub 序列号匹配提取() Dim 源表 As Worksheet, 参照表 As Worksheet, 目标表 As Worksheet Dim 源最后行 As Long, 参最后行 As Long, 目标行 As Long, i As Long Dim 匹配字典 As Object, 序列号 As String ' ====== 下方引号内改成你自己的工作表名 ====== Set 源表 = ThisWorkbook.Worksheets("源数据") Set 参照表 = ThisWorkbook.Worksheets("参照序列号") Set 目标表 = ThisWorkbook.Worksheets("匹配结果") ' ========================================== Set 匹配字典 = CreateObject("Scripting.Dictionary") 目标表.Cells.Clear '清空目标表旧数据 ' 先把参照表所有序列号存入字典,匹配速度比函数快数十倍 参最后行 = 参照表.Cells(Rows.Count, "D").End(xlUp).Row For i = 2 To 参最后行 序列号 = Trim(参照表.Cells(i, "D").Value) If 序列号 <> "" Then 匹配字典(序列号) = "" Next i ' 遍历源表匹配,复制对应整行到目标表 源最后行 = 源表.Cells(Rows.Count, "D").End(xlUp).Row 目标行 = 1 源表.Rows(1).Copy 目标表.Rows(目标行) '先复制表头 目标行 = 目标行 + 1 For i = 2 To 源最后行 序列号 = Trim(源表.Cells(i, "D").Value) If 匹配字典.Exists(序列号) Then 源表.Rows(i).Copy 目标表.Rows(目标行) 目标行 = 目标行 + 1 End If Next i Set 匹配字典 = Nothing MsgBox "匹配完成,共提取 " & 目标行 - 2 & " 条有效数据" End Sub
- 改完按F5就能直接运行,几万行数据也是几秒出结果,还可以给这个宏指定快捷键,后续不用开编辑器,按快捷键就能直接跑。
操作前建议先备份原文件,避免误操作丢失原始数据。
内容的提问来源于stack exchange,提问作者Mogheh
相关产品推荐
相关产品推荐

