夜雨聆风学习资料网

ARTICLE · 1223424

Excel里还在手动Ctrl+H? VBA正则Replace,3个案例让文本处理效率飞升

Excel里还在手动Ctrl+H? VBA正则Replace,3个案例让文本处理效率飞升

你是否也这样崩溃过?

几百行客户信息,手机号、日期、备注乱七八糟;你想统一格式、给手机号打码、把一堆空格清理干净——于是你一行行手动 Ctrl+H,改到眼花。

其实 Excel 自带一个「批量文本处理神器」:VBA 正则的 Replace 方法。今天这篇,我用 3 个超简单案例,带你从「完全不懂」到「能直接抄代码用」,每一步都拆给你看。

✨ 先看效果(这就是今天要实现的)

① 手机号打码

13812345678 → 138****5678 | 15900001111 → 159****1111

② 日期统一

2026.10.21 / 2026/11/01 / 2027年1月5日 → 2026-10-21 / 2026-11-1 / 2027-1-5

③ 空格清理

"张 三  男 28 岁" → "张 三 男 28 岁"

一、正则 Replace 到底是什么?

普通的「查找替换」只能找一个固定的词,比如把"苹果"换成"橘子"。但现实中很多活是「有规律」的:把所有手机号中间4位盖住、把所有日期统一成横杠。这种活,正则 Replace 最擅长——它是「按套路找、按套路换」。

它背后是一个叫 RegExp 的对象(全称 Regular Expression,正则表达式)。一句话记住它的作用:

RegExp.Replace( 原文本 , 新内容 ) → 返回「换好之后」的新文本

🧠 一张知识树,记住全篇

VBA 正则 Replace

↓

是什么按规则批量「找+换」文本的神器,背后是 RegExp 对象
怎么用4 要素:Pattern 规则 · Global 全替换 · IgnoreCase 忽略大小写 · Replace 执行
用在哪打码脱敏 · 格式统一 · 清洗空格 · 批量替换
注意坑要 Global=True · 分组用 $1 不是 \1 · 接住返回值

二、怎么用?四件套 + 五步走

用正则 Replace,核心就 4 个要素(我叫它「四件套」):

Pattern规则:要匹配什么,写成正则式子(最关键)

Global是否全部:True=替换所有匹配;False=只换第一个

IgnoreCase忽略大小写:True=不分 a/A;默认 False

Replace执行:Replace(原文本, 新内容),返回换好的新文本

🔄 使用流程(五步走)

① 原始文本

↓

② 设 Pattern 规则

↓

③ 开 Global / IgnoreCase

↓

④ Replace 执行替换

↓

⑤ 得到干净文本

📐 通用代码骨架(背下这个,套案例就行)

Sub 示例()    Dim reg As Object    Set reg = CreateObject("VBScript.RegExp")   ' ① 创建正则对象    reg.Pattern = "这里写规则"                    ' ② 写匹配规则    reg.Global = True        ' ③ 全部替换(批量必开)    ' reg.IgnoreCase = True  ' ④ 需要忽略大小写时打开    Dim 源文本 As String    源文本 = "要处理的文本"                       ' ⑤ 原始文本    源文本 = reg.Replace(源文本, "替换成的内容")  ' ⑥ 执行替换,接住结果    MsgBox 源文本                                ' ⑦ 看效果End Sub

🔑 必须先懂:分组与 $1、$2

正则里用 ( ) 把一部分「圈」成一个分组,替换时就能用 $1、$2、$3… 把圈住的内容「原样搬」到新位置。这是正则替换最强大的地方。

规则:(前3位)(中间4位)(后4位)

替换:$1****$2 → 只保留头尾,中间盖住

三、什么时候该用它?(4 大场景)

🛡️ 1. 打码脱敏

手机号、身份证、银行卡中间几位变 *,保护隐私又能识别归属。

📅 2. 格式统一

日期、分隔符写法五花八门,一键统一成年-月-日。

🧹 3. 清洗整理

多余空格、全角半角混排、乱糟糟的备注,一键变整齐。

🔁 4. 批量替换

凡是「有规律」的文本改造,几百上千行也能一次搞定。

四、3 个案例(由简到繁,逐句解析)

案例 1 | 手机号打码(最简单,学会分组)

需求:把 11 位手机号中间 4 位盖成 ****,头和尾保留。

① 完整代码(直接复制可用)

Sub 手机打码()    Dim reg As Object    Set reg = CreateObject("VBScript.RegExp")    reg.Pattern = "(\d{3})\d{4}(\d{4})"    reg.Global = True    Dim s As String    s = "我的手机号13812345678,备用15900001111"    s = reg.Replace(s, "$1****$2")    MsgBox sEnd Sub

② 逐句拆解(别跳过,这里才是重点)

