Функція Excel, яка оцінює рядок як би формулою?


26

Припустимо, у мене є текстовий рядок, схожий "11+5"або навіть "=11+5"збережений у комірці. Чи є в Excel функція, яка дозволить мені фактично оцінити цей рядок як би формулою?

Це було б корисно для іншого проекту, де я хотів би мати можливість написати «динамічні» формули в Excel.


3
excel мав цю функцію EVALUATE (), яка робить саме це. Це було дуже давно, і я не надто впевнений у новій красі. Покину навколо і побачу, чи зможу я знайти щось еквівалентне.
aCuria

1
ця функція звучить звично, але я, звичайно, не можу її знайти в Excel2007, для чого я зараз користуюся.
drapkin11

Я не можу його знайти = /
aCuria

Відповіді:


26

EVALUATE доступний у VBA у всіх поточних версіях

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

Function ev(r As Range) As Variant
    ev = Evaluate(r.Value)
End Function

В основному вона розглядає значення переданого параметра як формулу Excel так само, як якщо б воно було введено в комірку

"11+5"і "=11+5"дасть такий же результат


1
Я забув все про визначені користувачем функції в Excel-спасибо.
drapkin11

Я зробив невелику модифікацію, змінивши параметр Range на String, і це добре допомагає мені. спасибі
Makah

17
=evaluate(put_reference[s]_here)

Це напівфункція - її можна використовувати лише в диспетчері імен.

Ось як це можна використовувати:

  • Наведіть курсор на клітинку і відкрийте диспетчер імен (на вкладці FORMULAS або натиснувши CTRL + F3)

    Оцініть приклад

  • Напишіть =evaluate(і натисніть на потрібну клітинку (найкраще зберігати відносну посилання).

  • Закінчіть формулу с )
  • Дайте ім’я - (у цьому прикладі я його просто назву eva).
  • Натисніть кнопку ОК .

Тепер припустимо, що ви вибрали B1 і зробили все це посиланням на A1. В A1 ви можете поставити " 1 + 1 ", а в B1 ви пишете =eva- як тільки ви натиснете ENTER, значення B1 буде 2. Оскільки посилання в диспетчері імен було відносним, ви можете використовувати =evaдля отримання оцінки будь-якої комірки, що залишилась на одній клітині, де ви хочете. (наприклад, у B2, =evaповерне результат комірки A2)


1
Дуже добре - і приємно знати. Він навіть працює для стовпця таблиці: = ОЦІНКА (Ім'я таблиці [@ [стовпець]]) Щось, що ви не можете легко знайти в самій довідці Excel або в додатковому підручнику
Paschi

1
... і як завжди у формулах excel, якщо ви використовуєте локалізовану збірку, вам потрібно використовувати локалізовану функцію - наприклад, в Excel 2016 DE це називається=auswerten(...)
kiwiwings

6

Існує важливий застереження з чудовою відповіддю від @karel та @Laurentiu Mirica: функція оцінювання не буде перераховуватись, якщо не зміниться посилальна клітина. Наприклад, клітинка C1 містить текст, "A1+B1"а D1 містить функцію =eval. Якщо значення в A1 або B1 змінюються, комірка D1 не перераховується .

Демонстрація проблеми eval

Це можна виправити, ввівши летючу функцію або в рядок, або в осередок eval. Це призведе до перерахунку кожного разу, коли робочий аркуш перераховується. Наприклад, клітинку С1 можна замінити на =if(today(),"A1+B1",). Або D1 можна було б замінити на =if(today(),eval,). Будь-яка мінлива функція повинна виконувати.

Третє і, можливо, найпростіше рішення - змінити напівфункцію в менеджері імен на =if(today(),evaluate(c1),)


Дякую, я шукав такий трюк, як цей, і якийсь час :)
Бен Персонік

4
=indirect()

якщо ви використовуєте це в клітині (поряд з конкатенатом), це може бути дуже корисно.

Наприклад, ця формула буде відображати значення комірки B5 на іншому робочому аркуші (назва якого зберігається у комірці A2 на цьому робочому аркуші):

=INDIRECT(CONCATENATE(A2,"!B5"))

Для роботи INDIRECT зовнішній робочий аркуш повинен бути відкритим.


Не працює, повертається #REF
SIslam

9
INDIRECT може виконувати математику та функції, але лише як частина створення посилання на клітинку. Його не можна використовувати в загальному розумінні, заданому в питанні.
fixer1234
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.