问题:寻找一种更有效的方法来查找1d数组中是否存在精确匹配值 - 本质上是一个布尔值true/false
.
我忽略了一些明显的东西吗 或者我只是使用错误的数据结构,当我可能应该使用集合对象或字典时使用数组?在后者中,我可以分别检查.Contains
或.Exists
方法
在Excel中,我可以检查向量数组中的值,如:
If Not IsError(Application.Match(strSearch, varToSearch, False)) Then
' Do stuff
End If
Run Code Online (Sandbox Code Playgroud)
这将返回一个精确的匹配索引,显然受到Match
函数的限制,该函数仅在此上下文中找到第一个匹配值.这是一种常用的方法,也是我长期使用的方法.
这对Excel来说足够令人满意 - 但其他应用程序呢?
在其他应用程序中,我基本上可以做同样的事情,但需要启用Excel对象库的引用,然后:
If Not IsError(Excel.Application.match(...))
Run Code Online (Sandbox Code Playgroud)
但这看起来很愚蠢,并且由于权限/信任中心/等原因而难以管理分布式文件.
我试过使用Filter()函数:
If Not Ubound(Filter(varToSearch, strSearch)) = -1 Then
'do stuff
End If
Run Code Online (Sandbox Code Playgroud)
但是这种方法的问题是Filter
返回部分匹配的数组,而不是完全匹配的数组.(我不知道为什么返回子串/部分匹配会有用.)
另一种选择是逐字迭代数组中的每个值(我认为这也是非常常用的) - 这似乎比调用Excel的Match
函数更加麻烦.
For each v in vArray
If v = strSearch Then
' do stuff
End If
Next
Run Code Online (Sandbox Code Playgroud) 创建Excel-VBA
可由应用程序的所有成员访问的数据对象(字典,列表等)的最佳实践是什么?它应该被声明为单独的模块还是类模块?
例如,我想创建一个字典对象,不同的子程序将要检查用户输入(如果它包含或不包含).这个字典对象应该是它自己的模块,类模块,还是包含使用它的子程序的模块的一部分?
注意:此问题是检查值是否为列表成员的扩展