【发布时间】:2022-01-24 14:04:08
【问题描述】:
是否可以在字符串和/或整数数组中查找字符串和/或整数数组?如果是,那怎么办?
要在字符串数组中查找字符串,我使用如下代码:
If IsInArray(LowerFilmWidthArray, LowerFilmWidth) then
'Dos tuff
end if
还有一个函数是:
Function IsInArray(arr As Variant, myVal As Variant) As Boolean
IsInArray = Not IsError(Application.Match(myVal, arr, 0))
Debug.Print (IsInArray)
End Function
作为结果示例,假设您有一个整数数组 (1-10),并且您正在查看您的数组 (1,5,6) 是否在前一个数组(其中的所有项)内,然后返回 True。在我的情况下,我正在全力寻找从第 3 列到最后一列的数据列中的值,这将构成我的数组,我尝试在另一个数组中查找所有项目并返回 true 或 false。
一个实际的例子:
Dim LowerFilmWidthArray
LowerFilmWidthArray = Application.Transpose(Evaluate("row(320:420)"))
Dim LowerFilmWidth As Integer
LowerFilmWidth = Array(ThisWorkbook.Worksheets("Machine Specification").Cells(320, 400,400,620)
'I get theese from a range and they might as well be strings and an undefined number of defined by 3 to last column with data
if isinarray(LowerFilmWidthArray,LowerFilmWidth) then
msgbox("Great Success!")
end if
这个结果会是假的,因为最后一个“620”不在 LowerFilmWidthArray 内。
已编辑:
仍然无法让它工作,我的直觉说,当我只需要从一个数组中取出每个项目并尝试在另一个数组中找到它并仅在以下情况下获得“TRUE”时,答案中有太多不必要的东西我正在寻找的所有项目都存在于一个大数组中。
我已转换为查找数组(较小的数组)以从一组范围内获取值,该范围始终是从 3 到最后一列的一行。
Dim LowerFilmWidth
LowerFilmWidth = ThisWorkbook.Worksheets("Machine Specification").Range(Cells(Cells.Find("Lower Film Width (mm)").Row, 3), Cells(Cells.Find("Lower Film Width (mm)").Row, LastColumn))
并且我希望这部分能够创建一个包含该范围内单元格中所有值的数组。现在我需要查看是否所有这些项目/元素都存在于:
Dim LowerFilmWidthArray
LowerFilmWidthArray = Application.Transpose(Evaluate("row(320:420)"))
所以我使用建议的功能:
Function arrElemInArray(arr As Variant, arrX As Variant) As Boolean
Dim i As Long, j As Long, boolFound As Boolean
For i = LBound(arrX) To UBound(arrX)
For j = LBound(arr) To UBound(arr)
If CStr(arr(j)) = CStr(arrX(i)) Then
boolFound = True: Exit For
End If
If Not boolFound Then arrElemInArray = False: Exit Function
Next j
Next i
arrElemInArray = True
Debug.Print (arrElemInArray)
End Function
并使用它参与
If arrElemInArray(LowerFilmWidthArray, LowerFilmWidth) Then
msgbox("Great success!")
End If
解决方案必须同时使用整数和字符串。我仍然无法让它按预期工作。通常它无论如何都会返回“True”,但它似乎只检查较小数组中的第一项与大数组。
编辑中的此代码在“CStr(arrX(i))”上返回“下标超出范围”错误。
完整的子程序如下所示:
Sub Testing()
Dim LastColumn As Long
LastColumn = Cells(Cells.Find("Parameters", lookat:=xlWhole).Row, Columns.Count).End(xlToLeft).Column
Dim LowerFilmWidth
LowerFilmWidth = ThisWorkbook.Worksheets("Machine Specification").Range(Cells(Cells.Find("Lower Film Width (mm)").Row, 3), Cells(Cells.Find("Lower Film Width (mm)").Row, LastColumn))
Dim LowerFilmWidthArray
LowerFilmWidthArray = Application.Transpose(Evaluate("row(320:420)"))
If arrElemInArray(LowerFilmWidthArray, LowerFilmWidth) Then
MsgBox ("Great success!")
End If
End Sub
【问题讨论】:
-
什么意思?我不能真正循环使用我的列来查找单个字符串的值。这就是我的问题发生的原因
-
这是一个实际的例子吗:1.)
Data = Range("A3:A20").Value和 2.)Arr = Array(1, 5, 6)即如果Arr的所有元素都在Data中找到,则返回true?请分享更多细节,因为解决方案的效率取决于它。 -
OK 添加示例。我作为示例提供的代码只是一个示例,显然不起作用,否则我在这里不会有问题
-
-
您对
LowerFilmWidth = Array(ThisWorkbook.Worksheets("Machine Specification").Cells(320, 400,400,620)有什么期望?LowerFilmWidth是Integer...
标签: arrays excel vba string integer