Як перетворити рядкову формулу на „справжню” формулу


75

У мене 0,4*A1в комірці (як рядок). Як можна перетворити цю "рядкову формулу" в реальну формулу і обчислити її значення в іншій комірці?



Не могли б ви зробити навпаки? Починаючи з Excel 2013, FORMULATEXT () показуватиме формулу, яка створила результат. З точки зору кінцевого користувача, значення в обох клітинках будуть виглядати так само, як те, про що ви, здається, просите.
cartbeforehorse

Відповіді:


55

Evaluate може підійти:

http://www.mrexcel.com/forum/showthread.php?t=62067

Function Eval(Ref As String)
    Application.Volatile
    Eval = Evaluate(Ref)
End Function

20
Будьте обережні, використовуючи такий підхід : Evaluate()за замовчуванням буде працювати в контексті активного аркуша, тому вивід чогось типу Eval("0.4*A1")буде змінюватися залежно від того, який аркуш активний. Ви можете використовувати (наприклад) Application.ThisCell.Parent.Evaluate(Ref)для обмеження контексту аркуш, що містить викликEval
Тім Вільямс

@PrzemyslawRemin так, це все одно працює принаймні до Excel 2016
phuclv

Це працює для мене, але коли рядок для оцінки був занадто довгим, він почав #VALUE!давати збій, я думаю, що рядок повинен мати строго менше 256 символів (Excel 2010)
Алехандро

45

Я поєднав свою формулу як звичайну, але на початку я мав '=замість цього =.

Потім копіюю та вставляю як текст туди, де мені це потрібно. Потім я виділяю розділ, збережений як текст, і натискаю ctrl+, Hщоб знайти та замінити.
Я замінюю '=на, =і всі мої функції активні.

Це кілька етапів, але це дозволяє уникнути VBA.

Сподіваюся, це допоможе,

Роб


4
Це переможець! Я використовував @, тому що 'був персонажем у моїх формулах
Xcheque

9
Вам не потрібен апостроф: досить замінити =собою
Роман Гудков,

1
Блискуче просто! Я виявив, що просто пошук і заміна знака = працювало для мене, оскільки у мене не було символу 'на початку.
stuartm

Ви також можете використовувати цей метод, якщо ви хочете повторювати подібні редагування в декількох клітинках за допомогою Find/Replaceфункції. Відключення =з /= @=або що ви хочете , щоб тимчасово відключити формули і дозволяють формулу , щоб показати , як текст. Потім знайдіть / замініть те, що ви дійсно хочете змінити. Остаточне знаходження / заміна змінить /= @=і т. Д. Знову на just, =і це буде знову самообчислювальна формула. Немає змін форматування.
Джон Гра

Це абсолютно ГЕНІЙ і щойно заощадив мені години та години!
PeterH

12

Для розваги я знайшов тут цікаву статтю про використання якось прихованої функції оцінки, яка існує в Excel. Фокус у тому, щоб призначити його імені та використовувати ім’я у клітинках, оскільки EVALUATE () дасть вам повідомлення про помилку, якщо використовується безпосередньо в комірці. Я спробував і це працює! Ви можете використовувати його з відносною назвою, якщо ви хочете скопіювати через рядки, якщо аркуш.


Цікаво, але, здається, не стосується нових версій Excel. Якщо я правильно прочитав, це був фокус, щоб отримати доступ до придушеної поведінки Excel 1990 року до Excel 2000 на початку 2000 року, але застарілий у 2010, 2013, Office 365 тощо?
Крейг Селесте,

2
Ніщо не є "застарілим", якщо це працює! 4.0 Мова макросу пропонує кілька акуратних прийомів.
johny чому

1
На жаль, у програмі Excel 2013 немає функції = EVALUATE ().
wardw123

Це все ще працює в Excel для Mac 2011 - див. [Це] ( superuser.com/questions/253353/… )
Paschi

Він все ще працює з Excel 2013. Я щойно перевірив його, але вам потрібно пройти Nameтрюк, описаний у посиланні.
Патрік Онорез

12

ОНОВЛЕННЯ Це раніше працювало (я вважаю, у 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 * значення, яке знаходиться в комірці А1 цього аркуша.

Якби осередок А1 був, скажімо, 10, тоді =0.4*INDIRECT("A1")повертався б 4.


для отримання додаткової інформації та корисних прикладів див. - contextures.com/xlFunctions05.html та cpearson.com/excel/indirect.htm
Франк

10
Мене заінтригувало 16 голосів за - з того, що я розумію про indirectфункцію, це ніколи не спрацює. Я бачу, як ви можете зробити щось на зразок =INDIRECT("A"&(0.4*5))математики, щоб розрахувати посилання на клітинку, але я впевнений, що непрямий не обчислює нічого, крім посилання.
stripybadger

3
Цей підхід не працює - як ми можемо виправити цю відповідь?
Тім Вільямс

3
Причина, по якій це не працює, полягає в тому, що формула використовується неправильно. Правильна формула=0.4*INDIRECT(A1)
LPChip

@ Brunox13 - скасував затверджену редакцію. Дійсно, цю відповідь слід просто видалити. Існує причина, що у нього 26 голосів проти написання цього коментаря.
BigBen

4

Я віддаю перевагу 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 виглядає так:

використання в Excel-аркуші


3

На мій погляд, найкращі рішення - за цим посиланням: 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, і це працює.


Наведений приклад не спрацював, але приклад за посиланням справді спрацював. Це відповідало законопроекту. Дякую.
JayJay123

Ідеальне рішення для користувача excel
Suhail Abdul Rehman Chougule

0

Скажімо, давайте матимемо стовпець, Eзаповнений формулами, які повертають рядок, наприклад:

= " = " & D7

де D7комірка складається з більш складної формули, яка складає кінцевий бажаний результат, скажімо:

= 3.02 * 1024 * 1024 * 1024

І так у всіх величезних кількох рядках, які є.

Коли рядків мало - досить просто скопіювати потрібні комірки як значення (за юанями)
у найближчий стовпець, скажімо G, і натиснути F2 з наступним Enter у кожному з рядків.
Однак у випадку величезної кількості рядків це неможливо ...

Отже, немає VBA. Немає зайвих формул. Ні F&R

Ні помилок, ні друкарської помилки, але натомість лише дурних механічних дій,

Як на конвеєрі Форда. І лише за кілька секунд :

  1. [Припустимо, всі залучені стовпці мають формат "Загальний".]
  2. Відкрийте Блокнот ++
  3. Виділіть цілий стовпець D
  4. Ctrl + C
  5. Ctrl + V на АЕС
  6. Ctrl + A на АЕС
  7. Виділіть клітинку в першому рядку потрібного стовпця G1
  8. Ctrl + V
  9. Насолоджуйтесь :).

-3

Найкращий, не VBA спосіб зробити це - використовувати формулу TEXT. Він приймає рядок як аргумент і перетворює його у значення.

Наприклад, = TEXT ("0,4 * A1", '##') поверне значення 0,4 * значення, яке знаходиться в комірці A1 цього аркуша.


1
Це не працює, і формула неправильна ("потрібна замість 'навколо ##.)
wardw123
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.