作者:小小明

大家好,我是小小明,今天我要给大家分享一个我自己用VBA编写的神器,让你的Excel能够直接支持正则。

文末提供WPS的vba安装包,这样函数也可以直接在WPS中使用。

Pandas里支持正则替换比较舒服,但是Excel却没有一个可以支持正则的函数,但是借助VBA我们就可以在Excel实现正则的抽取、搜索和替换。

先看看效果吧:

正则抽取

对于一列数据:

中楼层(共9层)|2007年建|1室1厅|24.78平米|北
地下室|2014年建|1室0厅|39.52平米|东
底层(共2层)5室3厅|326.56平米|东南西北

我们想提取出其中的 层、楼层数、建筑年份、户型、大小和方向,我们可以选中一排的六个单元格,然后输入公式:

=re_extract(A1,"([^|(]+)(?:\(共(\d+)层\))?(?:\|(\d{4})年建\|)?(\d室\d厅)\|([\d.]+)平米\|([东南西北]+)")

然后按下Ctrl+shift+Enter(表示数组公式),即可得到如下结果:

中楼层  9   2007    1室1厅    24.78   北
地下室 0   2014    1室0厅    39.52   东
底层  2   0   5室3厅    326.56  东南西北

效果如下:

?:表示当前括号内部是非捕获组。

再看一个简单的例子,对于一列数据:

小五87
张三丰98
东方不败76
杨过88

我们想将姓名和成绩分开,可以选中一排的二个单元格,然后输入公式:

=re_extract(A1,"(.+?)(\d+)")

然后按下Ctrl+shift+Enter(表示数组公式),即可得到如下结果。

效果:

正则搜索

对于一列数据:

联想/LENOVO
狮乐/SHILE
Midea/美的
联想/LENOVO
松下/Panasonic
红叶/RedLeaf
纳米亚
富士施乐/FujiXerox
佳印
佳能/CANON
TCL

我们想提取其中的中文品牌,对于没有中文的才用英文,可以输入公式:

=re_find(A1,"[\u4e00-\u9fa5]+|^\w+$")

最终结果:

当然正则搜索也支持数组公式,再看一个例子,对于下面一列数据:

ENBCUCPFunction=280419,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=279719,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280196,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280198,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280219,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280228,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280242,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=279519,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=279619,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=279633,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280032,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280382,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=279731,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280019,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=279819,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280319,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280191,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280194,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=460-01_280192,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280197,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280199,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=279419,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=279488,CULTE=1,RATFreq=1,EutranFreqLTE=18

我们需要取出所有的ENBCUCPFunction/CULTE/RATFreq/EutranFreqLTE四个字段对应的值,可以选中一排的四个单元格,然后输入公式:

=re_find(A1,"[-_\d]+")

即可得到结果:

280419   1   1   18
279719  1   1   18
280196  1   1   18
280198  1   1   18
280219  1   1   18
280228  1   1   18
280242  1   1   18
279519  1   1   18
279619  1   1   18
279633  1   1   18
280032  1   1   18
280382  1   1   18
279731  1   1   18
280019  1   1   18
279819  1   1   18
280319  1   1   18
280191  1   1   18
280194  1   1   18
460-01_280192   1   1   18
280197  1   1   18
280199  1   1   18
279419  1   1   18
279488  1   1   18

效果:

正则替换

对于下面这列数据,我们希望仅保留EutranFreqLTE对应的值,多个值用;拼接:

