VBA之正则表达式(47)-- 快速将公式转换为静态值计算

embedded/2024/10/15 20:23:39/

实例需求:工作表I列包含多种计算公式,为了便于演示,将I列公式显示在J列单元格中,现在需要将公式的单元格引用转换为静态值,如K列所示。

在这里插入图片描述

示例代码如下。

Sub RegExpDemoReplace()Dim Res()Dim objRegEx As ObjectDim objMH As Object, sRef As StringDim j As Integer, i As Long, sFormula As StringSet objRegEx = CreateObject("vbscript.regexp")objRegEx.Pattern = "([A-Z]{1,3}\d{1,7})"objRegEx.Global = TrueDim lastRow As Long, arrDatalastRow = Cells(Rows.Count, "I").End(xlUp).RowarrData = Range("I6:I" & lastRow).FormulaFor i = 1 To UBound(arrData)If Left(arrData(i, 1), 1) = "=" ThensFormula = arrData(i, 1) & " "Set objMH = objRegEx.Execute(sFormula)If objMH.Count > 0 ThenFor j = 0 To objMH.Count - 1sRef = objMH(j).submatches(0)sFormula = Replace(sFormula, sRef, Range(sRef))NextarrData(i, 1) = "'" & sFormulaEnd IfEnd IfNext[K6].Resize(UBound(arrData), 1).Value = arrDataSet objRegEx = NothingSet objMH = Nothing
End Sub

【代码解析】
第7行代码创建正则对象。
第8行代码设置正则匹配模式。
第9行代码设置正则全局匹配。
第11行代码获取最后数据行的行号。
第12行代码将I列公式保存在数组中。
第14行代码判断单元格中是否包含公式。
第15行代码执行正则匹配。
第17行代码判断是否匹配成功。
第18~21行代码循环处理每个匹配结果。
第19行代码读取匹配结果的子匹配。
第20行代码将单元格引用替换为静态值。
第22行代码将更新后的公式写入数组。
第26行代码公式写入工作表K列,当然此处也可以用于更新I列的公式。
第27~28行代码清空对象变量,释放系统资源。


请注意代码不适用如下几种场景:

  1. 公式中使用跨工作表引用,代码中Range(sRef)只能获取活动工作表引用单元格对应的静态值。
  2. 公式中存在多单元格引用区域,例如SUM(A1:C3)
  3. 单元格引用地址存在部分重复,例如公式 =A1+A100,需要优化代码首先替换A100,然后再替换A1,否则无法得到正确结果

http://www.ppmy.cn/embedded/102730.html

相关文章

速盾:如何选择适合企业的高防 IP 和 CDN?

在当前互联网时代,企业面临着越来越多的网络安全威胁,其中之一就是DOS/DDOS攻击。为了保护企业的在线业务,很多企业都会选择使用高防IP和CDN服务。然而,如何选择适合企业的高防IP和CDN服务呢?下面是一些关键因素可以帮…

数据结构(6.4_4)——Floyd算法

Floyd算法 第一步:建立两个二维数组,一个用来存放所有顶点,一个用来存放顶点之间的中转点 第二步:循环遍历A矩阵,若,则,;否则 和保持原值,循环完所有i,j后更新数组并且…

用爬虫玩转石墨文档细解

​ ​ 您好,我是程序员小羊! 前言 石墨文档是一款受欢迎的在线协作工具,它允许多人实时编辑和共享文档。通过爬虫技术,我们可以自动化地获取石墨文档中的内容,进行数据分析或备份。不过,在使用爬虫技术时&a…

unity超简单多语言管理类

自用记录贴&#xff0c;针对小体量工程写的一个最简单的多语言管理脚本。 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking;/// <summary> /// 多语言管理类 /…

【netty系列-08】深入Netty组件底层原理和基本实现

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…

算法练习题02:ISBN码

问题描述&#xff1a; 每本正式出版的图书都有一个对应的 ISBN 码。ISBN 包含九位数字、一位校验码和三个分隔符&#xff0c;其格式规定为 x-xxx-xxxxx-x&#xff0c;其中分隔符为键盘上的减号 -&#xff0c;最后一位为校验码。 例如&#xff0c;0 代表英语&#xff0c;紧跟着…

MSSQL 工具注入(第一关)

简介 SQL注入是一种安全漏洞&#xff0c;通过它可以执行意外的SQL命令或访问数据库中的信息。MSSQL注入通常发生在应用程序将用户输入作为SQL查询的一部分执行时&#xff0c;而没有对输入进行适当的验证或清理。 以下是MSSQL手工注入的流程&#xff1a; 一、打开靶场选择第一关…

灵神算法题单——定长滑动窗口(进阶)

2134. 最少交换次数来组合所有的 1 II 断环成链滑动窗口 思路先算出数组中1有多少&#xff0c;然后看这么长的窗口里0最少是多少&#xff0c;此时即为最少交换次数。 首先遍历算出1的数量k&#xff0c;然后用Insert拼接数组&#xff0c;从而实现循环。 然后双指针遍历数组&…