2016-08-15 96 views
0

我在我的Excel中有2个工作表,第一个表格允许我从下拉列表中选择一个计算方法并输入变量进行计算(以绿色单元格显示,蓝色列显示一些常数)。结果条目将从我的第二个工作表(数据库)中搜索相应的计算公式,然后将公式粘贴到工作表1中,我需要公式来使用工作表1中的单元格而不是数据库中的单元格进行计算。通过评估和演示用VLOOKUP :=Eval(VLOOKUP(A3,Database!A2:E10,5,FALSE))组合我将得到的结果的计算式采用细胞从excel返回公式与相对单元格

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

enter image description here enter image description here

目前我创建称为评估和演示的用户定义的函数,如下我的数据库,如何在计算过程中如何实现公式在表单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()的表格)作为主参考。

编辑
请记住,你的“行”是在公式静态的。去“计算4”将使用第5行(而不是第一张表格中的公式行)。虽然所有的行号应改为##(或任何唯一的标识符你喜欢)

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

:为此,您可以使用类似。那么,“运算1”看起来像:=B##*C##*D##

如果您还有任何问题,只是问:)

+0

嗨德克,非常感谢你,我张贴的问题只是一个简化版本。在这种情况下,我可能会考虑超过50个方程式,因此选择公式会很长。但在第二种情况下,由于某种原因,如果我将UDF直接复制到模块中,它将与我以前的Eval函数一样。你能否为我提供一些有关该UDF的额外帮助? –

+0

@LiuRoye'Evaluate'函数是从表单执行的,而不是从应用程序执行的。如果像'Sheets(“Sheet1”)。评估(...)'那么它总是使用“Sheet1”。如果直接用作'Application.Evaluate(...)',那么它将使用'ActiveSheet'。如果使用几张纸,Application.Evaluate(...)'可能会失败。在Sheet2 A1'A2'和A2中进行。在Sheet1中,A2放入'1'。现在在Sheet1中使用'Sheet2!A1',它将显示'1'。但是如果你转到sheet2并重新进入'A1'然后回到sheet1,那么你的公式将会显示'2'(我的代码应该仍然显示1) –

+0

@LiuRoye避免所有问题的最好方法是使用像“Sheet1!B2 * Sheet1!C2 * Sheet1!D2”这样的全参考。这样它就应该按照你想要的方式做,不管是什么;) –