将 Indirect 替换为非易失性 VBA 方法,但不能将返回值嵌套在 Excel 函数(如 OFFSET)中?

Replacing Indirect with non-volatile VBA method, but cannot nest the returned value with Excel functions like OFFSET?

我有一个 的后续问题。

所以我想用 VBA 方法替换 INDIRECT 函数调用,因为 INDIRECT 是不稳定的,我的 excel 文档加载需要几秒钟,有时没有响应。

但是,当我使用 INDIRECTVBA 方法并将其与 OFFSET 函数嵌套时,出现错误并显示“#VALUE!” (是的,我知道 OFFSET 是另一个易变函数,我将用 INDEX 替换..)

具体来说: 单元格 BJ10 包含文本“$R$71”,这是对我保存数据的单元格的引用。

=INDIRECT($BJ$10) 有效但不稳定。

=间接VBA($BJ$10) 有效。

=(OFFSET(INDIRECT($BJ$10),0,0)) 有效但双重不稳定。

=(OFFSET(INDIRECTVBA($BJ$10),0,0)) 不计算,显示“#VALUE!”

有什么想法吗?

这是间接VBA方法:

Public Function INDIRECTVBA(ref_text As String)
    INDIRECTVBA = Range(ref_text)
End Function

Public Sub FullCalc()
    Application.CalculateFull
End Sub

您的函数没有 return 范围,因此它作为 OFFSET() 的第一个参数失败(在该位置需要一个范围)。

此外,当任何其他 sheet 处于活动状态时(假设它在标准模块中),您的函数将失败,因为 Range() 的范围默认为 ActiveSheet。

试试这样的东西:

Public Function INDIRECTVBA(ref_text As String)
    Set INDIRECTVBA = Application.ThisCell.Parent.Range(ref_text)
End Function

如果所有内容都不相同 sheet 那么您将需要一些方法来指定应该在您的 UDF

中使用哪个 sheet