【发布时间】:2013-09-16 05:44:57
【问题描述】:
问题:寻找一种更有效的方法来查找一维数组中是否存在精确匹配的值——本质上是一个布尔值true/false。
我是否忽略了一些明显的事情? 还是我只是使用了错误的数据结构,在我可能应该使用集合对象或字典时使用了数组?在后者中,我可以分别检查.Contains 或.Exists 方法
在 Excel 中,我可以检查向量数组中的值,例如:
If Not IsError(Application.Match(strSearch, varToSearch, False)) Then
' Do stuff
End If
这将返回一个精确匹配索引,显然受到Match 函数的限制,该函数只能在此上下文中找到 first 匹配值。这是一种常用的方法,我也用了很久。
这对于 Excel 来说已经足够令人满意了——但其他应用程序呢?
在其他应用程序中,我可以做基本相同的事情,但需要启用对 Excel 对象库的引用,然后:
If Not IsError(Excel.Application.match(...))
不过,这似乎很愚蠢,并且由于权限/信任中心/等原因,很难对分布式文件进行管理。
我尝试过使用Filter()函数:
If Not Ubound(Filter(varToSearch, strSearch)) = -1 Then
'do stuff
End If
但是这种方法的问题是Filter 返回一个部分匹配的数组,而不是一个完全匹配的数组。 (我不知道为什么返回子字符串/部分匹配会很有用。)
另一种选择是逐个遍历数组中的每个值(我认为这也是非常常用的)——这似乎比调用 Excel 的 Match 函数更不必要。
For each v in vArray
If v = strSearch Then
' do stuff
End If
Next
【问题讨论】:
-
如果您的数组可以有重复项,那么您可能会选择循环遍历数组的最后一个选项。如果你把它包装在一个函数中,真的不会太麻烦。我想最好的方法将取决于要检查的数组的大小以及需要进行多少次查找之类的事情。如果您需要快速查找速度,则可以将数组加载到字典中,并通过将索引数组存储为“值”来计算重复项。
-
嘿@TimWilliams 对不起,我说得不够清楚——我测试的是布尔值;数组中是否存在值。具体来说,有没有比依赖
Excel.Application.Match更好的方法来执行此操作,例如在 Word 或 PowerPoint 等中? -
如果数组是一维的(或操作为一维),那么您可以将数组
Join转换为字符串并使用Instr来测试是否存在匹配。它应该很快,但尚未测试是否比 Match 更快。 -
@ooo 是的,这是我有时使用的另一种方法,但我也没有测试过它的速度。
标签: arrays vba excel data-structures