Excel vba自定义查找function:手动使用时速度快,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将打开resultsWorkbookdataWorkbook ,然后在resultWorkbook中从resultWorkbook执行对A列中四个值的search,并从resultWorkbook某个其他列中返回相应的数据。

 '...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键即可计算。

这里有什么问题? 这种行为从何而来?

如果它试图search整个列A:A,I:I(1百万个单元格)

尝试更新你的betterSearch这个:

 Function betterSearch(searchCell As Range, aCol As Range, bCol As Range) Dim itm As String, col1 As Variant, col2 As Variant, r As Long With ActiveSheet col1 = .UsedRange.Columns(aCol.Column) col2 = .UsedRange.Columns(bCol.Column) End With betterSearch = "Not found" itm = LCase(searchCell.Value2) For r = 1 To UBound(col1) If Len(col1(r, 1)) > 0 Then If LCase(col1(r, 1)) = itm Then betterSearch = col2(r, 1) Exit Function End If End If Next End Function