ENBCUCPFunction=280419,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=279719,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280196,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280198,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280219,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280228,CULTE=1,RATFreq=1,EutranFreqLTE=18;ENBCUCPFunction=280228,CULTE=1,RATFreq=1,EutranFreqLTE=19
ENBCUCPFunction=280242,CULTE=1,RATFreq=1,EutranFreqLTE=18;ENBCUCPFunction=280242,CULTE=1,RATFreq=1,EutranFreqLTE=19
ENBCUCPFunction=279519,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=279619,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=279633,CULTE=1,RATFreq=1,EutranFreqLTE=18;ENBCUCPFunction=279633,CULTE=1,RATFreq=1,EutranFreqLTE=19
ENBCUCPFunction=280032,CULTE=1,RATFreq=1,EutranFreqLTE=18;ENBCUCPFunction=280032,CULTE=1,RATFreq=1,EutranFreqLTE=19
ENBCUCPFunction=280382,CULTE=1,RATFreq=1,EutranFreqLTE=18;ENBCUCPFunction=280382,CULTE=1,RATFreq=1,EutranFreqLTE=19
ENBCUCPFunction=279731,CULTE=1,RATFreq=1,EutranFreqLTE=18;ENBCUCPFunction=279731,CULTE=1,RATFreq=1,EutranFreqLTE=19
ENBCUCPFunction=280019,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=279819,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280319,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280191,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280194,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=460-01_280192,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280197,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=280199,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=279419,CULTE=1,RATFreq=1,EutranFreqLTE=18
ENBCUCPFunction=279488,CULTE=1,RATFreq=1,EutranFreqLTE=18;ENBCUCPFunction=279488,CULTE=1,RATFreq=1,EutranFreqLTE=19

可以输入公式:

=re_sub(A1,".+?(\d+)(;|$)", "$1$2")

得到结果:

18
18
18
18
18
18;19
18;19
18
18
18;19
18;19
18;19
18;19
18
18
18
18
18
18
18
18
18
18;19

效果:

再举个例子,对于下面这列数据,想去掉所有的非中文字符和被括号括起来的字符:

中山-Z-古镇华艺集团路口-280308-1-2-OF
中山-ZD-古镇华艺集团路口-280308-2-1-OF
中山-Z-古镇华艺集团路口-280308-2-2-OF
中山-ZD-横栏富横东路-280227-1-1-OF
中山-Z-横栏富横东路-280227-1-2-OF
中山-ZD-横栏富横东路-280227-2-1-OF
中山-Z-横栏富横东路-280227-2-2-OF
中山-ZD-横栏富横东路-280227-3-1-OF
中山-Z-横栏富横东路-280227-3-2-OF
中山-Z-三角电信营业厅(室分QCELL)-278903-1-1-MF
中山-Z-三角高平营业厅(室分QCELL)-278902-1-1-MF
中山-ZD-横栏中艺重工-280009-1-1-OF
中山-ZD-横栏中艺重工-280009-2-1-OF
中山-ZD-横栏中艺重工-280009-3-1-OF
中山-Z-横栏三沙商富路-279966-1-2-OF
中山-ZD-横栏三沙商富路-279966-1-1-OF
中山-ZD-横栏新丰物流-279974-1-1-OF
黄圃奥杰斯电器LTGX_3_F

输入一下公式:

=re_sub(A1,"[A-Z0-9_\-]+|\(.*\)", "")

即可得到:

中山古镇华艺集团路口
中山古镇华艺集团路口
中山古镇华艺集团路口
中山横栏富横东路
中山横栏富横东路
中山横栏富横东路
中山横栏富横东路
中山横栏富横东路
中山横栏富横东路
中山三角电信营业厅
中山三角高平营业厅
中山横栏中艺重工
中山横栏中艺重工
中山横栏中艺重工
中山横栏三沙商富路
中山横栏三沙商富路
中山横栏新丰物流
黄圃奥杰斯电器

效果:

用VBA实现上面三个函数并让其自动加载

好了,演示完效果,我们现在来看看如何开发这三个函数吧。

首先打开excel软件,点击开发工具->Visual Basic(或者直接按快捷键Alt+F11),打开VBA的编辑器:

右键单击当前工作薄对象插入模块:

在模块中插入以下代码:

