我在工作簿中使用了INDIRECT函数,导致了性能问题。我需要用能给我相同结果的东西替换它们。所有INDIRECTS都会在任何时候发生变化时重新计算,导致工作簿滞后。
我想知道是否有办法在没有实际使用INDIRECT函数的情况下在VBA中编码INDIRECT,并在代码中消除函数的波动性。
=INDIRECT("'" & $AC$9 & "'!" & AC26)
这是一个例子。我需要删除INDIRECT但是为这个单元格获得相同的结果。有没有办法在VBA中实现这一目标?
答案 0 :(得分:3)
你可以试试这个。
将以下例程放在标准代码模块中:
Public Function INDIRECTVBA(ref_text As String)
INDIRECTVBA = Range(ref_text)
End Function
Public Sub FullCalc()
Application.CalculateFull
End Sub
使用INDIRECT
替换公式中的INDIRECTVBA
函数。
这些将是静态的。如果您的工作簿缓慢是因为您的INDIRECT正在不断评估,那么这将结束这一点。
重要提示:包含使用INDIRECTVBA
的公式的所有单元格都是静态的。每个公式都将在您确认时计算,但在先例更改时不会重新计算。
然后,您需要一种方法强制他们在方便的时候重新计算。您可以从功能区执行此操作。或者,您可以运行FullCalc
。
答案 1 :(得分:0)
是否会将此添加为评论,但我的思维过程太长了。
您要解决的问题的背景是什么?
我猜您在$ AC $ 9中使用某种数据验证下拉菜单来选择工作表名称,然后所有的INDIRECT公式都提供了用户指定工作表的特定部分的镜像。
如果是这种情况,那么您可以考虑使用INDEX
作为替代方案。它写成=INDEX(Range, RowNum, ColNum)
例如。如果你把它放在H20:=INDEX(Sheet1!A:Z,ROW()+10,COLUMN()-5)
那么它会反映出表格1,单元格C30(H-5列,20 + 10行)中的内容。当然,如果你不想,你不必抵消任何东西,我只想证明这是一个选择。
现在,更棘手的部分仍然存在 - 分配/更新SheetName变量。这可以使用UserForm完成,而不是在特定输入单元格中键入值。例如,您可以让VBA提供一个输入框/下拉菜单供用户选择一个可用的工作表名称,然后获取该输入并在快速查找和替换指令中使用它 - 搜索"=INDEX(*!"
并替换与"=INDEX(" & InputVariable & "!"
我对您的数据集以及您尝试实现的目标做了一些假设,因此它可能不是理想的解决方案,但可能需要考虑。