【问题标题】:How can I substitute a cell reference for the formula the referred cell contains如何用单元格引用替换引用单元格包含的公式
【发布时间】:2020-04-24 13:25:26
【问题描述】:

如何用单元格引用替换它包含的公式,换句话说,“扩展”或“派生”单元格引用?

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

A2:1(句点数)
B2:5000(金额)
C2:0,8(减速器)
G1:6%(贴现率)

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

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

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

但是,如果我愿意,为了调试,或者为了构建一个包含更多嵌套计算的更复杂的公式,请在单元格上写入:

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

这样我就可以检查计算的每个部分是否正常,并且最终公式是否“组装”得很好(或者轻松纠正可能出现的错误或更改它以计算其他值,例如未来值,我为此将删除 G2 上的减号)。

在完成这些步骤后,在单元格 D2 上使用一些功能/快捷方式/功能将替换

"=E2*F2^G2"

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

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

我能找到的最接近这种行为的是 formulatext() 函数,但它只适用于单个引用,并且总是包含“=”,如果我这样做,例如

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

结果

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

这不是我们想要的结果。

我期望找到的结果类似于选择公式的一部分并按 F9 并将其替换为值,但应用于函数或中间步骤。

【问题讨论】:

  • Excel 没有执行此操作的内置功能。这在理论上用 VBA 是可行的,但不是一项简单的任务。
  • 不是 formulatext() 已经给了你 90% 的答案吗?你只需要摆脱所有的=。替代功能,也许?或者你想让它自动把整个公式切成小块,然后写出来?您也可以使用“评估公式”来分析公式。

标签: excel vba excel-formula shortcut substitution


【解决方案1】:

由于 Excel 上似乎确实不存在内置函数,因此我根据Parsing and extracting cell references from Excel formulas? 上的答案提出了一个执行此操作的脚本

适用于 Excel 365(也适用于其他版本),仅替换活动单元格上的引用,不适用于包含间隔的单元格(例如,它将在包含 =sum(A1:A5) 的单元格上失败) ) 并且前面的单元格的内容最终将被括在括号中。它也不会替换“锁定”单元格(=$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

感谢所有回复的人,我想我仍然没有足够的权限来支持评论,只要我这样做,我就会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多