2012-06-08 48 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))'代替。 –