VBA之正则表达式(42)-- 快速提取名称

实例需求:A列为待处理数据,现需要从中提取商品名、通用名、胰岛素笔相关信息,保存到B列至D列,需要注意如下几点:

  • 胰岛素笔(E列)数据只存在于每组产品的第一行记录中,例如第2行数据中的“胰岛素笔”,对应第2~8行数据。
  • 商品名称可能以数字或者字母结尾,通用名可能以数字开头

在这里插入图片描述

示例代码如下。

Sub Demo()Dim objRegExp As ObjectDim objMatch As ObjectDim arrRes(), strTxt, iRow, i, intLstRowDim rngRes As RangeSet objRegExp = CreateObject("vbscript.regexp")objRegExp.Pattern = "^([一-龟]{3}( [\d/]+| [A-Z\d]+){0,1}) (.*?)($| (/*[一-龟]{2,3}笔)+)"objRegExp.Global = TrueintLstRow = Cells(Rows.Count, 1).End(xlUp).RowReDim arrRes(1 To intLstRow - 1, 1 To 3)iRow = 1For i = 2 To intLstRowstrTxt = Trim(Cells(i, 1))Set objMatch = objRegExp.Execute(strTxt)If objMatch.Count > 0 ThenarrRes(iRow, 1) = objMatch(0).submatches(0)arrRes(iRow, 2) = objMatch(0).submatches(2)arrRes(iRow, 3) = Trim(objMatch(0).submatches(3))iRow = iRow + 1End IfNextWith Cells(2, 2).Resize(intLstRow - 1, 3).Clear.UnMerge.Value = arrResEnd WithSet rngRes = Cells(2, 4)For i = 3 To intLstRowIf Len(Trim(Cells(i, 4))) = 0 ThenSet rngRes = Union(rngRes, Cells(i, 4))ElseIf rngRes.Cells.Count > 1 Then rngRes.MergeSet rngRes = Cells(i, 4)End IfNextWith Cells(2, 4).Resize(intLstRow - 1, 1).HorizontalAlignment = xlCenter.VerticalAlignment = xlCenterEnd WithSet objRegExp = NothingSet objMatch = Nothing
End Sub

【代码解析】
第6行代码创建正则对象。
第7行代码设置正则匹配模式。

