2

我的 VBA 代码是

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

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

如果 Sheet2!e19 有字符串 INDIRECT("pries!"&Sheet2!I19&12) 或 INDIRECT("pries!"&Sheet2!I19&Sheet1!d4) 或 INDIRECT("pries!"&Sheet2!I19&"Sheet1!D"&row()+12)公式从表格中返回结果!$Q12

如果 Sheet2!e19 有字符串 INDIRECT("pries!"&Sheet2!I19&address(row(),4)) 或 INDIRECT("pries!"&Sheet2!I19&"Sheet1!D"&row()) 公式返回结果 0 看起来像忽略 row() 函数

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

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

1 回答 1

1

有趣的问题...要进一步了解该问题,请从即时或观察窗口尝试这些:

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

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

但是,请注意,在上面的三个公式中更改]&""]会导致第一个错误,但最后两个是预期结果,因此row()现在相对于活动单元格进行评估。因此,当返回值不是范围引用时,Evaluate 的功能似乎有所不同。

更新

根据这些观察,您可以使用 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))
于 2012-06-08T12:04:19.143 回答