2016-08-15 6 views
0

У меня есть 2 листа в моем excel, первый лист позволяет мне выбрать метод вычисления из выпадающего списка и ввести переменную для вычисления (показано в зеленой ячейке, столбец синих показывает некоторое постоянное число). Запись результата будет искать соответствующую формулу расчета из моего второго листа (базы данных), а затем вставить формулу в лист 1, мне нужна формула для вычисления с использованием ячеек в листе 1 вместо ячеек в моей базе данных.Формула возврата excel с относительной ячейкой

enter image description here enter image description here

В настоящее время я создал функцию, определенную пользователем под названием Eval, как показано ниже:

Function Eval(ref As String) 
    Eval = Application.Evaluate(ref) 
End Function 

путем объединения Eval с ВПР :=Eval(VLOOKUP(A3,Database!A2:E10,5,FALSE)) я получить результат, что уравнение расчета использует клетки от моя база данных, как я могу достичь результата, который формула принимает ячейки в листе 1 во время вычисления?

ответ

2

Один простой способ будет использовать все формулы в одном CHOOSE как это:

=IFERROR(CHOOSE(SUMPRODUCT(MATCH(A2,"Calculation "&ROW($1:$9),0)),B2*C2*D2,B2*C2-D2,B2+C2-D2,B2^2-C2+D2,B2*D2-C2^2,B2+C2*D2,B2*C2-C2*D2,B2-D2-C2*D2,C2-D2*B2),"") 

Еще бы использовать Application.Caller как:

Public Function eval(ref As String) 
    eval = Application.Caller.Parent.Evaluate(ref) 
End Function 

Это обеспечивает использование родителя вызывающего абонента (лист с формулой eval()), который будет использоваться в качестве основного-ref.

EDIT
Имейте в виду, что ваши «строки» являются статическими в формулах. Переход на «Расчет 4» будет использовать строку 5 (а не строку вашей формулы из первого листа). Для этого вы можете использовать что-то вроде:

=Eval(SUBSTITUTE(VLOOKUP(A3,Database!A2:E10,5,FALSE),"##",ROW())) 

Хотя все строки-номера должны быть изменены на ## (или любой другой уникальный идентификатор, который Вы хотите). Тогда «Расчет 1» будет выглядеть следующим образом: =B##*C##*D##

Если у вас есть какие-либо вопросы, просто спросите :)

+0

Hi Дирка, большое спасибо, вопрос, который я отправил это только упрощенная версия. У меня может быть более 50 уравнений, поэтому в таком случае формула выбора будет такой длинной. Однако во втором случае, по какой-то причине, если я скопирую ваш UDF непосредственно в свой модуль, он будет работать так же, как моя предыдущая функция Eval. Можете ли вы предоставить мне дополнительную помощь по этому UDF? –

+0

@ LiuRoye Функция 'Evaluate' выполняется из листа, а не из приложения. Если используется как «Листы» («Лист1»). Оцените (...) ', тогда он всегда будет использовать« Лист1 ». Если он используется непосредственно как «Application.Evaluate (...)», тогда он будет использовать «ActiveSheet». Если используется несколько листов, «Application.Evaluate (...)» может сильно потерпеть неудачу. Сделайте в Sheet2 A1 'A2' и в A2 2. В Sheet1 A2 поставьте' 1'. Теперь, используя 'Sheet2! A1' в Sheet1, он покажет' 1'. Но если вы перейдете на страницу2 и снова введите 'A1', а затем вернитесь к sheet1, ваша формула покажет' 2' (мой код должен показать 1) –

+0

@ LiuRoye лучший способ избежать всех этих проблем, использует полные ссылки, такие как 'Sheet1! B2 * Sheet1! C2 * Sheet1! D2'. Таким образом, он должен делать то, что вы хотите, независимо от того, что;) –