首页 > 解决方案 > 用非易失性VBA方法替换Indirect,但不能用OFFSET等Excel函数嵌套返回值?

问题描述

我对这个问题有一个后续问题。

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

但是当我使用 INDIRECTVBA 方法并使用 OFFSET 函数嵌套它时,我得到一个错误,它显示“#VALUE!” (是的,我知道 OFFSET 是另一个 volatile 函数,我将替换为 INDEX ..)

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

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

=INDIRECTVBA($BJ$10) 有效。

=(OFFSET(INDIRECT($BJ$10),0,0)) 有效,但具有双重波动性。

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

有什么想法吗?

这是 INDIRECTVBA 方法:

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

Public Sub FullCalc()
    Application.CalculateFull
End Sub

标签: vbaexcelexcel-indirect

解决方案


您的函数不返回范围,因此它作为 OFFSET() 的第一个参数失败(这需要该位置的范围)。

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

尝试类似:

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

如果所有内容都不在同一张纸上,那么您将需要某种方式来指定应在 UDF 中使用哪张纸


推荐阅读