如何编写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
用INDIRECT
replace公式中的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,但也许是需要思考的问题。