首页 > 解决方案 > 使用通配符可能更快的 VBA 查找?

问题描述

我需要使用宏在工作表上使用通配符执行大量查找(主要是查找值并从另一列返回值,尽管通过适当的调整它也可以只是查找带有通配符的值,并且仅查找一些as 检查该值是否存在于数据集中)。我的数据无法排序,所有查找都在循环 A 内或循环 A 内;通配符主要用于条件“字符串以...开头”。我经常需要在一行中找到一个值,然后在下面或上面的 N 行中找到对应的值。
我有一个工作代码,但我想知道它是否可以更快地完成。@response 评论关于在 Code Review 上发布它的评论(抱歉,我还不能评论 :)) - 准备发布整个代码对我来说需要太多时间,保密等,所以我更愿意将其视为一般问题在这个例子上工作。

示例数据:(如果我需要任何辅助列,我可以添加更多列)
Imgur 的示例数据图片

假设有 100 000 行(最大 xPagesCount = 1000,通常约为 400;某些 xPage 的所有值都在一个块中)。由于有很多可能的行带有附加数据,我不能简单地找到一个值并将数字添加到找到的行中以通过它们的位置找到其他值。

在循环连续 xPage 时执行的示例查找(因此,对于每个给定的 xPage)

我想知道,进行此类查找的最快方法是什么?
我尝试了什么:

xValue = dict(xPage & "ATH.416")
If dict(xPage & "ATH.416") = "" Then xValue = Application.Match("ATH.*", Sheets(1).Range("D:D"), 0)

我认为,但不确定是否值得付出努力:

xStartPage = sh.Range("D" & Application.Match(xPage, sh.Range("A1:A" & LastRow), 0))
'or, I guess better:
xStartPage = xEndPage + 1

If xPage = xPagesCount Then
    xEndPage = LastRow
Else
    xEndPage = sh.Range("D" & Application.Match(xPage + 1, sh.Range("A1:A" & LastRow), 0) - 1)
End If

xValue = sh.Range("D" & Application.Match("4???.*", sh.Range("D" & xStartPage & ":D" & xEndPage), 0)).Value

标签: excelvbaperformancewildcardvlookup

解决方案


推荐阅读