python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python对比Excel数据

Python与VBA实现对比Excel中两列数据的完整方案

作者:Eiceblue

在日常数据处理工作中,经常会遇到比对 Excel 中两列数据,找出差异、匹配项、独有的数据这类需求,本文将分别使用VBA和Python实现两列数据比对,并提供完整代码和适用场景说明,有需要的小伙伴可以了解下

前言

在日常数据处理工作中,经常会遇到比对 Excel 中两列数据,找出差异、匹配项、独有的数据这类需求。很多 Excel 使用者第一选择是 VBA 宏,依托 Office 原生环境快速完成;而随着 Python 在数据自动化场景的普及,也可以借助第三方 Excel 库实现同样逻辑。本文将分别使用 VBA 和 Python 实现两列数据比对,并提供完整代码和适用场景说明。

说明:Python 示例采用 Free Spire.XLS for Python 免费库,可独立读写 Excel 文件,不依赖本地安装 Office,适合无 Office 环境的自动化脚本。

需求定义

读取 Excel 工作表,对比 A 列、B 列数据,输出两类结果:

  1. 差异项:A 列与 B 列数据不同的项(包括 A 列有而 B 列没有的,以及 B 列有而 A 列没有的)。
  2. 匹配项:A 列与 B 列数据相同的项,并高亮标记。

结果写入 C 列,方便查看差异。

约定:数据从第2行开始(第1行为表头),仅比对有效非空单元格。

方案一:VBA 实现(Office 原生)

VBA 嵌入在 Excel 中,直接依托 Excel 应用对象,适合使用者习惯打开 Excel 文件、手动触发宏的场景,优点是不需要额外安装软件,缺点是依赖 Office,跨平台、批量文件远程执行不方便。

VBA 参考代码

Sub CompareRowByRow()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Dim lastRowA As Long, lastRowB As Long, maxRow As Long
    lastRowA = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    lastRowB = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
    maxRow = Application.WorksheetFunction.Max(lastRowA, lastRowB)
    ' 清空 C 列结果
    ws.Columns("C").ClearContents
    ws.Columns("C").Interior.ColorIndex = xlNone
    ws.Cells(1, 3).Value = "比对结果"
    Dim i As Long
    Dim valA As String, valB As String
    For i = 2 To maxRow
        valA = Trim(CStr(ws.Cells(i, 1).Value))
        valB = Trim(CStr(ws.Cells(i, 2).Value))
        ' 跳过两列都为空的行
        If valA = "" And valB = "" Then GoTo NextRow
        If valA = valB Then
            ' 匹配项:A、B 相同(且非空)
            ws.Cells(i, 3).Value = "匹配"
            ws.Cells(i, 3).Interior.Color = RGB(200, 255, 200) ' 浅绿色高亮
        Else
            ' 差异项:包括一方为空,或两者都非空但不等
            ws.Cells(i, 3).Value = "差异"
        End If
NextRow:
    Next i
    MsgBox "逐行对比完成,结果已写入 C 列。"
End Sub

代码说明

效果预览:

如果希望 C 列直接显示具体差异值,可以将写入规则改为:

If valA = valB Then
            ' 匹配项:A、B 相同(且非空)
            ws.Cells(i, 3).Value = "匹配:" & valA
            ws.Cells(i, 3).Interior.Color = RGB(200, 255, 200) ' 浅绿色高亮
        Else
            ' 差异项
            If valA <> "" And valB = "" Then
                ws.Cells(i, 3).Value = "差异:A独有 - " & valA
            ElseIf valA = "" And valB <> "" Then
                ws.Cells(i, 3).Value = "差异:B独有 - " & valB
            Else
                ws.Cells(i, 3).Value = "差异:" & valA & " vs " & valB
            End If
        End If

结果如图:

方案二:Python 实现

Python 方案可以脱离 Office 独立运行,脚本化调度,适合批量文件、定时任务、服务端自动化。Free Spire.XLS for Python 可以直接加载 Excel 文件,遍历单元格,不需要启动 Excel 进程。

前置:安装依赖

pip install spire.xls.free

Python 参考代码

from spire.xls import *
from spire.xls.common import *
# 加载工作簿
workbook = Workbook()
workbook.LoadFromFile("C:\\Users\\Administrator\\Desktop\\对比示例.xlsx")
sheet = workbook.Worksheets[0]
max_row = sheet.LastRow
sheet.Range[1, 3].Value = "比对结果"
for row in range(2, max_row + 1):
    cell_a = sheet.Range[row, 1]
    cell_b = sheet.Range[row, 2]
    val_a = str(cell_a.Value).strip() if cell_a.Value is not None else ""
    val_b = str(cell_b.Value).strip() if cell_b.Value is not None else ""
    # 跳过两列都为空的行
    if not val_a and not val_b:
        continue
    cell_c = sheet.Range[row, 3]
    if val_a == val_b:
        cell_c.Value = "匹配"
        cell_c.Style.Color = Color.get_Yellow()
    else:
        cell_c.Value = "差异"
# 保存结果
workbook.SaveToFile("对比结果.xlsx", ExcelVersion.Version2016)
workbook.Dispose()
print("逐行对比完成,结果已写入 C 列。")

代码说明

效果预览:

VBA 与 Python 方案核心对比

维度VBAPython + Free Spire.XLS
运行环境依赖 Office/WPS,在 Excel 进程内执行独立 Python 环境,不启动 Excel
部署方式嵌入 xlsm 文件,分发文件脚本+依赖包,可打包 exe 分发
批量处理多文件循环容易卡顿,稳定性受 Excel 进程影响适合批量遍历文件夹下所有 Excel (需注意免费版限制)
调试体验在 VBA 编辑器,断点调试,即时看表格变化日志打印,需要查看输出文件确认结果
适用场景单次、临时比对,使用者日常在 Excel 内操作自动化流水线、定时比对、服务器处理

小结

对比 Excel 两列数据这个经典需求,VBA 和 Python 没有绝对优劣,核心是匹配使用环境。VBA 是 Excel 生态内的原生方案,Python 则提供脱离 Office 的自动化能力。Free Spire.XLS for Python 作为独立 Excel 解析库,让 Python 脚本可以直接读写 .xls 和 .xlsx文件完成数据比对,不需要依赖桌面 Office 软件,是自动化场景下的可选实现路径。实际开发中可以基于是否需要界面、是否批量、部署环境来选择合适方案。

以上就是Python与VBA实现对比Excel中两列数据的完整方案的详细内容,更多关于Python对比Excel数据的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文