如何用单元格引用替换引用单元格包含的公式

How can I substitute a cell reference for the formula the referred cell contains

如何用单元格引用替换它包含的公式,换句话说,"expand" 或 "derivate" 单元格引用?

举个例子,我知道我可以使用 PV() 来计算它:假设我想计算给定金额、折减器、期间数和贴现率的现值,并且在电子表格中我有:

A2: 1 (number of periods)
B2: 5000 (amount)
C2: 0,8 (reductor)
G1: 6% (discount rate)

如果我想计算 D2 的最终结果,我必须输入:

=(B2*C2)*(1+$G)^(-A2)

(我故意在上面使用了一些不必要的括号)

但是,如果我需要,为了调试,或者为了构建具有更多嵌套计算的更复杂的公式,请在单元格上写:

D2: =E2*F2^G2
E2: =B2*C2
F2: =1+$G
G2: =-A2

这样我就可以检查计算的每个部分是否正常,最终公式是否正确 "assembled"(或者轻松更正可能出错的地方或更改它以计算其他内容,例如未来价值,为此我会删除 G2 上的减号)。

在完成这些步骤后,在单元格 D2 上使用一些 function/shortcut/feature 来替换

"=E2*F2^G2"

"=(B2*C2)*(1+$G)^(-A2)"

(即执行 E2 → (B2*C2) F2 → (1+$G$1) 和 G2 → (-A2))以便在正确的位置构建所需的公式,我可以摆脱临时单元格。

我能找到的最接近此行为的是 formulatext() 函数,但它仅适用于单个引用,并且始终包含“=”,例如

=CONCAT(FORMULATEXT(E2);"*";FORMULATEXT(F2);"^";FORMULATEXT(G2))

结果

=B2*C2*=1+$G^=-A2

这不是想要的结果。

我期望找到的是当一个 select 公式的一部分并按 F9 并用它代替值,但应用于函数或中间步骤时。

由于 Excel 上似乎确实不存在内置函数,因此我根据 Parsing and extracting cell references from Excel formulas?

上的答案编写了一个脚本来执行此操作

适用于 Excel 365(也可能适用于其他版本),仅替换活动单元格上的引用,不适用于包含间隔的单元格(例如,它将在包含间隔的单元格上失败=sum(A1:A5) ) 并且前面单元格的内容最终将括在括号中。它也不会替换 "locked" 个单元格(=$B$2 也不会被替换)。

总的来说,它并不完美,也许它也不够优雅,但它似乎和我需要的一样好,并且在建议的范围内工作。

Sub ReplacePrecedents()
Dim r As Range, rr As Range
With ActiveCell.Range("A1")
    ' store the contents of the cell
    parsedcontents = .Formula
    Set r = .DirectPrecedents
    ' iterate throughout all precedents
    For Each rr In r
        ' store each one between parentheses
        appendstr = "("
        ' check whether first character is a "=" or a value
        If StrComp(Left(rr.Range("A1").Formula, 1), "=") = 0 Then
            appendstr = appendstr & Right(rr.Range("A1").Formula, Len(rr.Range("A1").Formula) - 1)
        Else
            appendstr = appendstr & rr.Range("A1").Formula
        End If
        appendstr = appendstr & ")"
        ' do the magic
        parsedcontents = Replace(parsedcontents, rr.Address(0, 0), appendstr)
    Next rr
    ' write the parsed string to the cell
    .Formula = parsedcontents
End With
End Sub

谢谢大家的回复,我想我仍然没有足够的权限来点赞评论,一旦我点赞了,我会的。