【问题标题】:excel return formula with relative cell具有相对单元格的excel返回公式
【发布时间】:2016-08-15 03:56:10
【问题描述】:

我的 excel 中有 2 个工作表,第一个工作表允许我从下拉列表中选择一种计算方法并输入计算变量(显示在绿色单元格中,蓝色列显示一些常数)。结果条目将从我的第二个工作表(数据库)中搜索相应的计算公式,然后将公式粘贴到工作表 1,我需要使用工作表 1 中的单元格而不是数据库中的单元格来计算公式。

目前我创建了一个名为 Eval 的用户定义函数,如下所示:

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

通过将 Eval 与 vlookup :=Eval(VLOOKUP(A3,Database!A2:E10,5,FALSE)) 相结合,我将得到计算公式使用我数据库中的单元格的结果,我怎样才能获得公式在计算过程中使用表 1 中的单元格的结果?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    一种简单的方法是使用一个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##

    如果你还有任何问题,尽管问:)

    【讨论】:

    • 您好 Dirk,非常感谢您,我发布的问题只是一个简化版本。我可能有超过 50 个方程要考虑,所以在这种情况下,选择公式会很长。但是,在您的第二种情况下,由于某种原因,如果我将您的 UDF 直接复制到我的模块中,它将与我之前的 Eval 函数一样工作。您能否就该 UDF 提供一些额外的帮助?
    • @LiuRoye Evaluate 函数是从工作表而不是应用程序执行的。如果像Sheets("Sheet1").Evaluate(...) 一样使用,那么它将始终使用“Sheet1”。如果直接用作Application.Evaluate(...),那么它将使用ActiveSheet。如果跨多张使用,Application.Evaluate(...) 可能会非常失败。在 Sheet2 A1 A2 和 A2 2 中执行。在 Sheet1 A2 中输入 1。现在在 Sheet1 中使用Sheet2!A1,它将显示1。但是如果您转到 sheet2 并重新输入 A1 然后返回到 sheet1,您的公式将显示 2(我的代码仍应显示 1)
    • @LiuRoye 避免所有这些问题的最佳方法是使用像Sheet1!B2*Sheet1!C2*Sheet1!D2 这样的完整引用。这样它就应该按照你想要的方式去做,无论如何;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多