У мене 0,4*A1
в комірці (як рядок). Як можна перетворити цю "рядкову формулу" в реальну формулу і обчислити її значення в іншій комірці?
У мене 0,4*A1
в комірці (як рядок). Як можна перетворити цю "рядкову формулу" в реальну формулу і обчислити її значення в іншій комірці?
Відповіді:
Evaluate
може підійти:
http://www.mrexcel.com/forum/showthread.php?t=62067
Function Eval(Ref As String)
Application.Volatile
Eval = Evaluate(Ref)
End Function
Evaluate()
за замовчуванням буде працювати в контексті активного аркуша, тому вивід чогось типу Eval("0.4*A1")
буде змінюватися залежно від того, який аркуш активний. Ви можете використовувати (наприклад) Application.ThisCell.Parent.Evaluate(Ref)
для обмеження контексту аркуш, що містить викликEval
#VALUE!
давати збій, я думаю, що рядок повинен мати строго менше 256 символів (Excel 2010)
Я поєднав свою формулу як звичайну, але на початку я мав '=
замість цього =
.
Потім копіюю та вставляю як текст туди, де мені це потрібно. Потім я виділяю розділ, збережений як текст, і натискаю ctrl+, Hщоб знайти та замінити.
Я замінюю '=
на, =
і всі мої функції активні.
Це кілька етапів, але це дозволяє уникнути VBA.
Сподіваюся, це допоможе,
Роб
=
собою
Find/Replace
функції. Відключення =
з /=
@=
або що ви хочете , щоб тимчасово відключити формули і дозволяють формулу , щоб показати , як текст. Потім знайдіть / замініть те, що ви дійсно хочете змінити. Остаточне знаходження / заміна змінить /=
@=
і т. Д. Знову на just, =
і це буде знову самообчислювальна формула. Немає змін форматування.
Для розваги я знайшов тут цікаву статтю про використання якось прихованої функції оцінки, яка існує в Excel. Фокус у тому, щоб призначити його імені та використовувати ім’я у клітинках, оскільки EVALUATE () дасть вам повідомлення про помилку, якщо використовується безпосередньо в комірці. Я спробував і це працює! Ви можете використовувати його з відносною назвою, якщо ви хочете скопіювати через рядки, якщо аркуш.
Name
трюк, описаний у посиланні.
ОНОВЛЕННЯ Це раніше працювало (я вважаю, у 2007 році), але в Excel 2013 не працює.
Це не зовсім те саме, але якщо можливо помістити 0,4 в одну комірку (B1, скажімо), а текстове значення A1 в іншу комірку (C1, скажімо), у комірку D1, ви можете використовувати = B1 * INDIRECT ( C1), в результаті чого обчислюється значення 0,4 * A1.
Отже, якщо A1 = 10, ви потрапите 0.4*10 = 4
в клітинку D1. Я знову оновлюся, якщо зможу знайти краще рішення 2013 року, і шкода, що Microsoft знищила оригінальну функціональність INDIRECT!
Для рішення, яке не стосується VBA, використовуйте INDIRECT
формулу. Він приймає рядок як аргумент і перетворює його на посилання на клітинку.
Наприклад, =0.4*INDIRECT("A1")
поверне значення 0,4 * значення, яке знаходиться в комірці А1 цього аркуша.
Якби осередок А1 був, скажімо, 10, тоді =0.4*INDIRECT("A1")
повертався б 4.
indirect
функцію, це ніколи не спрацює. Я бачу, як ви можете зробити щось на зразок =INDIRECT("A"&(0.4*5))
математики, щоб розрахувати посилання на клітинку, але я впевнений, що непрямий не обчислює нічого, крім посилання.
=0.4*INDIRECT(A1)
Я віддаю перевагу 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) У комірку А1 введіть 1, 2) У клітинку А2 введіть 2, 3) У комірку А3 введіть +, 4) Створіть іменований діапазон, у полі "= Оцінити (А1 & А3 & А2)" у полі посилається на поле під час створення іменованого діапазону. Давайте назвемо цей іменований діапазон "testEval", 5) У комірку A4 введіть = testEval,
У комірці A4 має бути значення 3.
Примітки: а) Не вимагає програмування / vba. б) Я зробив це в Excel 2013, і це працює.
Скажімо, давайте матимемо стовпець, E
заповнений формулами, які повертають рядок, наприклад:
= " = " & D7
де D7
комірка складається з більш складної формули, яка складає кінцевий бажаний результат, скажімо:
= 3.02 * 1024 * 1024 * 1024
І так у всіх величезних кількох рядках, які є.
Коли рядків мало - досить просто скопіювати потрібні комірки як значення (за юанями)
у найближчий стовпець, скажімо G
, і натиснути F2 з наступним Enter у кожному з рядків.
Однак у випадку величезної кількості рядків це неможливо ...
Отже, немає VBA. Немає зайвих формул. Ні F&R
Ні помилок, ні друкарської помилки, але натомість лише дурних механічних дій,
Як на конвеєрі Форда. І лише за кілька секунд :
D
G1
Найкращий, не VBA спосіб зробити це - використовувати формулу TEXT. Він приймає рядок як аргумент і перетворює його у значення.
Наприклад, = TEXT ("0,4 * A1", '##') поверне значення 0,4 * значення, яке знаходиться в комірці A1 цього аркуша.