62

可能重复:
如何在MS Access VBA数组中搜索字符串

我当前正在处理Excel宏,无法找到类似的方法if-array.contains(mystring)

我写了以下内容,它给了我一条消息“无效限定符”,并强调了美因弗拉姆刚好在…之后如果

调光主框架(4)为字符串主框架(0)=“苹果”Mainfram(1)=“梨”主框架(2)=“橙色”Mainfram(3)=“水果”对于所选内容中的每个单元格如果是Mainfram。包含(cel.Text)Then行(cel.Row)。Style=“强调文字颜色1”End If(结束条件)下一个cel

所选内容是一列

有人帮忙吗?

你好,JP我尝试了你的建议,它说需要Object。并强调了如果IsInArray(cell.Text,Mainfram),则这是我的完整代码

子更改行颜色()列(“B:B”)。选择尺寸标注为Excel。范围调光主框架(4)作为字符串主框架(0)=“苹果”主框架(1)=“梨”主框架(2)=“橙色”主框架(3)=“香蕉”对于所选内容中的每个单元格如果IsInArray(cell.Value,Mainfram),则行(cel.Row)。Style=“强调文字颜色1”End If(结束条件)下一个cel结束Sub函数IsInArray(字符串ToBeFound为字符串,arr为变量)为布尔值IsInArray=(UBound(筛选器(arr,stringToBeFound))>-1)End函数

没关系,我发现了那个愚蠢的错误。。。无论如何谢谢你

6
  • 仅供参考,这已经被问及在这里. 评论 2012年6月20日2:50
  • 1
    @日本:是的,那么让我们把它作为一个完全相同的副本关闭。 评论 2012年6月20日7:57
  • @Jean-FrançoisCorbett挂牌 评论 2012年6月20日12:27
  • 如果你只是想评论我的回答,请不要更新你的问题。请留下评论。我在运行代码时得到的唯一错误(除了不匹配的细胞/细胞引用是上的错误行(cel.Row)。Style=“强调文字颜色1”行。 评论 2012年6月20日15:03
  • 接受的答案有效。另请参考建议使用Join方法的答案,以获得更快的解决方案。 评论 2016年2月21日23:55

4个答案4

重置为默认值
142

使用中的代码我的答案对于一个非常相似的问题:

子DoSomething()调光主框架(4)为字符串以Excel格式显示尺寸单元格。范围Mainfram(0)=“苹果”主框架(1)=“梨”Mainfram(2)=“橙色”Mainfram(3)=“水果”对于所选内容中的每个单元格如果IsInArray(cell.Value,MainFram),则行(cell.Row)。Style=“强调文字颜色1”End If(结束条件)下一个单元格结束Sub函数IsInArray(字符串ToBeFound为字符串,arr为变量)为布尔值IsInArray=(UBound(筛选器(arr,stringToBeFound))>-1)End函数
12
  • 我记得那个。我投了赞成票,我投了这个:)。 评论 2012年6月20日3:39
  • 1
    +1像往常一样好:) 评论 2012年6月20日3:52
  • 31
    这仅查找包含文本字符串ToBeFound的所有数组元素,而不是完全相等。因此,对于包含键“e”、“绝对”、“最终”等的数组,IsInArray(“e”,arr)将返回true。
    – 贝库斯
    评论 2014年2月2日14:42
  • 11
    这不是一个好的解决方案。这样,如果您查找“p”而不是整个单词,它将返回TRUE。
    – 帕亚姆
    评论 2015年3月6日3:57
  • 这种方法也很慢。请参阅我在加入答案下的评论,查看测试结果。 评论 2016年2月21日23:53
20

另一种简单的使用方法加入INSTR公司

子样本()Dim Mainfram(4)作为字符串,strg作为字符串尺寸传感器范围标注分隔符为字符串Delim=“#”主框架(0)=“苹果”主框架(1)=“梨”主框架(2)=“橙色”主框架(3)=“水果”strg=连接(主框架,Delim)strg=分隔符(&S)对于所选内容中的每个单元格如果InStr(1,strg,Delim&cel.Value&Delim,vbTextCompare),则_行(行)。Style=“强调文字颜色1”下一个cel结束Sub
12
  • 2
    是的,但如果查找的字符串恰好包含用作任意分隔符的字符,则可能会失败(#或者所选择的任何内容)。 评论 2012年6月20日7:56
  • 1
    嗯,也许我错过了什么?你能给我举个例子吗? 评论 2012年6月20日7:57
  • 4
    再次同意你的观点。这取决于分隔符的选择。顺便说一句#这是我的€*@£!%&*分隔符#是一个很好的分隔符。细胞出现这种情况的可能性有多大:-D 评论 2012年6月20日8:31
  • 2
    在搜索“fruit”时,您的代码将失败,因为字符串的末尾没有Delim。在字符串的两侧都放置一个Delim,否则,我将在下一条注释中解释,答案会比接受的答案更好。 评论 2016年2月21日23:48
  • 此方法比使用Filter的公认答案快得多。我使用10个随机单词对这两个单词进行了测试,每次迭代10000000次。JOIN方法耗时7秒,而FILTER方法耗时38秒。 评论 2016年2月21日23:52
5

使用Filter()方法,如下所示-https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/filter-function

6
  • 10
    回答得好。一个代码示例会让它变得更好! 评论 2012年6月19日22:42
  • 2
    只包含链接的答案真的是“好答案”吗?大多数人的意见似乎是“不”。 评论 2012年6月20日8:08
  • 2
    所以如果我从链接中复制/粘贴示例,我的答案会更好?该链接包含一个确切的示例,OP可以在代码中使用逐字逐句来实现他的目标。 评论 2012年6月20日13:51
  • 13
    @EkoostikMartin实际上,我会说答案是“是的”。即使是MSDN文档,最好复制并粘贴相关的答案中包含该页面的内容,然后包含链接以供参考。即使是MSDN URL也会被破坏,尽管很少。此外,最好不要去其他网站,除非你想了解更多信息。同样,能够在一个网页上比较不同的答案也很好,如果它们都在这里,这会更容易。 评论 2012年7月3日11:52
  • 我同意,粘贴代码会更好。Feral Oink是一个观点,但如果每个人都可以简单地查看本文中的代码,而不需要遵循另一个链接,那么它也可以节省每个人的下游时间。一个人多花几秒钟的时间可以为许多人节省同样的时间。有人想想孩子们!
    – 安东尼
    评论 2014年8月25日22:47
1

恐怕我不认为有捷径可以做到这一点——只要有人能为VB6编写一个linq包装器就好了!

您可以编写一个函数,通过循环遍历数组并检查每个条目来执行此操作,我认为您不会比这更清楚。

这里有一篇示例文章提供了一些详细信息:http://www.vb6.us/tutorials/searching-arrays-visual-basic-6

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.