打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Excel VBA【案例分享】正则表达式提取中文字符/五笔字型编码文本整理

快速浏览

往期合集:【2023年3月】【2023年4月】【2023年5月】【2023年6月2023年7月2023年8月

实用案例

|日期控件||简单的收发存|

|电子发票管理助手|

|电子发票登记系统(Access版)|

|Excel多种类型文件合并|

|Excel表格拆分神器|

|批量生成审计凭证抽查底稿|

|中医诊所收费系统(Excel版)|

|中医诊所收费系统(Access版)|

|收费管理系(Access改进版)|

收费使用项目

|财务管理系统||工资薪金和年终奖个税筹划|

内容提要

  • 正则表达式提取中文字符
大家好,我是冷水泡茶,今天在EXCELHOME论坛上看到一个求助贴:如何VBA把连续拼音字符去掉?
下了附件一看,他的数据是这样的:
经过一通分析,这应该是一个输入法的码表,前面是五笔字型编码,后面是词组,但是混合了拼音。
他现在要把拼音去掉,变成右侧五笔字型编码+词组的形式。
到底应该怎么做呢?
如果从他的提问的方向出发,“去掉”拼音,我们得设法“去掉“英文字和“|”符号,似乎不太好下手,因为前面也有拼音;如果要判断连续的英文字母是汉语拼音,好象也没有什么好办法。
其实,我们换一个角度来考虑,他“要保留什么”,问题就好解决了。即保留前面几位字母和后面的汉字,当然也并非如此简单。
我们可以采用正则表达式提取中文字符,再从前面截取几位字母,应该能达成楼主的需求,分享给大家:

基本思路:

1、把B:C列原始数据读入数组arr()。
2、循环数组,利用正则表达式提取第1列中的中文字符。
3、从数组第1列字符中截取第一个空格前的字符(原本是截取5位,4个字母+1个空格,后来发现编码有3位的)。
4、把第3、第2条所得的字符拼接起来。
5、把拼接的字符写入数组的第2列。
6、把数组回写到工作表。

VBA代码

1、在模块1里,process过程

Sub process()    On Error Resume Next    Dim ws As Worksheet    Dim lastRow As Integer    Dim arr(), str1 As String, str2 As String    Dim regex As Object    Dim matches As Object    Set ws = ThisWorkbook.Sheets("Sheet1")    Set regex = CreateObject("VBScript.RegExp")    regex.Global = True    regex.IgnoreCase = True    regex.Pattern = "[\u4e00-\u9fa5\d]+"    With ws        lastRow = .UsedRange.Rows.Count        .Range("C2:C" & lastRow).ClearContents        arr = ws.Range(Cells(2, 2), Cells(lastRow, 3)).Value        For i = 1 To UBound(arr)            str1 = arr(i, 1)            Set matches = regex.Execute(str1)            For j = 0 To matches.Count - 1                str2 = str2 & matches(j) & " "            Next            str2 = Left(str2, Len(str2) - 1)  '去掉尾部多余空格            arr(i, 2) = Left(str1, InStr(str1, " ")) & str2            str2 = ""        Next        .Range("B2").Resize(UBound(arr), 2) = arr    End WithEnd Sub

代码解析:
(1)Line2,容错语句,防止正则表达式匹配不到内容报错。
(2)Line3~7,定义变量,数组、工作表对象、字典对象、正则表达式对象等
(3)line12,正则表达式的模式(pattern),匹配任意数量的中文与数字。这里原来仅仅匹配中文的,但在测试中发现,个别文本中还带有数字。
(4)line16,把原始数据装入数组arr()。
(5)line17~26,循环数组,逐个处理第一列字符,把结果存到第二列
(A)line18,把第一列字符赋值给str1,方便后面引用。
(B)line19,进行正则表达式的匹配
(C)line20~25,对匹配结果进行处理,把多个匹配结果连接起来,中间空一格,去掉尾部多余的空格,赋值给str2;把第一列字符第一个空格及前面的字符截取出来,并与str2相连接,存到数组第二列。
(6)line27,把数组结果回写到工作表
2、在工作表Sheet1里,命令按钮
Private Sub CmdProcess_Click()    Call processEnd Sub
Private Sub CmdClear_Click() With Sheets("Sheet1") .Range("C2:C" & .UsedRange.Rows.Count).ClearContents End WithEnd Sub

代码解析:

(1)Line1~3,调用process处理过程。
(2)Line5~9,清除C列生成的内容,这主要是为了演示的需要,在process过程中也有清除内容的语句

动画演示

总结

1、用正则表达式处理字符串,非常方便。

2、我们考虑问题的时候,如果正面处理没法下手,可以试试换一个角度看问题。

~~~~~~End~~~~~~
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java split方法和正则表达式
提取Word中带下划线的字符到数组
《神奇的VBA》编程:批量清除多个字符
精通 JavaScript中的正则表达式 - JavaScript
精通JS正则表达式(推荐)
js正则表达式常用函数方法及简单应用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服