关于excel:为什么这个查找功能很慢?

Why is this lookup function slow?

如果在指定范围内找到单元格值,我编写了以下UDF函数以返回true,否则返回false:

1
2
3
4
5
6
7
8
9
10
11
12
Function find_in_range(value_to_find As Variant, lookup_range As Range) As Boolean

For Each cell In lookup_range.Cells.SpecialCells(xlConstants)
    If cell.Value = value_to_find Then
        find_in_range = True
        Exit For
    Else
        find_in_range = False
    End If
Next cell

End Function

但是,它比vlookup慢得多。

为什么会这样?有没有办法让它更快?使用什么魔法使vlookup搜索更快?


这是提高速度的一种方法:

1
2
3
Public Function findInRange(valueToFind As Variant, lookupRange As Range) As Boolean
    findInRange = Not IsError(Application.Match(valueToFind, lookupRange, 0))
End Function

使用什么魔法使vlookup搜索更快?

  • 用C语言编程

除非你绝对坚持用多边形填充(非文字意义上),excel已经内置了函数Find,如果找到则返回Range,否则返回Nothing

您可以进一步将其修改为一个计算为Boolean的函数。

1
2
3
4
5
6
7
8
9
10
Option Explicit
Function isFound(ByVal value_to_find As String, ByVal in_range as Range) As Boolean

 If in_range.Find(value_to_find, lookin:= xlValues) Is Nothing Then
    isFound = False
 Else
    isFound = True
 End If

End Function

如果在范围内可以找到值,则返回true,否则返回false

一般来说,如果你可以做一些没有循环的事情,通常意味着它更快


在大多数情况下(我甚至会说全部),内置函数都比VBA快。它们已经被编译并且是本机代码。

它们也可以在VBA不能使用的情况下使用多线程。所有这些效果都使它们的动作更快。你也不想重新发明轮子。所以我建议尽可能使用内置函数。