【问题标题】:Why is this lookup function slow?为什么这个查找功能很慢?
【发布时间】:2018-08-02 20:34:29
【问题描述】:

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

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 搜索更快?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    这是一种让它更快一点的方法:

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

    用什么魔法让 VLOOKUP 搜索更快?

    • C 编程

    【讨论】:

      【解决方案2】:

      除非您绝对坚持使用 poly-filling(在非字面意义上),否则 Excel 已经具有内置函数 Find,如果找到则返回 Range,否则返回 Nothing

      您可以进一步修改它,将其转换为计算结果为 Boolean 的函数

      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


      一般来说,如果您可以在没有循环的情况下执行某项操作,通常意味着它会更快

      【讨论】:

        【解决方案3】:

        在大多数情况下(我什至会说全部)内置函数比 VBA 更快。它们已经被编译和原生代码。

        他们还可以使用 VBA 不能使用的多线程。所有这些效果使他们行动得更快。你也不想重新发明轮子。所以我建议尽可能使用内置函数。

        【讨论】:

        • @PEH - VBA 实际上是在您在 VBA 编辑器上编写它的那一刻编译的。尽管如此,内置功能在速度上是无法比拟的。请参阅此答案下方的最后一个 cmets - stackoverflow.com/a/17253557/5448626
        • @Vityata 很好,很高兴知道。现在这就解释了为什么您在输入后立即在每一行上得到一个编译错误,而不是在尝试执行代码时。现在完全有道理。感谢您的澄清,总是很高兴。
        • @Vityata:我完全同意!我认为 VBA(或 Excel)是最被低估的"tools" 之一。也完全同意.. 无论如何,VBA 都不是一种脚本语言.. 虽然该线程中有一些有趣的语言:)
        • @Zac - VBA 被低估是 VBA 世界中每个人都习惯的事情。但是,该线程曾经被用来对我表明 VBA 是一种脚本语言。我一分钟无语,我稍后尝试编辑线程。无论如何,修改未被接受。
        • @Vityata:我不想就这个问题展开对话,因为我们可能会持续几个小时......但你坚持自己的立场真好!喜欢它!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-07
        • 2022-01-09
        • 2014-09-15
        • 2010-10-19
        • 2016-10-13
        • 1970-01-01
        相关资源
        最近更新 更多