Как превратить строковую формулу в "настоящую" формулу
Я имею 0,4*A1
в ячейке (в виде строки). Как можно преобразовать эту "формулу строки" в реальную формулу и вычислить ее значение в другой ячейке?
9 ответов
Evaluate
может подойти:
http://www.mrexcel.com/forum/showthread.php?t=62067
Function Eval(Ref As String)
Application.Volatile
Eval = Evaluate(Ref)
End Function
Я конкатенировал свою формулу как обычно, но в начале у меня было '=
вместо =
,
Затем я копирую и вставляю текст как туда, где он мне нужен. Затем я выделяю раздел, сохраненный как текст, и нажимаю Ctrl + H, чтобы найти и заменить.
Я заменяю '=
с =
и все мои функции активны.
Это несколько этапов, но он избегает VBA.
Надеюсь, это поможет,
обкрадывать
ОБНОВЛЕНИЕ Это раньше работало (в 2007 году, я считаю), но не в Excel 2013.
EXCEL 2013:
Это не совсем то же самое, но если возможно поместить 0,4 в одну ячейку (скажем, B1), а текстовое значение A1 в другую ячейку (скажем, C1), в ячейку D1, вы можете использовать =B1*INDIRECT(C1), в результате чего вычисляется значение 0,4 * A1.
Итак, если A1 = 10, вы получите 0.4*10 = 4
в клетке D1. Я обновлюсь снова, если смогу найти лучшее решение 2013 года, и извините, что Microsoft уничтожила оригинальную функциональность INDIRECT!
Версия EXCEL 2007:
Для решения не VBA используйте INDIRECT
формула. Он принимает строку в качестве аргумента и преобразует ее в ссылку на ячейку.
Например, =0.4*INDIRECT("A1")
вернет значение 0,4 * значение, которое находится в ячейке A1 этой таблицы.
Если ячейка A1 была, скажем, 10, то =0.4*INDIRECT("A1")
вернется 4.
Просто для забавы я нашел интересную статью здесь, чтобы использовать как-то скрытую функцию оценки, которая существует в Excel. Хитрость заключается в том, чтобы назначить его имени и использовать имя в ваших ячейках, потому что EVALUATE() выдаст сообщение об ошибке, если использовать его непосредственно в ячейке. Я пытался, и это работает! Вы можете использовать его с относительным именем, если вы хотите скопировать поперек строк, если лист.
Я предпочитаю VBA-решение для профессиональных решений.
С частью процедуры замены в поиске вопроса и замены ТОЛЬКО СЛОВ Я использую следующую процедуру VBA:
''
' Evaluate Formula-Text in Excel
'
Function wm_Eval(myFormula As String, ParamArray variablesAndValues() As Variant) As Variant
Dim i As Long
'
' replace strings by values
'
For i = LBound(variablesAndValues) To UBound(variablesAndValues) Step 2
myFormula = RegExpReplaceWord(myFormula, variablesAndValues(i), variablesAndValues(i + 1))
Next
'
' internationalisation
'
myFormula = Replace(myFormula, Application.ThousandsSeparator, "")
myFormula = Replace(myFormula, Application.DecimalSeparator, ".")
myFormula = Replace(myFormula, Application.International(xlListSeparator), ",")
'
' return value
'
wm_Eval = Application.Evaluate(myFormula)
End Function
''
' Replace Whole Word
'
' Purpose : replace [strFind] with [strReplace] in [strSource]
' Comment : [strFind] can be plain text or a regexp pattern;
' all occurences of [strFind] are replaced
Public Function RegExpReplaceWord(ByVal strSource As String, _
ByVal strFind As String, _
ByVal strReplace As String) As String
' early binding requires reference to Microsoft VBScript
' Regular Expressions:
' with late binding, no reference needed:
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Global = True
're.IgnoreCase = True ' <-- case insensitve
re.Pattern = "\b" & strFind & "\b"
RegExpReplaceWord = re.Replace(strSource, strReplace)
Set re = Nothing
End Function
Использование процедуры в листе Excel выглядит следующим образом:
На мой взгляд, лучшие решения находятся по этой ссылке: http://www.myonlinetraininghub.com/excel-factor-12-secret-evaluate-function
Вот сводка: 1) В ячейку A1 введите 1, 2) В ячейку A2 введите 2, 3) В ячейку A3 введите +, 4) Создайте именованный диапазон, с "=Evaluate(A1 & A3 & A2)" в ссылается на поле при создании именованного диапазона. Давайте назовем этот именованный диапазон "testEval", 5) В ячейку A4 введите =testEval,
Ячейка A4 должна иметь значение 3.
Примечания: а) Не требует программирования / VBA. б) Я сделал это в Excel 2013, и это работает.
Скажем, пусть у нас есть столбец E
заполняется формулами, которые возвращают строку, например:
= " = " & D7
где D7
Ячейка состоит из более сложной формулы, которая составляет окончательный желаемый результат, например:
= 3.02 * 1024 * 1024 * 1024
И так во всех огромных количествах строк.
Когда строк мало - достаточно скопировать нужные ячейки как значения (ПКМ)
в ближайший столбец, скажемG
, и нажмите F2 с последующим Enter в каждой из строк.
Однако при огромном количестве строк это невозможно...
Итак, нет VBA. Никаких лишних формул. Нет F&R
Без ошибок, без опечаток, а только глупые механические действия,
Как на конвейере Форда. И всего за несколько секунд:
- [Предположим, что все задействованные столбцы имеют "Общий" формат.]
- Откройте Блокнот ++
- Выбрать весь столбец
D
- Ctrl+C
- Ctrl+V на АЭС
- Ctrl+A на АЭС
- Выберите ячейку в первой строке нужного столбца
G1
- Ctrl+V
- Наслаждаться:) .
Excel 2019 здесь.
EVALUATE
недействителен.
Это сработало бы, если бы мы создали из него именованный диапазон:
Но в этом случае мы предоставляем абсолютную ссылку, что не очень хорошо:
- Нам придется изменять формулу каждый раз, когда мы захотим ее повторно использовать.
- При изменении значения в A1 результат оценки не изменится.
Решение:
=EVALUATE(GET.CELL(5,OFFSET(INDIRECT("RC",FALSE),0,-1)))
Лучший, не VBA, способ сделать это - использовать формулу TEXT. Он принимает строку в качестве аргумента и преобразует ее в значение.
Например, =TEXT ("0,4*A1", "##") вернет значение 0,4 * значение, которое находится в ячейке A1 этой таблицы.