自加载宏让你的Excel支持正则处理函数
作者:小小明
大家好,我是小小明,今天我要给大家分享一个我自己用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支持正则处理函数相关推荐
- VBA加载宏制作攻略
本文所述加载宏是指使用EXCEL VBA制作的加载宏,这类文件的后缀默认为xla,因此又称XLA加载宏.内容划分为五部分,第一部分为概述,简单介绍加载宏的一般知识:第二部分至第四部分介绍制作加载宏函数 ...
- wpsppt加载项在哪里_《wps表格加载项在哪里》 WPS版的EXCEL中 加载宏和数据分析在哪?...
wps表格里的查找功能在哪? 以WPS 2019版本为例: 可以在工具栏中单击"查找"功能哦. WPS中的excel表格将字段分组在哪 我在wps表格中了一个关于成绩的表格面我们来 ...
- wpsppt加载项在哪里_wpsppt加载项在哪里_《wps表格加载项在哪里》 WPS版的EXCEL中 加载宏和数据分析在哪?......
wps表格里的查找功能在哪? 以WPS 2019版本为例: 可以在工具栏中单击"查找"功能哦. WPS中的excel表格将字段分组在哪 我在wps表格中了一个关于成绩的表格面我们来 ...
- 如何实现excel与matlab的数据交互 / 如何在Excel中设置MATLAB的加载宏 / 如何实现Excel与MATLAB的连接
1.打开Excel,点击文件,点击选项. 2.点击加载项,点击转到. 3.在弹出的加载宏中点击浏览. 4.弹出的浏览选项卡中,找到你的matlab安装目录下的toolbox文件夹下的exlink文件夹 ...
- wps js宏开发表格数据归类拆分和excel文件合并的xlam加载宏插件
前言 用wps js宏编辑器开发的表格数据拆分与合并的加载宏工具,写好代码把工作簿另存为xlam加载宏文件,然后添加到加载项即可使用.xlam文件你可以理解为没有工作表的工作簿,先看动画演示效果: 主 ...
- Excel开发个人工具箱-VBA加载宏
在Excel中某些经常用到的功能,可以制作为加载宏,以快速调用. 以公式转文本为例,正常操作流程是:1)单元格赋值.2)粘贴为文本 这样的方式在复制大量单元格时,Excel会发生卡顿. step1:新 ...
- 图表添加特定横轴数据_Excel图表学习61: 编写一个给多个数据系列添加趋势线的加载宏...
学习Excel技术,关注微信公众号: excelperfect 在<Excel图表学习60:给多个数据系列添加趋势线>中,我们手工给多个散点图系列添加了一条趋势线,如下图1所示. 图1 在 ...
- 他山之石——封装函数与COM加载宏
继续学习VBA! '如果想用com加载宏的形式替代在excel的写EXCEL对象事件,可以在VB里编写好事件程序,封装到dll里,然后注册dll '和函数封装不同,com加载宏需要在VB里添加&quo ...
- PPT加载宏运行教程——实现更新图片链接、另存、断开链接等功能
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的. 最近因为懒得手工一个个更新PPT图表,所以设置了从Excel复制粘贴图片链接到PPT的骚操作: ...
- 加载宏(Addin)使用方法
Office VBA Addin加载宏是一种使用VBA编写的程序,它通过加载设置,可以随Office程序启动而自动加载运行,是制作Excel自定义函数.Office菜单和功能区按钮.添加常用辅助功能的 ...
最新文章
- python的try exception捕获异常
- 皮一皮:如何识别对方回复话术的真实目的?
- 【网络安全】 利用 EHole 进行红队快速批量打点
- Java操作excel工具easyExcel
- java在文件的后面添加_java 在file的尾部添加数据的两种方法总结
- 活动目录安装方法(个人汇总)
- 整理了js数组去重4种方法
- linux ubuntu php7.0 安装 curl
- FullCalendar - 开源的多功能 JavaScript 日历插件
- 软件测试面试,面试官最后问:你有什么要问我的吗?应该如何回答
- 【资源管理器老是重启 win7资源管理器重启的解决办法】
- 国务院:关于促进云计算创新发展 培育信息产业新业态的意见
- 分享一个HTML【叶子特效】,确切一点 是 落叶特效(完整代码)
- web移动开发总结(六)
- JQuary(从原生js到jq,就发现jq好简单)
- SRS Audio Sandbox没有声音怎么办
- YUV数据格式与YUV_420_888
- 拼命加班撸Excel,准点下班的新人却被升职
- 手把手教你申请邓白氏编码
- asp.net发布web service时出现“未能创建类型”错误
热门文章
- 冰雪传奇刷怪计时器_专业冰雪传奇辅助计时器
- linux伊甸园论坛,tcsh问题 - Mandrake/Mandriva - Linux伊甸园论坛
- java读取文件效率优化_java 读文件 性能
- 内存卡卡速测试软件,手机绝配 这款128G存储卡实测速度惊人
- Windows XP 系统优化全攻略(转)
- ssm基于java的线上阅读平台的设计与实现毕业设计源码291023
- android 自带TextToSpeech没有声音
- 2022年学习数据科学的18个网站
- 【书山有路】互联网+:从IT到DT 读书笔记
- 汽车尾气排放在线监控系统解决方案