【问题标题】:Searching with a wildcard使用通配符搜索
【发布时间】:2017-09-16 03:41:54
【问题描述】:

在下面的代码中,shLook 是一个包含文本项列表的工作表,我希望通过迭代 rowSt 表示的行来搜索工作表 shSource 中的字符串。

LPosition = InStr(1, shSource.Cells(rowSt, 18), shLook.Cells(i, 1).Value)

这很好用,但是如果shLook 中的任何文本包含通配符,它​​将不再能够在shSource 中找到相应的字符串。

是否有另一种方法来实现这一点,以便我可以将通配符放入文本项列表中?

【问题讨论】:

  • 当您将 shLook.Cells(row,col).Value 传递给 VBA 时,它认为它是一个字符串。通配符应在脚本本身中使用。
  • 我猜这是在 excel 中?请添加缺少的标签

标签: vba excel search wildcard


【解决方案1】:

如果你只是想知道字符串是否存在,你可以使用:

Dim found As Boolean
Dim searchString As String
searchString = shLook.Cells(i, 1).Value
If Left(searchString, 1) <> "?" Then searchString = "*" & searchString
If Right(searchString, 1) <> "?" Then searchString = searchString & "*"
found = shSource.Cells(rowSt, 18).Value Like searchString

如果您想知道字符串开始的位置,则需要在执行 Instr 之前去掉通配符:

If Found Then
    LPosition = InStr(shSource.Cells(rowSt, 18), Replace(Replace(searchString, "?", ""), "*", ""))
End If

注意:你不能只做第二部分而不做第一部分,因为在 "XYZABCIJK" 中搜索 "?ABC" 时会得到错误匹配。

【讨论】:

  • 哇,这很有帮助,谢谢!如果通配符位于搜索字符串的中间,例如,我如何调整@YowE3K 建议的上述代码。如果我有很长的车辆编号列表,我希望搜索字符串为:Vehicle_no_*_to_sell,而不是必须为每个车辆编号详细说明搜索字符串:Vehicle_no_1_to_sell Vehicle_no_2_to_sell Vehicle_no_3_to_sell 等
  • 你真的是在匹配开始的位置之后,还是只是想找出字符串是否“匹配”? "Vehicle_no_1_to_sell" Like "Vehicle_no_*_to_sell" 应该返回 True,所以代码的第一部分可以工作。找到位置会更困难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多