Option ExplicitPublic Function re_sub(sText As String, pattern As String, repl As String)Dim oRegExp As ObjectSet oRegExp = CreateObject("vbscript.regexp")With oRegExp.Global = True 'True表示匹配所有, False表示仅匹配第一个符合项.IgnoreCase = False '区分大小写.pattern = patternre_sub = .Replace(sText, repl)End With
End FunctionPublic Function re_find(sText As String, pattern As String)Dim oRegExp As Object, match As Object, matches As ObjectSet oRegExp = CreateObject("vbscript.regexp")With oRegExp.Global = True 'True表示匹配所有, False表示仅匹配第一个符合项.IgnoreCase = True '不区分大小写.pattern = patternSet matches = .Execute(sText)End WithDim d As ObjectSet d = CreateObject("Scripting.Dictionary")For Each match In matchesd.Add match, NullNextre_find = d.keys
End FunctionPublic Function re_extract(sText As String, pattern As String)Dim oRegExp As Object, match As Object, matches As Object, i As IntegerSet oRegExp = CreateObject("vbscript.regexp")With oRegExp.Global = True 'True表示匹配所有, False表示仅匹配第一个符合项.IgnoreCase = True '不区分大小写.pattern = patternSet matches = .Execute(sText)(0).submatchesEnd WithDim d As ObjectSet d = CreateObject("Scripting.Dictionary")For i = 0 To matches.Count - 1d.Add matches(i), NullNextre_extract = d.keysEnd Function

然后按下Ctrl+S保存:

保存在个人宏工作簿:

C:\Users\{userName}\AppData\Roaming\Microsoft\Excel\XLSTART\

对于家庭和学生版2016,个人宏工作簿在:

C:\Users\{userName}\AppData\Local\Packages\Microsoft.Office.Desktop_8wekyb3d8bbwe\LocalCache\Roaming\Microsoft\Excel\XLSTART

{userName}表示你当前的用户名。

格式为xlam,文件名无所谓。

然后在这个电脑的任何时候,任何地方打开excel软件都可以直接使用上面开发好的正则处理函数了!

正则高级语法相关资料

非捕获组

功能:让某个圆括号只用于分组,而不捕获其中的内容。

方法:将(内容)改为(?:内容)

环视

(?=abc)是正则中表示位置的语法,用于表示一个位置,表示当前位置的右边必须是abc字符而不会匹配abc本身。

获取捕获组

完结,撒花!

WPS的vba库下载地址:
https://gitcode.net/as604049322/vba/-/raw/master/wps.vba.exe

