当前位置: 首页 > news >正文

VBA之正则表达式(41)-- 快速标记两个星号之后的字符

实例需求:工作表中的数据保存在A列~G列,现需要识别D列中包含超过两个星号的内容,并将第3个星号及其之后的字符设置为红色字体,如图所示。

在这里插入图片描述

示例代码如下。

Sub Demo1()Dim objRegExp As ObjectDim objMatch As ObjectDim strMatch As StringDim iLoc As Integer, strTxt As StringarrData = [a1].CurrentRegionActiveSheet.Columns(4).Font.Color = vbNoneSet objRegExp = CreateObject("vbScript.Regexp")With objRegExp.Global = True.Pattern = "^\*[一-龟]+\*[一-龟]+(.*)$"For i = 2 To UBound(arrData)strTxt = arrData(i, 4)Set objMatch = .Execute(strTxt)If objMatch.Count > 0 ThenstrMatch = objMatch(0).submatches(0)If Len(strMatch) > 0 TheniLoc = VBA.InStrRev(strTxt, strMatch)Cells(i, 4).Characters(iLoc, Len(strTxt) - iLoc + 1).Font.Color = vbRedEnd IfEnd IfNext iEnd WithSet objRegExp = NothingSet objMatch = Nothing
End Sub

【代码解析】
第6行代码将A1单元格所在的数据区域加载到数组中。
第7行代码将D列单元格字体颜色设置为“自动”。
第8行代码创建正则对象。
第10行代码设置正则全局匹配。
第11行代码设置正则匹配规则。

正则表达式说明
^匹配开始位置
\*[一-龟]+匹配一个星号加多个中文字符
$匹配最后位置

第12~22行代码循环处理每行数据。
第13行代码读取D列单元格内容。
第14行代码执行正则匹配。
第15行代码判断是否匹配成功。
第16行代码读取匹配组内容。
第17行代码匹配组内容是否为空。
第18行代码在单元格内容中查找匹配组的字符位置。
注意此处必须使用InStrRev,而不能使用如下代码,如果单元格内容中有重复字符,下述方法定位的位置将出现错误,例如:*万事如意*身体健康*万事如意
iLoc = VBA.InStr(1, strTxt, strMatch)
第19行代码设置相应字符的字体颜色为红色。
第24~25行代码释放对象变量占用的系统资源。


不使用VBA字符查找,也可以可以完美实现这个问题。

Sub Demo2()Dim objRegExp As ObjectDim objMatch As ObjectDim strMatch As StringDim iLoc As Integer, strTxt As StringarrData = [a1].CurrentRegionActiveSheet.Columns(4).Font.Color = vbNoneSet objRegExp = CreateObject("vbScript.Regexp")With objRegExp.Global = True.Pattern = "\*[一-龟]+"For i = 2 To UBound(arrData)strTxt = arrData(i, 4)Set objMatch = objRegExp.Execute(strTxt)If objMatch.Count > 2 TheniLoc = objMatch(2).firstindex + 1Cells(i, 4).Characters(iLoc, Len(strTxt) - iLoc + 1).Font.Color = vbRedEnd IfNext iEnd WithSet objRegExp = NothingSet objMatch = Nothing
End Sub

【代码解析】
第15行代码判断匹配成功的数量是否超过两个。
第16行代码代码使用第3个匹配组(objMatch(2))的firstindex属性获取字符起始位置,由于正则对象中编号都是0开始的,所以需要加1才能应用于第17行代码中。

http://www.lryc.cn/news/24738.html

相关文章:

  • VMware16安装MacOS【详细教程】
  • Netty学习(一):Netty概述
  • 【论文精读】Benchmarking Deep Learning Interpretability in Time Series Predictions
  • 自己第一次在虚拟机完整部署ssm项目心得体会
  • 操作系统权限提升(二十二)之Linux提权-SUDO滥用提权
  • 操作系统权限提升(二十四)之Linux提权-明文ROOT密码提权
  • Linux基本命令复习-面试急救版本
  • 随想录二刷Day09——字符串
  • 正点原子IMX6ULL开发板-liunx内核移植例程-uboot卡在Starting kernel...问题
  • 使用手工特征提升模型性能
  • 【运维有小邓】Oracle数据库审计
  • JDK下载安装与环境
  • FPGA纯verilog代码实现4路视频缩放拼接 提供工程源码和技术支持
  • Spark on YARN运行过程,YARN-Client和YARN-Cluster
  • NLP中一些工具列举
  • 面试官:给你一段有问题的SQL,如何优化?
  • 嵌入式 Linux 文件IO操作
  • 植物大战 二叉搜索树——C++
  • [MatLab]矩阵运算和程序结构
  • 【Leedcode】栈和队列必备的面试题(第四期)
  • Windows Server 2016搭建文件服务器
  • 零基础学SQL(十一、视图)
  • web,h5海康视频接入监控视频流记录三(后台node取流)
  • 网络安全从入门到精通:30天速成教程到底有多狠?你能坚持下来么?
  • 世界上最流行的编程语言,用户数超过Python,Java,JavaScript,C的总和!
  • 杂谈:created中两次数据修改,会触发几次页面更新?
  • 原生JS实现拖拽排序
  • Coredump-N: corrupted double-linked list
  • 5个好用的视频素材网站
  • 使用码匠连接一切|二