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进行复杂计算的专业人士来说,这个函数具有很高的实用价值。
热门推荐
秋冬口干?这些水果帮你补水!
干燥综合征口干?这些方法可以缓解不适
秋冬口干不止?警惕干燥综合征!
酒驾扣12分,这个处罚到底重不重?
2025年春节去北京感受最地道的中国年!
冬天后视镜结冰怎么办, 处理不好可能会损坏, 这几种办法很简单
村支书引领乡村振兴:西五村的实践与探索
陕西16名村支书晋升公务员,基层治理新趋势
村支书的多重身份:从社会学视角看他们的社会政治资本
泉州卓云山滑翔伞:在空中俯瞰千年古城
冬日泉州:开元寺与清净寺的美食之旅
泉州西街:千年古街的前世今生
泉州十大必吃美食:从面线糊到沙茶火锅,品味闽南美食文化
揭秘网红张琦的社交媒体爆红秘籍
揭秘网红张琦与董明珠最新合作动态
李待问:奉贤的民族英雄
沈家花园:奉贤区唯一保存完整的西式花园别墅
秋冬打卡奉贤:海湾、东海观音寺必去!
奉贤新城:历史与科技的碰撞
多国留学生打卡奉贤传统文化:感受中国非遗魅力
双十一机械硬盘涨价,固态硬盘降价大揭秘!
世界卫生组织:长期饮酒与心理健康的关系
酒精如何让你陷入营养困境?
长期饮酒:健康隐患不容忽视
酒驾举报奖励500元!这份举报指南请收好
5万公里保养必修课:这4个关键部件关乎行车安全
央视新生代主持人集体亮相,谁将成为下一个“小尼”?
八字中木的作用及过多时的化解方法
五行喜用神为金的命理解析与生活应用
四柱八字风水与装饰的圆满性