如何查找数组是不是包含字符串[重复]
Posted
技术标签:
【中文标题】如何查找数组是不是包含字符串[重复]【英文标题】:How to find if an array contains a string [duplicate]如何查找数组是否包含字符串[重复] 【发布时间】:2012-06-22 00:22:31 【问题描述】:可能重复:How to search for string in MS Access VBA array
我目前正在处理 Excel 宏,但找不到类似的方法
if array.contains(mystring)
我写了以下内容,它给了我“Invaild Qualifier”消息,并在If
之后突出显示Mainfram
Dim Mainfram(4) As String
Mainfram(0) = "apple"
Mainfram(1) = "pear"
Mainfram(2) = "orange"
Mainfram(3) = "fruit"
For Each cel In Selection
If Mainfram.Contains(cel.Text) Then
Row(cel.Row).Style = "Accent1"
End If
Next cel
选择是一列
有人帮忙吗?
嗨,JP 我试过你的建议,它说需要对象。并突出显示 If IsInArray(cell.Text, Mainfram) Then 这是我的完整代码
Sub changeRowColor()
Columns("B:B").Select
Dim cel As Excel.Range
Dim Mainfram(4) As String
Mainfram(0) = "apple"
Mainfram(1) = "pear"
Mainfram(2) = "orange"
Mainfram(3) = "Banana"
For Each cel In Selection
If IsInArray(cell.Value, Mainfram) Then
Rows(cel.Row).Style = "Accent1"
End If
Next cel
End Sub
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
没关系,我发现了那个愚蠢的错误...... 还是谢谢你
【问题讨论】:
仅供参考,这已被问及回答here。 @JP.: 是的,那么让我们将其作为完全副本关闭。 @Jean-FrançoisCorbett 已标记 如果您只想对我的回答发表评论,请不要更新您的问题。改为发表评论。我在运行您的代码时遇到的唯一错误(除了不匹配的cel/cell
引用之外是 Rows(cel.Row).Style = "Accent1"
行上的错误。
接受的答案有效。另请参阅建议使用 Join 方法的答案以获得更快的解决方案。
【参考方案1】:
使用my answer 中的代码回答一个非常相似的问题:
Sub DoSomething()
Dim Mainfram(4) As String
Dim cell As Excel.Range
Mainfram(0) = "apple"
Mainfram(1) = "pear"
Mainfram(2) = "orange"
Mainfram(3) = "fruit"
For Each cell In Selection
If IsInArray(cell.Value, MainFram) Then
Row(cell.Row).Style = "Accent1"
End If
Next cell
End Sub
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
【讨论】:
我记得那个。我投了票,我对此投了票:)。 + 1 Nice One 像往常一样 :) 这只会查找包含文本 stringToBeFound 的所有数组元素,而不是完全等于它。因此,IsInArray("e", arr) 将为包含键“e”、“absolutely”、“eventually”等的数组返回 true。 这不是一个好的解决方案。这样,如果您查找“p”而不是整个单词,它将返回 TRUE。 这个方法也很慢。在加入答案下查看我的评论以查看测试结果。【参考方案2】:使用JOIN
和INSTR
的另一种简单方法
Sub Sample()
Dim Mainfram(4) As String, strg As String
Dim cel As Range
Dim Delim As String
Delim = "#"
Mainfram(0) = "apple"
Mainfram(1) = "pear"
Mainfram(2) = "orange"
Mainfram(3) = "fruit"
strg = Join(Mainfram, Delim)
strg = Delim & strg
For Each cel In Selection
If InStr(1, strg, Delim & cel.Value & Delim, vbTextCompare) Then _
Rows(cel.Row).Style = "Accent1"
Next cel
End Sub
【讨论】:
是的,但是如果搜索的字符串恰好包含用作任意分隔符的字符(#
或任何选择的字符),这可能会失败。
嗯,也许我错过了什么?可以举个例子吗?
pear#orange
将是误报。顺便说一句,apple
将使用您当前的代码返回一个假阴性...但您可以通过在搜索字符串前面加上分隔符来解决这个问题:strg = "#" & strg
。
再次同意你的看法。这取决于分隔符的选择。 BTW #This is my €*@£!%&* delimiter!#
是一个很好的分隔符。细胞有什么机会:-D
这种方法比使用过滤器的公认答案快得多。我使用随机的 10 个单词对两者进行了测试,每个单词进行了 10,000,000 次迭代。 JOIN 方法耗时 7 秒,而 FILTER 方法耗时 38 秒。【参考方案3】:
使用此处所示的 Filter() 方法 - https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/filter-function
【讨论】:
好答案。一个代码示例会让它变得更好! Are answers that just contain links really “good answers”? 多数意见似乎是“不”。 所以如果我从链接中复制/粘贴示例,我的答案会更好吗?该链接包含一个确切的示例,OP 可以在其代码中逐字使用该示例来实现其目标。 @EkoostikMartin 实际上,我会说答案是“是”。即使它是 MSDN 文档,最好从您的答案中复制并粘贴该页面的relevant
内容,然后包含链接以供参考。即使是 MSDN URL 也会被破坏,尽管很少见。此外,不需要去另一个网站也很好,除非你想了解更多信息。同样,能够比较不同的答案也很好,如果它们都在一个网页上,这会更容易。
我同意,粘贴代码会更好。 Feral Oink 作为一个观点,但如果他们可以简单地查看这篇文章中的代码而不需要关注另一个链接,它也可以节省每个人的下游时间。一个人多花几秒钟就可以为许多人节省同样多的时间。有人想孩子们!【参考方案4】:
恐怕我认为没有捷径可以做到这一点 - 要是有人愿意为 VB6 编写一个 linq 包装器就好了!
您可以编写一个函数,通过循环遍历数组并检查每个条目来执行此操作 - 我认为您不会比这更干净。
这里有一篇示例文章提供了一些详细信息:http://www.vb6.us/tutorials/searching-arrays-visual-basic-6
【讨论】:
以上是关于如何查找数组是不是包含字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章