Excel VBA从另一个工作表评估公式

解决:问题是在我的公式中,我使用INDIRECT()引用一个单元格,当sheet不同时它不工作。 见答案。

我在一张纸上有一个公式,我想要做的是使用另一张纸上的公式,使用eval来评估公式。 但是,结果并不是如此。 这似乎是公式使用表A中的值而不是调用者表B.

表A中的公式(请参阅: 屏幕截图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中的用法(请参阅: 屏幕截图表B )

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

VBA:

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

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

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

在我看来,它在任何表单处于活动状态时都会引用值。

在您的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 

我想你正在寻找Application.Caller:

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

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

这工作:

 INDEX(D:D,ROW()) 

这不:

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