原创作者:李锐
微信公众号:VBA应用大全(VbaApp)
一句话核心价值点:
用不到30行的VBA代码,把2026年职场里那些函数和数据透视表搞不定的重复核对活,变成一键完成的高效乐子。
办公室常遇到两张表要逐行比对差异,眼睛盯到花还没找全。函数得嵌套一堆,还容易漏行;数据透视表只能看汇总,没法精确定位不同单元格。
Sub CompareTwoSheets()
Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = Sheets("表1")
Set ws2 = Sheets("表2")
Dim r As Long, c As Integer
For r = 2 To ws1.Cells(ws1.Rows.Count, 1).End(xlUp).Row
For c = 1 To ws1.Cells(1, ws1.Columns.Count).End(xlToLeft).Column
If ws1.Cells(r, c).Value <> ws2.Cells(r, c).Value Then
ws1.Cells(r, c).Interior.Color = RGB(255, 200, 200)
End If
Next c
Next r
MsgBox "比对完,红色即不同"
End Sub原理很简单:让VBA像人一样逐格扫两张表同一位置,不一样就涂个浅红底色,肉眼一秒锁定。
金句①:眼睛比不过代码,手动盯不如让VBA帮你盯全程。
导出的表列顺序每次都变,用VLOOKUP还得先排好队,改一次结构就崩。数据透视表更没法按乱序智能匹配。
Sub AlignColumnsByName()
Dim src As Worksheet, tar As Worksheet
Set src = Sheets("源数据")
Set tar = Sheets("目标表")
Dim headerSrc As Range, headerTar As Range
Set headerSrc = src.Range("A1").CurrentRegion.Rows(1)
Set headerTar = tar.Range("A1").CurrentRegion.Rows(1)
Dim colMap As Object: Set colMap = CreateObject("Scripting.Dictionary")
Dim i As Integer
For i = 1 To headerSrc.Columns.Count
colMap(headerSrc.Cells(1, i).Value) = i
Next i
For i = 1 To headerTar.Columns.Count
If colMap.exists(headerTar.Cells(1, i).Value) Then
src.Columns(colMap(headerTar.Cells(1, i).Value)).Copy _
tar.Columns(i)
End If
Next i
MsgBox "列已按目标表顺序排好"
End Sub思路是先给源表列名做“通讯录”,再按目标表列名去取对应列,复制过去。
金句②:列名就是暗号,VBA听得懂,顺序随你调。
每月报表要挑出新录入的行,用函数得不断改引用范围,数据透视表只看统计不显明细。
Sub MarkNewRows()
Dim ws As Worksheet: Set ws = Sheets("数据")
Dim lastOld As Long, lastAll As Long
lastOld = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row - 10 '假设前10行是旧数据
lastAll = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
Dim r As Long
For r = lastOld + 1 To lastAll
ws.Rows(r).Interior.Color = RGB(200, 255, 200)
Next r
MsgBox "新增行已标绿"
End Sub原理是记住一个“老数据底线”,每次运行抓底线以下的行染颜色。
金句③:新来的就该亮亮相,VBA帮你把它推到台前。
几十列数字有的带¥有的没符号,日期格式五花八门,一个个改能磨掉半条命。函数改不了显示,透视表只管算不管看。
Sub FixFormatsBatch()
Dim ws As Worksheet: Set ws = Sheets("报表")
Dim rng As Range
Set rng = ws.UsedRange
Dim c As Range
For Each c In rng
If IsNumeric(c.Value) And Not IsDate(c.Value) Then
c.NumberFormat = "#,##0.00"
ElseIf IsDate(c.Value) Then
c.NumberFormat = "yyyy-mm-dd"
End If
Next c
MsgBox "格式统一完毕"
End Sub代码会遍历选区,数字加千分位两位小数,日期统一成2026年常用样式。
金句④:格式乱就像衣服扣错纽扣,VBA三两下帮你穿整齐。
要根据多条件把对照值填到另一列,用函数嵌套像绕迷宫,数据透视表不能直接回写原表。
Sub FillByCondition()
Dim ws As Worksheet: Set ws = Sheets("订单")
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim refLast As Long: refLast = Sheets("价格表").Cells(Rows.Count, 1).End(xlUp).Row
Dim i As Long
For i = 2 To refLast
dict(Sheets("价格表").Cells(i, 1).Value & "|" & Sheets("价格表").Cells(i, 2).Value) = _
Sheets("价格表").Cells(i, 3).Value
Next i
Dim dataLast As Long: dataLast = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To dataLast
Dim key As String
key = ws.Cells(i, 1).Value & "|" & ws.Cells(i, 2).Value
If dict.exists(key) Then ws.Cells(i, 3).Value = dict(key)
Next i
MsgBox "匹配填充完成"
End Sub这里用字典把“条件1|条件2”当钥匙存对应值,数据表循环时直接查钥匙填结果。
金句⑤:条件再多也不怕,VBA一把钥匙开一把结果。
核对、对齐、抓新、改貌、匹配——这些函数绕晕、透视表无能为力的琐碎活,用VBA就能让它们服服帖帖。每天捡一段10行内的代码练手,你会发现表格越用越顺,加班越做越少。


原创作者: 李锐
微信公众号:VBA应用大全(VbaApp)

干货教程 · 信息分享
