我有一张 Excel 工作表,它使用了很多单元格来计算最终结果。我发现这些中间结果在创建公式时可能很有用。现在我想删除中间结果,只在一个单元格中保留一个公式。
我知道如何手动执行此操作,例如如上所述在这个问题和答案中。不过,我想知道是否有自动方式。
当我使用跟踪函数时,Excel 似乎已经知道这些值来自哪里:
通常我会简单地隐藏行以使其不可见。在这种情况下,我无法做到这一点,因为其他列中有重要的值。
答案1
这查尔·普雷托里乌斯的回答很有帮助。修复 2 个问题后,宏对我有用。我在更改脚本的地方添加了注释。
请注意,宏需要按照您希望进行替换的频率运行。可以执行所有替换,但也许应该保留对单元格的最后一个引用。
Sub CombineFormula()
Dim FormulaCell As Range
Set FormulaCell = ActiveCell
Dim StrTemp As String
StrTemp = FormulaCell.Formula
'Do not replace the $ sign in absolute addresses.
'It may be used in text, e.g. in a formula like ="US$"&A1
'Instead, use different adressing modes in the replacement loop
'! StrTemp = Replace(StrTemp, "$", "")
Dim RangeRef As Range
On Error Resume Next
Dim ReplaceBy As String
For Each RangeRef In FormulaCell.Precedents.Cells
'Add in parentheses to maintain correct order of evaluation, e.g. in cases of addition before multiplication
ReplaceBy = "(" + Replace(RangeRef.Formula, "=", "") + ")"
'The order of the following is important
'Replace absolute ranges first, because A$1 is also contained in $A$1
StrTemp = Replace(StrTemp, RangeRef.Address(True, True), ReplaceBy)
StrTemp = Replace(StrTemp, RangeRef.Address(True, False), ReplaceBy)
StrTemp = Replace(StrTemp, RangeRef.Address(False, False), ReplaceBy)
StrTemp = Replace(StrTemp, RangeRef.Address(False, True), ReplaceBy)
Next
FormulaCell.Value2 = StrTemp
End Sub
答案2
我不确定您是否乐意在工作表中使用宏,但下面是一个简单的宏来实现您想要的功能。只需将代码复制到 VBA,选择要清理的单元格并运行宏,如果您有很多事情要做,您甚至可以为其创建快捷键。但要小心,如果您运行宏,您的所有撤消历史记录都将被删除。
Sub CombineFormula()
Dim FormulaCell As Range
Set FormulaCell = ActiveCell
Dim StrTemp As String
StrTemp = FormulaCell.Formula
StrTemp = Replace(StrTemp, "$", "")
Dim RangeRef As Range
On Error Resume Next
For Each RangeRef In FormulaCell.Precedents.Cells
StrTemp = Replace(StrTemp, RangeRef.Address(False, False), Replace(RangeRef.Formula, "=", ""))
Next
FormulaCell.Value2 = StrTemp
End Sub
答案3
据我所知,没有直接的方法可以解决这个问题,但我认为函数公式文本可能会对你有用。该函数FORMULATEXT(单元格编号)将返回文本形式的公式,可用于进行一些修改,例如
A3 =公式文本(A1)+公式文本(A2)或类似的东西来实现你的目标。