Excel VBA 评估另一张工作表中的公式

Posted

技术标签:

【中文标题】Excel VBA 评估另一张工作表中的公式【英文标题】:Excel VBA evaluate formula from another sheet 【发布时间】: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

【问题讨论】:

【参考方案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) ))

【讨论】:

以上是关于Excel VBA 评估另一张工作表中的公式的主要内容,如果未能解决你的问题,请参考以下文章

计算另一张工作表中的行数并应用公式

在工作簿中查找所有匹配项并将结果偏移到另一张工作表中(VBA)

自动填充另一张工作表中的数据

Excel 根据另一张工作表中列表的内容清除单元格

将同一工作簿中的多个 Excel 工作表复合到一张工作表中

我想知道如何运行 vba 脚本来查找和替换仅在一张工作表中而不是整个工作组中的多个单词?