如何编写Excel VBA相当于INDIRECT函数?

在我的工作簿中,我有很多使用INDIRECT函数的方法,并且导致性能问题。 我需要用能够给我相同结果的东西来代替它们。 所有的INDIRECTS在任何时候都会重新计算,导致工作簿滞后。

我想知道是否有一种方法可以在不使用INDIRECT函数的情况下在VBA中编写INDIRECT,并在代码中消除函数的波动性。

=INDIRECT("'" & $AC$9 & "'!" & AC26) 

这是一个例子。 我需要删除INDIRECT,但获得相同的结果,为这个单元格。 有没有办法在VBA中做到这一点?

你可以试试这个

将下面的例程放在一个标准的代码模块中:

 Public Function INDIRECTVBA(ref_text As String) INDIRECTVBA = Range(ref_text) End Function Public Sub FullCalc() Application.CalculateFull End Sub 

INDIRECTreplace公式中的INDIRECT函数。

这些将是静态的。 如果工作簿的缓慢是因为你的INDIRECT正在不断地评估,那么这将会结束这个工作。

重要提示:所有包含使用INDIRECTVBA的公式的单元格都是静态的。 每个公式都会在您确认时进行计算,但在先例更改时不会重新计算。

然后你需要一种方法来迫使他们在方便的时候重新计算。 您可以从function区中执行此操作。 或者,您可以运行FullCalc

是要添加这个作为评论,但我的思维过程太长了。

你正试图解决的问题的背景是什么?

我猜你正在使用$ AC $ 9中的某种数据validation下拉菜单来select表单名称,然后所有的INDIRECT公式都提供用户指定的工作表的特定部分的镜像。

如果是这种情况,那么你可以考虑使用INDEX作为替代。 它写成=INDEX(Range, RowNum, ColNum)例如,如果你把这个在H20: =INDEX(Sheet1!A:Z,ROW()+10,COLUMN()-5)那么它将反映任何在表1,单元格C30(H – 5列,20 + 10行)。 当然,如果你不想要,你不必抵消任何东西,我只是想certificate这一点。

现在,更复杂的部分仍然会保留 – 分配/更新SheetNamevariables。 这可以用UserForm来完成,而不是在特定的input单元中input值。 例如,你可以让VBA为用户提供一个input框/下拉菜单来select一个可用的表名,然后把它用在快速查找和replace指令中 – search"=INDEX(*!"并replace为"=INDEX(" & InputVariable & "!"

我已经对你的数据集做了一些假设,以及你想要达到什么,所以它可能不是理想的解决scheme,但也许是需要思考的问题。