excel - 使用通配符可能更快的 VBA 查找?
问题描述
我需要使用宏在工作表上使用通配符执行大量查找(主要是查找值并从另一列返回值,尽管通过适当的调整它也可以只是查找带有通配符的值,并且仅查找一些as 检查该值是否存在于数据集中)。我的数据无法排序,所有查找都在循环 A 内或循环 A 内;通配符主要用于条件“字符串以...开头”。我经常需要在一行中找到一个值,然后在下面或上面的 N 行中找到对应的值。
我有一个工作代码,但我想知道它是否可以更快地完成。@response 评论关于在 Code Review 上发布它的评论(抱歉,我还不能评论 :)) - 准备发布整个代码对我来说需要太多时间,保密等,所以我更愿意将其视为一般问题在这个例子上工作。
示例数据:(如果我需要任何辅助列,我可以添加更多列)
Imgur 的示例数据图片
假设有 100 000 行(最大 xPagesCount = 1000,通常约为 400;某些 xPage 的所有值都在一个块中)。由于有很多可能的行带有附加数据,我不能简单地找到一个值并将数字添加到找到的行中以通过它们的位置找到其他值。
在循环连续 xPage 时执行的示例查找(因此,对于每个给定的 xPage):
- 行中带有“限制:”文本的行中的值
- 查找名称(始终以高度(C 列)= 35 给出)
- 查找 RSW 编号(根据页面内容,可以在多行中,但始终位于名称下方)
- 查找以与 RSW 相同的四位数字开头的所有行,有两种格式:DDDD.LLL.DD 和 DDDD.DDDDD.DD(L 字母,D 位)(我在这里使用内部循环)
- 检查是否有文字“MASTER”(或“MASTER”等)
- 查找值“DOCUMENTS:”和“OPTIONS:”之间的所有值,其数量可以从 1 到 50(我在这里使用内部循环)
我想知道,进行此类查找的最快方法是什么?
我尝试了什么:
- 在所有数据集上使用字典(A 或 C 列中的键,值 col.D),但由于字典不能在通配符上工作,我不得不添加 ifs,因为找不到键来执行额外的 Application.Match 查找...然后意识到它主要适用于这些匹配查找,并且不确定我什至需要字典。我在一个页面中也有重复的值,并且字典只获得第一个值,而不管它们的位置(例如,几个附件的值可能为 1)。主要用途仍然是 dict.exists("MASTER") 但是当我删除字典并将其更改为 IsError(Application.Match(...)) 时,代码工作得稍微快一些。
- Application.Match 全范围,典型示例:
Application.Match(xPage & "4???.*", sh.Range("A1:A" & LastRow), 0)
- 在少数地方我使用
If xValue Like "????.???.??" Then
建筑 - 我有 ifs 重定向到 Application.Match 的字典查找:
xValue = dict(xPage & "ATH.416")
If dict(xPage & "ATH.416") = "" Then xValue = Application.Match("ATH.*", Sheets(1).Range("D:D"), 0)
我认为,但不确定是否值得付出努力:
- 更改在迭代开始时我找到 xPage 的第一行和最后一行的代码,然后在此范围内执行以后的每次检查
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
解决方案
推荐阅读
- python - 如何在df pandas中的行之间删除或填充相等的单元格值0?
- java - 如何告诉 mac 可执行文件从当前目录中获取 jar
- microcontroller - 在STM32F4中通过UART接收字符串
- css - 尝试将 GSAP 掷骰子动画更新为 React 并产生奇怪的效果
- javascript - 无法从 html javascript 中的输入类型“电子邮件”字段中获取值
- react-native - 如何正确安装expo cli?
- laravel - 如何配置 webpack 在不同的文件夹中编译 Vuejs 和 Laravel
- c# - 单元测试:验证方法是否被调用,在被测方法内部创建的对象作为参数
- python - 如何有效地加载大型图像数据集?
- javascript - 有没有办法用javascript检查鼠标位置?