我正在使用PULL函数(http://groups.google.com/group/microsoft.public.excel.worksheet.functions/msg/e249f6c074a3adfd?pli=1),它类似于INDIRECT,除了它可以引用已关闭的工作簿。
PULL函数可以正常工作,除了每次调用它时都会创建一个excel实例,这会使得多次调用的工作簿计算速度极慢。
有没有办法重新编写这个函数,以便它运行得更快?
答案 0 :(得分:2)
拉是慢的。它故意是非易失性的。可以通过使Application实例有效地静态(我将其设为私有的,模块级变量)来改进它,但这可能导致重入问题,我不想解决。在这一点上,最好让胆量成为一个类,而udf只是围绕其中一种方法的包装,这也是我不想解决的问题。
如果你有许多调用pull的公式,而且大多数都会引用不同的工作簿,那么最好使用Laurent Longre的MOREFUNC.XLL加载项,它提供了一个名为INDIRECT.EXT的函数。它还使用第二个Excel应用程序实例取消引用已关闭工作簿中的范围,但由于它是XLL而不是VBA,因此可能会更快一些。
OTOH,如果你指的是一些工作簿中的多个单元格,以存储为代价,你可以使用pull作为数组公式,在一次调用中拉入大范围。
答案 1 :(得分:0)
你有什么理由不想使用:
='C:\Full\Path\To\ExcelFile\[Book1.xls]Sheet1'!$B$2
答案 2 :(得分:0)
在使用Execute4Macro时,由于某些原因,它们似乎每次都会打开工作簿。我没有太多使用它,但也许你可以试验它并直接尝试这样的东西(而不是使用人物功能):
arg = "'" & wbPath & "[" & wbName & "]" & _
wsName & "'!" & Range(cellRef).Address(True, True, xlR1C1)
GetInfoFromClosedFile = ExecuteExcel4Macro(arg)
有些函数适用于已关闭的工作簿,所以也许你可以使用类似的东西,比如,SUMPRODUCT,我相信可以在一个封闭的工作簿上运行,或者可能是一个数据库函数。
我不确定你要做什么,所以如果你想要一个更具体的答案,你必须更加具体。
尝试一下这里提供的一些解决方案: http://www.mrexcel.com/forum/showthread.php?t=14353
答案 3 :(得分:-1)
只需要一个用于更改LINK条目的小宏:
ActiveWorkbook.ChangeLink Name:="C:\Temp\DeleteMe1.xlsx", NewName:= _
"C:\Temp\DeleteMe.xlsx", Type:=xlExcelLinks