2016-04-24 101 views
0

解決方法:問題是在我的公式中,我使用INDIRECT()引用單元格,當sheet不同時它不工作。見答案。Excel VBA從另一個工作表評估公式

我在一張紙上有一個公式,我想要做的是使用另一張紙上的公式,使用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 

回答

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

不能使用激活UDF –

+0

正確內。我正在考慮'Sub'。 – yk11

+0

@CharlesWilliams @ yk11 使用我提到的函數,我添加了這個: 'MsgBox ActiveSheet.Name' 它顯示調用者工作表名稱。所以我認爲它不是這個問題。它可能是我的公式中的某些參考值,而不是調用者/活動工作表的參考值? 'INDIRECT(地址(行(),列(D:D)))' –

0

我認爲你正在尋找Application.Caller:

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

你正在評估字符串'CODE-VARS'!$G$5這將返回該單元格中的值不是其公式。試試這個:

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

嘗試過,它仍然是相同的 –

+0

在我的公式中是否可以引用在reffered表中的值而不是調用者/活動表? '間接(地址(行(),列(D:D)))' –

+0

D列中的值是什麼?間接(地址())期望單元格引用在列D.因此,顯示D列中的內容的一些示例。@朱虎 –

0

的問題是我使用引用單元格INDIRECT(),它並不時的eval()是從不同的表稱爲工作。

這工作:

INDEX(D:D,ROW()) 

這不:

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