25

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

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

4 ответа4

24

EVALUATE доступна в VBA во всех текущих версиях

Вы можете включить его в свой код VBA или обернуть в простой UDF, чтобы сделать его доступным в качестве функции рабочего листа.

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

Он в основном обрабатывает значение переданного параметра как формулу Excel, как если бы оно было введено в ячейку

"11+5" и "=11+5" приведут к одинаковому результату

14
=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)

3

Есть важное предостережение с отличным ответом @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),)

1
=indirect()

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .