Как заменить ссылку на ячейку формулой, которую содержит указанная ячейка? - PullRequest
0 голосов
/ 24 апреля 2020

Как я могу заменить ссылку на ячейку на формулу, которую она содержит, другими словами, "развернуть" или "получить" ссылки на ячейки?

Пример, и я знаю, что могу вычислить его с помощью 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

, что не является желаемым результатом .

То, что я ожидал найти, было что-то вроде, когда кто-то выбирает rt формулы и нажимает F9, и она подставляет его для значения, но применяется для функций или промежуточных шагов.

1 Ответ

0 голосов
/ 27 апреля 2020

Поскольку в Excel не существует встроенной функции, я разработал сценарий для этого, основанный на ответе Разбор и извлечение ссылок на ячейки из формул Excel?

Работает в 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

Спасибо за все, кто ответил, я думаю, у меня все еще нет достаточных привилегий, чтобы поднять комментарий, как только я это сделаю, я сделаю это.

...