如何用单元格引用替换引用单元格包含的公式
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
谢谢大家的回复,我想我仍然没有足够的权限来点赞评论,一旦我点赞了,我会的。
如何用单元格引用替换它包含的公式,换句话说,"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
谢谢大家的回复,我想我仍然没有足够的权限来点赞评论,一旦我点赞了,我会的。