Функция Excel, которая оценивает строку, как если бы она была формулой?

26

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

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

drapkin11
источник
3
В Excel была функция EVALUATE (), которая делает именно это. Это было давным-давно, и я не слишком уверен в новом Excel. Будет ковыряться и посмотреть, смогу ли я найти что-нибудь эквивалентное.
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, и он отлично работает для меня. спасибо
Маках
17
=evaluate(put_reference[s]_here)

Это полуфункция - ее можно использовать только в Name Manager.

Вот как вы можете использовать это:

  • Наведите указатель мыши на ячейку и откройте Диспетчер имен (на вкладке ФОРМУЛА или нажав CTRL + F3)

    Оценить пример

  • Напишите =evaluate(и нажмите на ячейку, которую вы хотите (лучше всего сохранить относительную ссылку).

  • Завершите формулу с )
  • Дайте ему ИМЯ - (в этом примере я просто назову это eva).
  • Нажмите ОК .

Теперь предположим, что вы выбрали B1 и сделали все это, ссылаясь на A1. В A1 вы можете поставить « 1 + 1 », а в B1 вы пишете =eva- как только вы нажмете ENTER, значение B1 будет 2. Поскольку ссылка в Name Manager была относительной, вы можете использовать =evaдля оценки любой ячейки одну оставшуюся ячейку от того места, где вы ее хотите. (например, в B2, =evaвернет результат ячейки A2)

Лаурентиу Мирица
источник
1
Очень хорошо - и приятно знать. Это даже работает для столбца таблицы: = EVALUATE (Tablename [@ [column]]) То, что вы не можете легко найти в большинстве справочных или расширенных учебных пособий по Excel
Paschi
1
... и как обычно с формулами Excel, если вы используете локализованную сборку, вам нужно использовать локализованную функцию - например, в Excel 2016 DE она называется=auswerten(...)
kiwiwings
7

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

Демонстрация проблемы оценки

Это можно исправить, введя энергозависимую функцию либо в строку, либо в eval-ячейку. Это приведет к пересчету каждый раз, когда лист будет пересчитан. Например, ячейка C1 может быть заменена на =if(today(),"A1+B1",). Или D1 можно заменить на =if(today(),eval,). Любая изменчивая функция должна делать.

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

jlear
источник
Спасибо, я долго искал подобный трюк и продолжал :)
Бен Персоник
4
=indirect()

если вы используете это в ячейке (наряду с сцеплением), это может быть очень полезно.

Например, эта формула отобразит значение ячейки B5 на другом листе (имя которого хранится в ячейке A2 на этом листе):

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

Для работы INDIRECT внешний лист должен быть открыт.

user206351
источник
Не работает, возвращает #REF
SIslam
10
INDIRECT может выполнять математические функции и функции, но только как часть создания ссылки на ячейку. Его нельзя использовать в общем смысле, заданном в вопросе.
fixer1234