首页 文章

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

提问于
浏览
0

Solved: The problem is in my formula where I'm referencing a cell using INDIRECT() which doesn't work when sheet is different. See answer.

我在一张表中有一个公式,我想要做的是使用另一张表中的公式,使用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

4 回答

  • 2

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

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

    在我看来,它引用任何活动表中的值 .

    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
    
  • 0

    我想你正在寻找Application.Caller:

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

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

    这有效:

    INDEX(D:D,ROW())
    

    这不是:

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

相关问题