正则表达式说明
^([一-龟]{3}( [\d/]+| [A-Z\d]+){0,1}) 匹配三个汉字字符开头,后面可以跟一个空格和数字/斜线或大写字母/数字的组合(可选)
(.*?)匹配任意长度的任意字符,直到遇到下一个规则
(/*[一-龟]{2,3}笔)+)匹配任意数量的斜线字符,之后跟两个或者三个汉字,最后以“笔”字结束

第8行代码设置正则全局匹配。
第12~21行代码循环处理每行数据。
第13行代码读取数据,并使用Trim函数去除空格。
第14第行代码执行正则匹配。
第15行代码判断匹配是否成功。
第16~18行代码读取匹配结果中的内容。
第23行代码清空保存结果的区域。
第23行代码取消合并单元格。
第24行代码将结果回写到单元格区域中。
第27~35行代码实现D列合并单元格。
第29行代码判断D列单元格是否空。

  • 如果为空,则第30行代码将单元格区域合并至变量rngRes中。
  • 如果不为空,则第32行代码上一组产品对应D列合并,并初始化变量rngRes

第36~39行代码设置D列格式水平居中垂直居中。
第40~41行代码释放对象变量占用的系统资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/8151.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apikit 自学日记:保存、使用测试用例

API测试用例是SaaS版本企业版才能使用的功能,免费版用户可通过付费升级后使用。 API管理应用中的测试用例管理涉及到两个场景:单接口测试用例管理 和 多接口测试用例批量测试。 一、单接口测试用例管理 功能入口:API管理应用 / 选中某个项目…

vscode copilot长时间没反应

检测问题 首先看一下OUPUT插件信息有什么异常 如果没有异常,但是也没输出 那是请求没有相应的原因 可以在vscode里设置一下代理 参考:https://github.com/orgs/community/discussions/29127

ArcPy学习心得系列(5)遥感数据中值滤波与均值滤波实现方法(不计入NoDATA)

在数据处理与应用的过程中,我们难免会遇到一些低质量的遥感数据,低质量遥感数据一般是由于天气因素导致的,在云量较多时,卫星传感器所采集到的地面信息被云层所遮挡,导致遥感图像成像过程中产生了较多噪声,对遥感数据的精确度造成了一定影响,如果不解决这些数据中的噪声…

【UE5 Cesium】05-Cesium for Unreal 在子关卡中添加Actor

上一篇:【UE5 Cesium】04-Cesium for Unreal 将不同地区的倾斜摄影作为不同子关卡 步骤 首先将关卡切换到“DenverRooftop” 添加一个“立方体” 将关卡切换到“Globe” 然后再向场景中添加一个“椎体” 此时如果我们将关卡切换到“Boston”,只能看到“…

我的毕业故事

前言 2023年6月25日,在拿到双证(毕业证书/学士学位证书)之后,我正式毕业,结束了本科学习阶段。 由于毕业设计中了盲审,因此在大致顺利的过程中平添了不少故事,这里就对近两个月做一个回顾。 盲审 首先解释一下什么…

c++高性能264/265实时h5流媒体服务器前后端整体解决方案

c高性能264/265实时h5流媒体服务器前后端整体解决方案 1.效果展示 下图展示了前端播放效果。 播放1路264视频流,4路265视频流 CPU占用率10%(测试机器上运行着c服务端和其他工具程序) GPU0占用率17% 1.1 作者测试机器配置 处理器 11th Gen Intel Core™ i7-118…

AI 语音 - 人物音色训练

前情提要 2023-07-02 周日 杭州 阴晴不定 AI 入门三大项,AI 绘画基础学习,AI 语音合成,AI 智能对话训练,进入 AI 语音合成阶段了,搓搓小手很激动的,对于一个五音不全的我来说,这个简直了(摆脱…

Spring容器获取Bean的9种方式 | 京东云技术团队

1 前言 随着SpringBoot的普及,Spring的使用也越来越广,在某些场景下,我们无法通过注解或配置的形式直接获取到某个Bean。比如,在某一些工具类、设计模式实现中需要使用到Spring容器管理的Bean,此时就需要直接获取到对…

4.设计模式之后七种模式后11种模式命令访问者迭代器发布订阅中介者忘备录解释器状态策略职责链和空模式

1.命令(command)模式 不知道命令接收者(对象)是谁,支持撤销 (接受者 间接调用执行 的具体行为) 命令调用者和接收者解耦 //只要实现命令接口即可 (就是客户端给个命令,然后命令类传给接收类执行) 优点和缺点 容易撤销操作 命令队列可以多线程操作 增加过多的命令类 空命令也是一…

Devops之制品库平台实践-nexus

Devops之制品库平台实践-nexus 目录 本节实践 实战名称💘 实践:配置Maven代理仓库(测试成功)-2022.6.7💘 实践:创建Maven本地仓库(依赖)-2022.6.10(测试成功)💘 实践:创建Raw本地仓…

SpringCloudAlibaba实战入门之RocketMQ消息发送(六)

本篇文章是承接上一篇文章《SpringCloudAlibaba实战入门之RocketMQ下载配置和启动(五)》,如果没有看过上一篇文章并按照指导配置和启动Rocket MQ的网友,请先阅读该篇文章以后再阅读本篇 一、创建spring-cloud-rocketmq项目 1、复制之前的项目模块新建一个项目模块,修改新…

自定义MVC引用XML配置文件实现

目录 前言 自定义MVC实现 1. 导入XML配置文件 2. 导入XML解析建模 3. 优化中央控制器 3.1 修改DisPathServlet中init初始化方法 3.2 修改ActionServlet逻辑处理流程 3.3 通过反射机制实例化子控制器类 3.4 中央控制器将请求委托给子控制器处理 3.5 根据请求结果码跳…