Excel评估公式错误

我的VBA代码是

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

在单元格f4 Sheet1中我有公式=yEval(Sheet2!E19) sheet1上的单元格d4包含数字12 Sheet2!I19包含string$ Q

如果Sheet2!e19有stringINDIRECT(“pries!”&Sheet2!I19&12)或INDIRECT(“pries!”&Sheet2!I19&Sheet1!d4)或INDIRECT(“pries!”&Sheet2!I19&“Sheet1!D”&row()+ 12)公式返回结果从表撬!$ Q12

如果Sheet2!e19有stringINDIRECT(“pries!”&Sheet2!I19&address(row(),4))或INDIRECT(“pries!”&Sheet2!I19&“Sheet1!D”&row())忽略row()函数

如何使这个公式根据行号改变d4部分,如果行是5则d5

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

有趣的问题…要进一步了解这个问题,请从直接或观看窗口中尝试:

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

奇怪的是,无论哪个细胞处于活动状态,它们都评估为A1 。 当返回值是一个范围引用时,这是Evaluate的一个怪癖或[]引用被相对于A1处理而不是活动(调用)单元。 您可以将row()等同于相对于A1计算的RC符号中的row(RC)

但是,请注意,在上面的三个公式中将&""]更改为&""]会导致第一个错误,而最后两个错误的结果是预期结果,因此row()相对于活动单元格进行计算。 因此,当返回值不是范围参考时,Evaluate的function似乎不同。

更新

基于这些观察,您可以使用INDEX作为行参考,并将INDIRECT移到外部:

 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))