【问题标题】:Excel VBA evaluate formula from another sheetExcel VBA 评估另一张工作表中的公式
【发布时间】:2016-08-17 23:14:52
【问题描述】:

已解决:问题出在我的公式中,我使用 INDIRECT() 引用单元格,当工作表不同时,该单元格不起作用。查看答案。

我在一张表中有一个公式,我想做的是使用另一张表中的公式,使用 eval 来评估公式。然而,结果并不如预期。似乎公式使用的是工作表 A 上的值,而不是调用者工作表 B。

表格 A 中的公式(参见:Screenshot Sheet A

=IF(ISERROR(INDEX('1516Activity'!$B:$B,MATCH(INDIRECT(ADDRESS(ROW(),COLUMN(D:D) )),'1516Activity'!$C:$C,0))),"-",IF(LEFT(INDEX('1516Activity'!$F:$F,MATCH(INDIRECT(ADDRESS(ROW(),COLUMN(D:D) )),'1516Activity'!$C:$C,0)))="0","N","Y"))

在工作表 B 中的用法(请参阅:Screenshot Sheet B

=Eval('CODE-VARS'!$G$5)

VBA:

Function Eval(Ref As String)
    Application.Volatile
    Eval = Application.ThisCell.Parent.Evaluate(Ref)
End Function

【问题讨论】:

    标签: excel vba eval


    【解决方案1】:

    在我看来,它引用了任何处于活动状态的工作表中的值。

    在您的 Eval 函数中,确保目标工作表处于活动状态:

    Function Eval(Ref As String)
        Dim shCurrent As Worksheet: Set shCurrent = ActiveSheet
        Application.Volatile
        Application.ThisCell.Parent.Activate
        Eval = Application.ThisCell.Parent.Evaluate(Ref)
        shCurrent.Activate
    End Function
    

    【讨论】:

    • 你不能在 UDF 中使用激活
    • 正确。我在想Sub
    • @CharlesWilliams @yk11 使用我所说的函数,我添加了这个:MsgBox ActiveSheet.Name,它显示了调用者表名称。所以我认为不是这个问题。可能是我的公式中引用了引用表中的值而不是调用者/活动表中的值吗? INDIRECT(ADDRESS(ROW(),COLUMN(D:D) ))
    • INDIRECT 可能是 Excel 最邪恶的功能,不应该使用。我不清楚你想要实现什么,但看起来你应该能够用一个简单的单元格引用来替换它。您希望您的 UDF 引用哪一行?
    • @CharlesWilliams 该行取决于我使用公式的单元格,该列始终为“D”。这就是为什么我提到INDIRECT(ADDRESS(ROW(),COLUMN(D:D) ))
    【解决方案2】:

    我认为您正在寻找 Application.Caller:

    Function Eval(Ref As String)
        Application.Volatile
        Eval = Application.Caller.Parent.Evaluate(Ref)
    End Function
    

    【讨论】:

      【解决方案3】:

      您正在评估字符串'CODE-VARS'!$G$5,它将返回该单元格中的值而不是其公式。试试这个:

      Function Eval(Ref As RAnge)
          Application.Volatile
          Eval = Application.ThisCell.Parent.Evaluate(Ref.formula)
      End Function
      

      【讨论】:

      • 试过了还是一样
      • 可能是我的公式中引用了引用表而不是调用者/活动表中的值吗? INDIRECT(ADDRESS(ROW(),COLUMN(D:D) ))
      • D 列中有哪些值? Indirect(Address()) 期望单元格引用位于 D 列中。因此,请展示一些 D 列中的示例。@ZhuHang
      • 看不到你的数据,我认为你想要的不是INDIRECT(ADDRESS(ROW(),COLUMN(D:D) )),而是INDEX(D:D,ROW)
      • 两张表格的屏幕截图已添加到我的问题中。
      【解决方案4】:

      问题是我正在使用 INDIRECT() 引用一个单元格,当从不同的工作表调用 eval() 时它不起作用。

      这行得通:

      INDEX(D:D,ROW())
      

      这不是:

      INDIRECT(ADDRESS(ROW(),COLUMN(D:D) ))
      

      【讨论】:

        猜你喜欢
        • 2016-10-18
        • 1970-01-01
        • 1970-01-01
        • 2021-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多