Python与VBA实现对比Excel中两列数据的完整方案
作者:Eiceblue
前言
在日常数据处理工作中,经常会遇到比对 Excel 中两列数据,找出差异、匹配项、独有的数据这类需求。很多 Excel 使用者第一选择是 VBA 宏,依托 Office 原生环境快速完成;而随着 Python 在数据自动化场景的普及,也可以借助第三方 Excel 库实现同样逻辑。本文将分别使用 VBA 和 Python 实现两列数据比对,并提供完整代码和适用场景说明。
说明:Python 示例采用 Free Spire.XLS for Python 免费库,可独立读写 Excel 文件,不依赖本地安装 Office,适合无 Office 环境的自动化脚本。
需求定义
读取 Excel 工作表,对比 A 列、B 列数据,输出两类结果:
- 差异项:A 列与 B 列数据不同的项(包括 A 列有而 B 列没有的,以及 B 列有而 A 列没有的)。
- 匹配项: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代码说明
- 逐行读取 A、B 两列的值,
Trim(CStr(...))保证比较时忽略首尾空格,且数字与文本形式统一。 - 若两列都为空,跳过该行,C 列不写内容。
- 若两列值相等(且非空),C 列写入“匹配”并设置浅绿色背景。
- 其余情况(一方为空、两者都非空但不等)均写入“差异”。
效果预览:

如果希望 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 列。")代码说明
- 同样逐行读取 A、B 两列的值,
str(...).strip()统一转为字符串并去除首尾空格。 - 两列都为空时跳过,C 列留空。
- 值相等则写入“匹配”并设置黄色高亮背景;否则写入“差异”
效果预览:

VBA 与 Python 方案核心对比
| 维度 | VBA | Python + 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数据的资料请关注脚本之家其它相关文章!
