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 评估另一张工作表中的公式的主要内容,如果未能解决你的问题,请参考以下文章