Я хочу знать, как скопировать формулу в другую, сохраняя при этом исходные значения. Например, у меня в диапазоне A1:A5 пять значений (смесь констант и / или формул), и мне нужно (в том же диапазоне - не в новом столбце) включить функцию =Round("original value or formula",2) , (или любая другая формула; это всего лишь пример)

Например:

  • A1 оригинальное значение 50.64635
  • Исходная формула A2 =3*F1 (которая может отображаться как 54.25875 если F1 содержит 18.08625)
  • Исходная формула A3 =SQRT(2) (которая будет отображаться как 1.4142136)

Я хочу получить результат:

  • A1 новый контент (формула)=round(50.64635,2)
  • A2 новый контент (формула)=round(3*F1,2)
  • A3 новое содержание (формула)=round(SQRT(2),2)

и т. д. Обратите внимание, что я не хочу, чтобы A1 был изменен на 50.65 , и я не хочу, чтобы A2 был изменен на 54.26 или даже =ROUND(54.25875,2) и т. д. Я знаю, как делать аналогичные вещи с помощью простых операций (copy/paste special – Formula – add, substract, multiply, divide) и сохранить исходные значения или формулы. Но я не знаю, как обернуть функцию вокруг существующего значения или построить формулу иным образом, используя существующую формулу в качестве компонента.

Другая идея состояла бы в том, чтобы проиграть преобразование моих исходных значений / формул в текст, использовать функцию поиска / замены, конкатенацию или какой-то странный микс, и я хотел бы получить желаемый результат, но я хотел бы знать, есть ли какой-то более короткий путь;)

1 ответ1

0

Функция Excel "Найти и заменить" не кажется достаточно мощной, чтобы делать то, что вы хотите.  Тем не менее, это довольно легко в VBA.


Сначала сделайте копию вашего файла, на случай, если что-то пойдет не так.

Затем создайте следующую подпрограмму VBA:

Sub Arom79Sub()

    On Error Resume Next
    For Each c In Range("A1:A5")
        If c.HasFormula And Left(c.Formula, 1) = "=" Then
            temp = Right(c.Formula, Len(c.Formula) - 1)
        Else
            temp = c.Value
        End If
        If temp <> "" Then
            c.Formula = "=ROUND(" & temp & ", 2)"
        End If
    Next c
    On Error GoTo 0

End Sub

См. Как добавить VBA в MS Office? для получения общей информации о том, как использовать VBA в Excel и других приложениях Microsoft Office.  Arom79Sub - это просто произвольное имя подпрограммы; используйте любое имя, которое вы хотите.

  • On Error Resume Next говорит, что если произошла ошибка, просто перейдите к следующему оператору и продолжайте работу.  (Например, если ячейка содержит постоянное значение, которое не является числом (т. Е. Является строковым / текстовым значением), приведенный выше код вызовет ошибку.)
  • For Each c ... Next c - это цикл, который просматривает каждую ячейку в диапазоне A1:A5 , устанавливая c для ссылки на каждую ячейку в последовательности.
  • c.HasFormula - это логическое значение, которое сообщает, содержит ли ячейка c формулу.  Затем мы также проверяем, является ли первый символ "формулы" = . Это, вероятно, излишне.  Если это определенно формула, установите temp в фактическую формулу; то есть, все справа от = (например, 3*F1 , в вашем примере для A2).
  • В противном случае, установите temp в значение в ячейке (например, 50.64635 , в вашем примере для A1).
  • Если значение (или формула) не является пустым, установите формулу ячейки в
            =ROUND(previous_contents, 2) .
  • Сделайте On Error GoTo 0 чтобы восстановить нормальную обработку ошибок.

Затем запустите подпрограмму.

Очевидно, вы можете изменить диапазон или новую формулу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .