我有一个看似基本的问题,但无法找到解决它的任何资源.
简单地说,我只想将一系列单元格(所有一列)的内容加载到一个数组中.
我能够通过以下方式实现这一目标
DirArray = Array(Range("A1"), Range("A2"))
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,我不能以这种方式表达时创建数组:
DirArray = Array(Range("A1:A2"))
Run Code Online (Sandbox Code Playgroud)
我的真实范围要长得多(并且长度可能不同),所以我不想以这种方式单独枚举单元格.谁能告诉我如何将整个范围正确加载到数组中?
后面的代码:
MsgBox UBound(DirArray, 1)
Run Code Online (Sandbox Code Playgroud)
和
MsgBox UBound(DirArray)
Run Code Online (Sandbox Code Playgroud)
返回0,而前者返回1.
问题:寻找一种更有效的方法来查找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) If UBound(Filter(myArray, Sheets(i).Cells(1, j).Value, True)) = -1 Then
'take action
End if
Run Code Online (Sandbox Code Playgroud)
我使用此语法将在Cells(1,j)中找到的元素(例如“ ally”)与数组的所有元素(例如“ mally”,“ kate”,“ becks”)进行比较,并在没有找到完全匹配。麻烦的是,根据这一行代码,似乎“盟友”被视为与“盟友”匹配(可能是因为“盟友”是“盟友”的子字符串),而我希望“盟友”被识别为与“盟友”不同”。
对实现这一点的语法有帮助吗?谢谢!
在循环中,我想检查值是否在数组中,如果是,则跳到下一次迭代.
我对阵列的低级理解阻止了我:
我正在使用下面的函数(来自:检查值是否在数组中与Excel VBA),以查看值是否在数组中.
Public Function IsInArray(Vtobefound As Long, arr As Variant) As Boolean
Dim i
For i = LBound(arr) To UBound(arr)
If arr(i) = Vtobefound Then
IsInArray = True
Exit Function
End If
Next i
IsInArray = False
End Function
Run Code Online (Sandbox Code Playgroud)
但我的Sub下面仍然不起作用:
Sub CountCellstest()
Dim i, k As Long
' Dim iArray() As Single
ReDim iArray(1 To 1) As Single
For i = 1 To 3
If IsInArray(i, iArray) Then 'ERROR HERE on the i
GoTo next_iteration
End …Run Code Online (Sandbox Code Playgroud)