自加载宏让你的Excel支持正则处理函数相关推荐

  1. VBA加载宏制作攻略

    本文所述加载宏是指使用EXCEL VBA制作的加载宏,这类文件的后缀默认为xla,因此又称XLA加载宏.内容划分为五部分,第一部分为概述,简单介绍加载宏的一般知识:第二部分至第四部分介绍制作加载宏函数 ...

  2. wpsppt加载项在哪里_《wps表格加载项在哪里》 WPS版的EXCEL中 加载宏和数据分析在哪?...

    wps表格里的查找功能在哪? 以WPS 2019版本为例: 可以在工具栏中单击"查找"功能哦. WPS中的excel表格将字段分组在哪 我在wps表格中了一个关于成绩的表格面我们来 ...

  3. wpsppt加载项在哪里_wpsppt加载项在哪里_《wps表格加载项在哪里》 WPS版的EXCEL中 加载宏和数据分析在哪?......

    wps表格里的查找功能在哪? 以WPS 2019版本为例: 可以在工具栏中单击"查找"功能哦. WPS中的excel表格将字段分组在哪 我在wps表格中了一个关于成绩的表格面我们来 ...

  4. 如何实现excel与matlab的数据交互 / 如何在Excel中设置MATLAB的加载宏 / 如何实现Excel与MATLAB的连接

    1.打开Excel,点击文件,点击选项. 2.点击加载项,点击转到. 3.在弹出的加载宏中点击浏览. 4.弹出的浏览选项卡中,找到你的matlab安装目录下的toolbox文件夹下的exlink文件夹 ...

  5. wps js宏开发表格数据归类拆分和excel文件合并的xlam加载宏插件

    前言 用wps js宏编辑器开发的表格数据拆分与合并的加载宏工具,写好代码把工作簿另存为xlam加载宏文件,然后添加到加载项即可使用.xlam文件你可以理解为没有工作表的工作簿,先看动画演示效果: 主 ...

  6. Excel开发个人工具箱-VBA加载宏

    在Excel中某些经常用到的功能,可以制作为加载宏,以快速调用. 以公式转文本为例,正常操作流程是:1)单元格赋值.2)粘贴为文本 这样的方式在复制大量单元格时,Excel会发生卡顿. step1:新 ...

  7. 图表添加特定横轴数据_Excel图表学习61: 编写一个给多个数据系列添加趋势线的加载宏...

    学习Excel技术,关注微信公众号: excelperfect 在<Excel图表学习60:给多个数据系列添加趋势线>中,我们手工给多个散点图系列添加了一条趋势线,如下图1所示. 图1 在 ...

  8. 他山之石——封装函数与COM加载宏

    继续学习VBA! '如果想用com加载宏的形式替代在excel的写EXCEL对象事件,可以在VB里编写好事件程序,封装到dll里,然后注册dll '和函数封装不同,com加载宏需要在VB里添加&quo ...

  9. PPT加载宏运行教程——实现更新图片链接、另存、断开链接等功能

    版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的. 最近因为懒得手工一个个更新PPT图表,所以设置了从Excel复制粘贴图片链接到PPT的骚操作: ...

  10. 加载宏(Addin)使用方法

    Office VBA Addin加载宏是一种使用VBA编写的程序,它通过加载设置,可以随Office程序启动而自动加载运行,是制作Excel自定义函数.Office菜单和功能区按钮.添加常用辅助功能的 ...

最新文章

  1. python的try exception捕获异常
  2. 皮一皮:如何识别对方回复话术的真实目的?
  3. 【网络安全】 利用 EHole 进行红队快速批量打点
  4. Java操作excel工具easyExcel
  5. java在文件的后面添加_java 在file的尾部添加数据的两种方法总结
  6. 活动目录安装方法(个人汇总)
  7. 整理了js数组去重4种方法
  8. linux ubuntu php7.0 安装 curl
  9. FullCalendar - 开源的多功能 JavaScript 日历插件
  10. 软件测试面试,面试官最后问:你有什么要问我的吗?应该如何回答
  11. 【资源管理器老是重启 win7资源管理器重启的解决办法】
  12. 国务院:关于促进云计算创新发展 培育信息产业新业态的意见
  13. 分享一个HTML【叶子特效】,确切一点 是 落叶特效(完整代码)
  14. web移动开发总结(六)
  15. JQuary(从原生js到jq,就发现jq好简单)
  16. SRS Audio Sandbox没有声音怎么办
  17. YUV数据格式与YUV_420_888
  18. 拼命加班撸Excel,准点下班的新人却被升职
  19. 手把手教你申请邓白氏编码
  20. asp.net发布web service时出现“未能创建类型”错误

热门文章

  1. 冰雪传奇刷怪计时器_专业冰雪传奇辅助计时器
  2. linux伊甸园论坛,tcsh问题 - Mandrake/Mandriva - Linux伊甸园论坛
  3. java读取文件效率优化_java 读文件 性能
  4. 内存卡卡速测试软件,手机绝配 这款128G存储卡实测速度惊人
  5. Windows XP 系统优化全攻略(转)
  6. ssm基于java的线上阅读平台的设计与实现毕业设计源码291023
  7. android 自带TextToSpeech没有声音
  8. 2022年学习数据科学的18个网站
  9. 【书山有路】互联网+:从IT到DT 读书笔记
  10. 汽车尾气排放在线监控系统解决方案