Excel VBA函数:将计算结果转换为公式字符串
创作时间:
作者:
@小白创作中心
Excel VBA函数:将计算结果转换为公式字符串
引用
CSDN
1.
https://blog.csdn.net/weixin_37942087/article/details/142920363
在工程设计领域,Excel是进行复杂计算的重要工具。为了方便将计算结果以公式形式展示,一位结构设计工程师开发了一个实用的VBA函数,能够将单元格的计算结果转换为完整的公式字符串,并支持位置引用和自定义名称引用。
背景需求
在工程设计工作中,Excel被广泛用于各种计算任务。为了便于记录和展示计算过程,有时需要将单元格的计算结果转换为公式字符串显示。具体需求包括:
- 将单元格的计算结果转换为公式字符串
- 支持位置引用(如A1、B2等)
- 支持自定义名称引用
- 如果最外层使用了ROUND函数,需要隐去该函数
函数实现
下面是一个满足上述需求的VBA函数实现:
Public Function xqzde(ans As Range) As String
' de for display equation
Dim formulastring As String
Dim innerformula As String
' 读取单元格(公式形式)
formulastring = ans.Formula
'1. 替换常用自定函数π以及绝对位置引用符号
formulastring = Replace(formulastring, "$", "")
formulastring = Replace(formulastring, "Pi()", "3.14")
formulastring = Replace(formulastring, "pi()", "3.14")
formulastring = Replace(formulastring, "PI()", "3.14")
'2. 识别外层round函数,有则删除
Dim ws As Worksheet
Set ws = ActiveSheet
Set regex = CreateObject("VBScript.RegExp")
regex.Global = True '全局匹配
regex.IgnoreCase = True '忽略大小写
regex.Pattern = "round\((.*)\)$"
Set matches = regex.Execute(formulastring)
If matches.Count > 0 Then
innerformula = matches(0).SubMatches(0)
commaposition = InStr(innerformula, ",")
innerformula = "=" & Left(innerformula, commaposition - 1)
Else
innerformula = formulastring ' 如果没有找到 round 函数,返回原始公式
End If
formulastring = innerformula
'3. 识别公式中的自定义名称并进行替换
Dim nm As Name
Dim namesArray() As Variant
Dim prefixpos As Integer
Dim cusname As String
Dim cellvalue As String
Dim temp As Variant
Dim isSorted As Boolean
ReDim namesArray(1 To ws.Names.Count, 1 To 2)
i = 1
' 3.1 遍历名称管理器中的所有名称
For Each nm In ws.Names
If nm.Parent.Name = ws.Name Then
namesArray(i, 1) = nm.Name
namesArray(i, 2) = Len(nm.Name)
i = i + 1
End If
Next nm
ReDim Preserve namesArray(1 To i - 1, 1 To 2)
' 使用冒泡排序算法按名称长度排序(先长后短)
For j = LBound(namesArray, 1) To UBound(namesArray, 1) - 1
isSorted = True
For i = LBound(namesArray, 1) To UBound(namesArray, 1) - 1
If namesArray(i, 2) < namesArray(i + 1, 2) Then
temp = namesArray(i, 1)
namesArray(i, 1) = namesArray(i + 1, 1)
namesArray(i + 1, 1) = temp
temp = namesArray(i, 2)
namesArray(i, 2) = namesArray(i + 1, 2)
namesArray(i + 1, 2) = temp
isSorted = False
End If
Next i
If isSorted Then Exit For
Next j
' 处理排序后的名称
For i = LBound(namesArray, 1) To UBound(namesArray, 1)
Set nm = ThisWorkbook.Names(namesArray(i, 1))
If nm.Parent.Name = ws.Name Then
prefixpos = InStr(nm.Name, "!")
If prefixpos > 0 Then
cusname = Mid(nm.Name, prefixpos + 1)
Else
cusname = nm.Name
End If
cellvalue = CStr(Range(nm.RefersTo).Value)
formulastring = Replace(formulastring, cusname, cellvalue)
End If
Next i
'4. 识别公式中的位置引用并进行替换
regex.Pattern = "([A-Z]+\d+)"
Set matches = regex.Execute(formulastring)
foundformula = formulastring
For i = 0 To matches.Count - 1
Set cellRef = ws.Range(matches(i).SubMatches(0))
If IsNumeric(cellRef.Value) Then
cellvalue = CStr(cellRef.Value)
Else
cellvalue = """" & cellRef.Value & """"
End If
foundformula = Replace(foundformula, matches(i).Value, cellvalue)
Next i
xqzde = foundformula & "="
End Function
使用示例
假设E3单元格包含一个复杂的计算公式,我们可以在A3单元格中使用这个函数来显示其公式字符串:
这个函数可以大大简化计算书的制作过程,提高工作效率。
总结
这个VBA函数通过字符串处理、正则表达式匹配和名称管理器操作,实现了将Excel单元格计算结果转换为公式字符串的功能。对于需要频繁使用Excel进行复杂计算的专业人士来说,这个函数具有很高的实用价值。
热门推荐
又一世界级超级工程,来了
高蛋白饮食对男性有何益处?这些食物蛋白质含量最高
效益与环境共存:科海思优化硫酸镍制备工艺的多赢策略
导数的定积分怎么求
“五一”出行健康指南:从出发到返程的全方位防护提示
让护理更有温度——叙事护理,用心做“暖护”
暗物质到底是什么?解读暗物质的前世今生!
一文看懂显卡行业发展现状及未来市场前景
林俊杰畅谈关于重塑自我、心碎和改变世界
钓鱼日常需要多少钓鱼技能
AI助手是什么?一文看懂AI助手概念、原理、应用、价值、趋势
提升财务管理效率的记账程序技巧与应用
GPA如何帮助学生提升竞争力
6张图看懂比特币价格与美股等主流资产走势相关性
漆酶在环境生物治理中的应用
机器学习中的数学基础:对数详解
快、准、狠:我军狙击“神器”QLU-11狙击型榴弹器
2型糖尿病管理再次升级,口服GLP-1带来更多代谢获益
职工社会养老保险缴费查询方法及领取条件详解
组装一台高性能电脑的指南
惊艳世界的中国十大传世名画,你知道几幅?
股权变更需要哪些步骤?个体户注销流程详解
芹菜的功效与作用禁忌 芹菜怎么做好吃
杜洋Daria:探索空间叙事中的建筑魅力
养老金差距之辨:地区经济与职业差异下的公平之道
《诗经》所蕴含的文学价值探究
【档案中的珠海】馆藏珍品集萃:侨批档案
企业财务预警指标体系的构建与应用
AI技术应用于会议纪要写作——提升效率与准确性
探索更高层次的养老途径:十种退休后的优质生活选择