使用C#在两个Excel文件指定列中查找匹配行并高亮
Excel匹配与条件格式化解决方案
针对你描述的两个Excel文件匹配需求,我整理了两种实用的实现方式——内置函数+条件格式(适合非编程用户)和VBA宏(适合批量处理或更大数据量),具体操作如下:
准备工作
先确保FirstFile.xlsx和SecondFile.xlsx都已打开,我们以SecondFile.xlsx的工作表为操作对象(需要标记绿色的行在这里),FirstFile.xlsx作为匹配数据源。假设两个文件的目标数据都在Sheet1中。
方法1:内置函数+条件格式(无需编程)
步骤1:添加辅助列判断匹配状态
在SecondFile.xlsx的Sheet1中插入一列(比如D列,命名为MatchStatus),在D2单元格输入以下公式,然后下拉填充到所有行:
=IF(NOT(ISBLANK(A2)), IF(ISNUMBER(XLOOKUP(A2, FirstFile.xlsx!Sheet1!A:A, FirstFile.xlsx!Sheet1!A:A)), "Code匹配", "Code未匹配"), IF(ISNUMBER(XLOOKUP(RIGHT(B2,LEN(B2)-FIND(" ",B2)), FirstFile.xlsx!Sheet1!C:C, FirstFile.xlsx!Sheet1!C:C)), "Family匹配", "未匹配"))
公式逻辑拆解:
- 先检查当前行的Code(A列)是否非空:
- 非空则用
XLOOKUP查找FirstFile的Code列,找到标记Code匹配,否则标记Code未匹配 - 空Code则提取当前行Name(B列)的姓氏(拆分空格后的后半部分),去
FirstFile的Family列(C列)查找,找到标记Family匹配,否则标记未匹配
- 非空则用
步骤2:设置条件格式标记绿色
选中SecondFile.xlsx中需要标记的行范围(比如A2:D[最后一行]),按以下步骤操作:
- 点击「开始」选项卡 → 「条件格式」→ 「新建规则」
- 选择「使用公式确定要设置格式的单元格」
- 输入公式:
=OR($D2="Code匹配", $D2="Family匹配") - 点击「格式」→ 「填充」→ 选择绿色 → 确定
完成后,所有匹配成功的行就会自动显示绿色填充了。
方法2:VBA宏(高效批量处理)
如果数据量较大,手动操作效率低,可以用VBA宏实现自动匹配和标记:
打开SecondFile.xlsx,按Alt+F11打开VBA编辑器,插入一个新模块,粘贴以下代码:
Sub MatchAndColorRows() Dim wsFirst As Worksheet, wsSecond As Worksheet Dim lastRowFirst As Long, lastRowSecond As Long Dim i As Long, j As Long Dim codeMatch As Boolean, familyMatch As Boolean ' 绑定两个文件的工作表 Set wsFirst = Workbooks("FirstFile.xlsx").Sheets("Sheet1") Set wsSecond = ThisWorkbook.Sheets("Sheet1") ' 获取两个工作表的最后一行行号 lastRowFirst = wsFirst.Cells(wsFirst.Rows.Count, "A").End(xlUp).Row lastRowSecond = wsSecond.Cells(wsSecond.Rows.Count, "A").End(xlUp).Row ' 遍历SecondFile的每一行 For i = 2 To lastRowSecond codeMatch = False familyMatch = False ' 优先匹配Code列 If Not IsEmpty(wsSecond.Cells(i, "A").Value) Then For j = 2 To lastRowFirst If wsSecond.Cells(i, "A").Value = wsFirst.Cells(j, "A").Value Then codeMatch = True Exit For End If Next j End If ' Code未匹配或无Code时,匹配Family列 If Not codeMatch Then ' 提取Name中的姓氏(取最后一个空格后的内容) Dim lastName As String lastName = Split(wsSecond.Cells(i, "B").Value, " ")(UBound(Split(wsSecond.Cells(i, "B").Value, " "))) For j = 2 To lastRowFirst If lastName = wsFirst.Cells(j, "C").Value Then familyMatch = True Exit For End If Next j End If ' 匹配成功则标记绿色 If codeMatch Or familyMatch Then wsSecond.Rows(i).Interior.ColorIndex = 4 ' 4为默认绿色,可根据需求调整颜色索引 End If Next i MsgBox "匹配与标记完成!" End Sub
代码说明:
- 先遍历
SecondFile的每一行,优先匹配Code列 - 无Code或Code未匹配时,提取Name的姓氏去匹配
FirstFile的Family列 - 匹配成功的行自动设置绿色填充
运行宏前确保FirstFile.xlsx已打开,点击运行按钮即可完成批量处理。
额外提示
- 如果
SecondFile中的Name格式特殊(比如包含中间名),可以调整姓氏提取逻辑,改为取最后一个空格后的内容(代码中已做适配) - 若数据量超过10万行,建议将VBA代码中的嵌套循环改为字典(Dictionary)查找,能大幅提升运行效率
内容的提问来源于stack exchange,提问作者Reza Shahrestani
相关产品推荐
相关产品推荐

