2012-06-08 49 views
2

我的VBA代碼是Excel的公式求值錯誤

Function yEval(entry As String) 
yEval = Evaluate(entry) 
Application.Volatile 
End Function 

在Sheet1中單元格F4我對工作表Sheet1公式=yEval(Sheet2!E19) 單元格D4包含數12 Sheet2的!I19包含字符串$ Q

如果Sheet2!e19有字符串INDIRECT(「pries!」& Sheet2!I19 & 12)或 INDIRECT(「pries!」& Sheet2!I19 & Sheet1!d4)或 INDIRECT( 「減價!」 & Sheet 2中!I19 & 「Sheet 1中!d」 &行()+ 12)式中返回從片撬開 結果!$ Q12

如果Sheet 2中!E19具有串 INDIRECT(「減價!」 & Sheet2的!I19 &地址(行(),4))或 INDIRECT( 「減價!」 & Sheet2的!I19 & 「工作表Sheet1!d」 &行())公式返回 結果0好像忽略了row()函數

如何使工作這個公式依賴於行數來改變D4的一部分,如果行5則D5

INDIRECT("pries!"&Sheet2!I19&Sheet1!d4) 

回答

1

有趣的問題......爲了進一步瞭解這個問題從眼前嘗試這些或監視窗口:

?[indirect("rc",0)] 
?[index(a:a,row())] 
?[offset(a1,row()-1,column()-1)] 

奇怪的是,無論哪個單元處於活動狀態,它們都評估爲A1。這是一個Evaluate[]的怪癖,當返回值是範圍引用時,引用被相對於A1而不是活動(調用)單元進行處理。您可以將row()視爲相當於row(RC)的相對於A1評估的RC符號。

但是,請注意,在第一,但在最後兩個預期的結果在三個公式上述結果改變]&""]中的錯誤,使得row()現在評估相對於所述活動單元格。因此,當返回值不是範圍參考時,Evaluate似乎有不同的功能。

更新

根據這些意見,你可以用指數爲行引用和間接外移動:

Sheet1!F4:=INDIRECT(yEval(Sheet2!E19)) 
Sheet2!E19:"pries!"&Sheet2!I19&INDEX(Sheet1!D:D,Row()) 

...或者只是使用RC樣式引用,而不需要對UDF:

=INDIRECT("pries!"&Sheet2!I19&INDIRECT("RC4",0)) 
+2

問題是在內部使用ROW()或COLUMN()評估:activesheet.evaluate(「偏移量(a10,2,0)」)工作正常。 –

+0

更具體地說,問題在於INDIRECT公式,因爲'evaluate(「index(row(),1))」工作正常。因此,另一種選擇是從單元格公式中除去INDIRECT並使用'= yeval(INDEX(yeval(Sheet2!E19),1))'代替。 –