Dim reg As Object声明一个对象变量 reg,专门用来装「正则引擎」。

Set reg = CreateObject("VBScript.RegExp")真正「造」出正则对象。CreateObject 不需要提前引用任何库,最省事,新手首选。

reg.Pattern = "(\d{3})\d{4}(\d{4})"核心规则。\d=一个数字;\d{3}=连续3个数字;(\d{3})加括号=把前3位「圈」成第1分组($1);中间\d{4}不括号=只匹配不保留;(\d{4})=后4位,第2分组($2)。整句意思:匹配11位手机号,并记住头3位和尾4位。

reg.Global = TrueTrue=所有匹配都换;批量处理一定要开,否则只会找到的第一个。

Dim s As String / s = "我的手机号..."准备字符串变量,放入原始文本。

s = reg.Replace(s, "$1****$2")执行替换。$1是第1分组(前3位),$2是第2分组(后4位),中间写死的 **** 盖住那4位。Replace 不会改原文本,而是把结果返回,所以要用 s = 接住。

MsgBox s弹窗看结果:138****5678,159****1111。

案例 2 | 日期格式统一(学会字符组 [ ])

需求:把「2026.10.21 / 2026/11/01 / 2027年1月5日」统一成「年-月-日」。

① 完整代码

Sub 规范日期()    Dim reg As Object    Set reg = CreateObject("VBScript.RegExp")    reg.Pattern = "(\d{4})[./年-](\d{1,2})[./月-](\d{1,2})日?"    reg.Global = True    reg.IgnoreCase = True    Dim s As String    s = "签约日2026.10.21,生效日2026/11/01,到期日2027年1月5日"    s = reg.Replace(s, "$1-$2-$3")    MsgBox sEnd Sub

② 逐句拆解

reg.Pattern = "(\d{4})[./年-](\d{1,2})[./月-](\d{1,2})日?"(\d{4}) 年(4位,分组$1);[./年-] 方括号=字符组,匹配「其中任意一个」:点.、斜杠/、年、-,所以通吃各种分隔写法;(\d{1,2}) 月(1~2位,分组$2);[./月-] 又一组字符组:.、/、月、-;(\d{1,2}) 日(1~2位,分组$3);日? 末尾「日」字可选(?=出现0或1次),有就匹配、没有也行。

reg.IgnoreCase = True本例用不到大小写,但加上无害;处理 a/A 混写时才真正需要。

s = reg.Replace(s, "$1-$2-$3")把三种写法统一成「年-月-日」。结果:2026-10-21,2026-11-1,2027-1-5。

案例 3 | 杂乱空格清理(学会 \s 与全角,稍复杂)

需求:把半角、全角空格混在一起的一堆空格,整理成「每个词之间只有一个普通空格」。

① 完整代码

Sub 清理空格()    Dim reg As Object    Set reg = CreateObject("VBScript.RegExp")    reg.Pattern = "[\s ]+"    reg.Global = True    Dim s As String    s = "张  三    男   28   岁"    s = reg.Replace(s, " ")    s = Trim(s)    MsgBox sEnd Sub

② 逐句拆解

reg.Pattern = "[\s ]+"\s = 任意空白:半角空格、Tab、换行都算; = 中文全角空格(占一个汉字宽),它不在 \s 范围内,所以单独贴进方括号;[...] 字符组,+ = 前面元素出现1次或多次。于是连成一堆的空格(半角全角混排)会被当成一个整体。

s = reg.Replace(s, " ")把这些「一堆空格」整体换成一个普通半角空格。

s = Trim(s)再去头去尾的多余空格,得到干净结果:张 三 男 28 岁。

五、新手避坑指南(4 个最常见错误)

❌ 坑1:对象名拼错

必须写 "VBScript.RegExp",字母要对,否则报错「ActiveX 部件不能创建对象」。

❌ 坑2:忘了 Global = True

默认只换第一个匹配,批量处理会漏掉一大片。记住:批量必开。

❌ 坑3:分组引用写错

VBA 里要用 $1、$2,不要写 \1,替换串里不认反斜杠写法。

❌ 坑4:规则太死匹配不到

先用一小段文本 + MsgBox 测试;多用字符组 [ ] 和 + / * 让规则更「宽容」。

六、小结 & 领练习文件

今天你学会了

✅ 正则 Replace = 按规则批量「找+换」文本

✅ 四件套:Pattern / Global / IgnoreCase / Replace

✅ 分组 ( ) 与 $1、$2 引用是灵魂

✅ 3 个案例:打码 / 日期统一 / 空格清理

📥 配套 Excel 练习文件已备好

里面含 3 个案例的「原始数据 + 替换结果 + 完整 VBA 源码」,照着练一遍就稳了。

VBA正则Replace案例练习.xlsx

相关学习资料