根据评论,我澄清了我的要求。
我想将跨多个单元格的嵌套公式展平为单个公式。
以下示例仅用于演示如何手动执行此操作。但是,公式可以是任何种类/类型,并且与以下示例完全无关。
我很好奇是否可以用 code/tools/excel 本身来实现以下效果 -
正如您在图片中看到的,in hours
公式非常简单,但实际上它是由来自其他单元格的一堆公式组成的。我想知道是否可以通过获取一个由单个巨型公式中的所有公式生成的公式来摆脱中间计算。
虽然用这种方法设计和调试大型公式很容易,但在生产中,新手用户很容易通过尝试修改工作表而破坏部分公式。您可以通过锁定工作表并解锁其他内容来保护它,但这也会产生意想不到的副作用,例如无法扩展公式范围或添加新行等。
因此对于生产,我想知道是否有可能对以这种方式组成的东西获得单一公式答案。
在上面的例子中,我们尝试根据字符串小时计算数字小时。
in hours = in seconds / 3600 = O2 / 3600
in seconds = HOURS * 3600 + MINUTES * 60 + SECONDS
HOURS = extract digits if they exist between 'h' and beginning of string
MINUTES = extract digits if they exist between 'h' and 'm'
SECONDS = extract digits if they exist between 'm' and end of string
所以如果你手动替换公式,结果会像这样
in hours = (HOURS * 3600 + MINUTES * 60 + SECONDS) / 3600
= (extract digits if they exist between 'h' and beginning of string * 3600 + extract digits if they exist between 'h' and 'm' * 60 + extract digits if they exist between 'm' and end of string) / 3600
如您所见,这个例子非常简单,但我想知道是否可以对其他复杂的复合函数执行此操作?
Excel 已经以某种方式自行完成了所有这些计算AST我认为,因为它已经检测到了循环依赖关系等。那么一定有办法自己做吗?或者挂接到 Excel 底层来提取相同的公式?
答案1
您可能可以做您想要的事情,但如果您可以使用 UDF,它可能会更简洁。
Option Explicit
Function MyHrs(MyType As String, target As String) As Single
Dim x As Long, y As Long, z As Long
Dim Hrs As Long, Mns As Long, Ss As Long
On Error Resume Next
x = InStr(target, "h")
y = InStr(target, "m")
z = InStr(target, "s")
Hrs = Left(target, x - 1)
Mns = Mid(target, x + 1, y - x - 1)
Ss = Mid(target, y + 1, z - y - 1)
If MyType = "h" Or MyType = 1 Then MyHrs = Hrs + Mns / 60 + Ss / 3600
If MyType = "m" Or MyType = 2 Then MyHrs = Hrs * 60 + Mns + Ss / 60
If MyType = "s" Or MyType = 3 Then MyHrs = Hrs * 3600 + Mns * 60 + Ss
End Function
使用 ALT + F11 打开开发者窗口,然后插入模块并粘贴代码。在工作表中使用它如下:
这个可能需要更多的编码来避免产生的错误,但它应该可以演示这个概念。