Excel VBA需求:筛选Core中Partial缺失的C_Number行并导出
VBA实现筛选Core中缺失于Partial的C_Number行并去重导出
实现思路
- 用字典存储Partial里的所有C_Number(自动去重,同时统一格式避免数字/文本不匹配)
- 遍历Core的C_Number,找出不在字典中的条目
- 将对应整行复制到新工作簿,同时确保新工作簿里的C_Number无重复
- 自动调整新工作簿列宽,完成后提示并关闭源文件(可选)
完整代码(带详细注释)
Sub FindMissingCNumbers() Dim wbkCore As Workbook, wbkPartial As Workbook, wbkMissing As Workbook Dim wsCore As Worksheet, wsPartial As Worksheet, wsMissing As Worksheet Dim coreLastRow As Long, partialLastRow As Long, i As Long, destRow As Long Dim cNumDict As Object Dim cNumber As Variant ' 创建字典:存储Partial的C_Number,自动去重,查找速度快 Set cNumDict = CreateObject("Scripting.Dictionary") ' -------------------------- 替换成你的实际文件路径 -------------------------- Set wbkCore = Workbooks.Open("C:\YourFolder\Core.xlsx") ' Core文件路径 Set wbkPartial = Workbooks.Open("C:\YourFolder\Partial.xlsx") ' Partial文件路径 ' ------------------------------------------------------------------------- ' 绑定工作表(假设两个文件的目标工作表都是第一个) Set wsCore = wbkCore.Sheets(1) Set wsPartial = wbkPartial.Sheets(1) ' 遍历Partial的F列,把C_Number转成文本存入字典(避免数字/文本格式差异) partialLastRow = wsPartial.Cells(Rows.Count, "F").End(xlUp).Row For i = 2 To partialLastRow ' 假设第1行是表头,从第2行开始遍历数据 cNumber = Trim(Str(wsPartial.Cells(i, "F").Value)) ' 转文本+去空格 If Not cNumDict.Exists(cNumber) Then cNumDict.Add cNumber, 1 ' 只存不重复的条目 End If Next i ' 创建新工作簿,用于存放缺失的行 Set wbkMissing = Workbooks.Add Set wsMissing = wbkMissing.Sheets(1) wsMissing.Name = "MissingEntries" destRow = 1 ' 新工作簿的起始行 ' 先复制Core的表头到新工作簿 wsCore.Range("A1:P1").Copy Destination:=wsMissing.Cells(destRow, 1) destRow = destRow + 1 ' 表头占了1行,数据从第2行开始 ' 遍历Core的E列,查找缺失的C_Number coreLastRow = wsCore.Cells(Rows.Count, "E").End(xlUp).Row For i = 2 To coreLastRow cNumber = Trim(Str(wsCore.Cells(i, "E").Value)) ' 同样转文本匹配字典 ' 两个判断:1. 不在Partial的字典里;2. 新工作簿里还没加过这个C_Number(去重) If Not cNumDict.Exists(cNumber) And _ wsMissing.Columns(5).Find(cNumber, LookIn:=xlValues, LookAt:=xlWhole) Is Nothing Then ' 复制当前行的A-P列到新工作簿 wsCore.Range("A" & i & ":P" & i).Copy Destination:=wsMissing.Cells(destRow, 1) destRow = destRow + 1 ' 下一行准备存新数据 End If Next i ' 自动调整新工作簿的列宽,方便查看 wsMissing.Columns.AutoFit ' 弹出提示框告知完成 MsgBox "缺失的C_Number条目已导出到新工作簿!", vbInformation ' 关闭源工作簿(如果不需要保留打开状态,SaveChanges设为False不保存) wbkCore.Close SaveChanges:=False wbkPartial.Close SaveChanges:=False End Sub
使用说明
- 打开Excel,按
Alt+F11打开VBA编辑器 - 插入一个新模块(右键左侧项目窗口 -> 插入 -> 模块)
- 把上面的代码粘贴进去
- 替换代码里的文件路径为你实际的Core和Partial文件路径
- 按
F5运行代码,或者回到Excel界面开发工具里点击运行
内容的提问来源于stack exchange,提问作者jpWRX
相关产品推荐
相关产品推荐

