Excel vba:手动调用('=')或通过macros之间的函数性能差异

我必须编写自己的查找函数,但是根据我是否在工作表本身(通过“=”)或通过macros调用它,它的性能会有很大的不同。 我的macros执行以下操作:

Function betterSearch(searchCell As Range, aCol As Range, bCol As Range) For Each cell In aCol If LCase(cell.Value) = LCase(searchCell.Value) Then betterSearch = bCol.Cells(cell.row, 1) Exit For End If betterSearch = "Not found" Next End Function 

因此,macros将打开resultsWorkbook和dataWorkbook,然后在dataWorkbook中的resultWorkbook中执行A列中四个值的search,并从dataWorkbook的某个其他列中返回相应的数据。

 '...opening resultWorkbook and dataWorkbook For aRow = 6 To 9 resultWorkbook.Worksheets("B3").Cells(aRow, 125).Value = _ betterSearch(resultWorkbook.Worksheets("B3").Cells(aRow, 1) _ , dataWorkbook.Worksheets("page 1").Range("A:A") _ , dataWorkbook.Worksheets("page 1").Range("Z:Z")) resultWorkbook.Worksheets("B3").Cells(aRow, 126).Value = _ betterSearch(resultWorkbook.Worksheets("B3").Cells(aRow, 1) _ , dataWorkbook.Worksheets("page 1").Range("A:A") _ , dataWorkbook.Worksheets("page 1").Range("I:I")) Next aRow 

这真的很慢 – 需要几分钟的时间来处理一个文件。 但是,当我手动打开该文件,只需键入公式,并按Enter键即刻计算(所以在这方面我的function不需要优化 – 它已经快速计算,但为什么只是在工作表中,而不是在macros内)。

不是在寻找优化function本身。 我只是想明白 为什么会出现这种差异。 我有Application.Calculation = xlCalculationManual为主要应用程序和不可见的应用程序运行,并执行所有的工作: ExcelApp.Calculation = xlCalculationManual ,它似乎将工作簿的状态更改为手动,但低速性能仍然存在工作簿仍然是自动的。

任何帮助或想法表示赞赏。

可能与使用整个色谱柱范围有关。
我想当从一个macros调用函数时,你迫使Excel为每个完整的列引用传输一百万个值到VBA(从Excel传输数据到VBA是非常缓慢的)。
当从工作表中调用函数时,您只是传递一个范围对象,然后逐个单元格循环,因此传输到VBA的数据量可能less了几十万倍(取决于您需要查找的范围有多远一场比赛)。

尝试设置您的macros的范围variables为完整的列引用,然后传递范围variables而不是范围(I:I)BetterSearch

您可以使用Find函数,并使用MatchCase:=False这样会不区分大小写。

这将比循环通过你的列快得多。

 Function betterSearch(searchCell As Range, aCol As Range, bCol As Range) As String Dim FndRng As Range Set FndRng = aCol.Find(what:=LCase(searchCell.Value), LookIn:=xlValues, lookat:=xlWhole, _ searchorder:=xlRows, searchdirection:=xlNext, MatchCase:=False) If Not FndRng Is Nothing Then ' Find was successful betterSearch = bCol.Cells(FndRng.Row, 1) Else betterSearch = "Not found" End If End Function