【问题标题】:Find word in part of cell text, return column number: Excel VBA在部分单元格文本中查找单词,返回列号:Excel VBA
【发布时间】:2017-04-26 17:20:14
【问题描述】:

我的目标是在 Excel 的用户表单中实现搜索功能。

它应该能够获取在TextBox 中输入的单词并遍历特定行中的每一列并搜索该单词。然后它应该返回第一次发现它的列。

使用下面的代码,它只会查看与单元格内容完全匹配的内容。但是,如果单元格值是例如:“Lorem ipsum,dolor sitamet” - 我希望能够搜索“dolor”。

这是我的代码:

Dim rFind As Range     
With Range("D1:D100")
    Set rFind = .Find(What:=TextBox13.Value, LookAt:=xlWhole, MatchCase:=False, SearchFormat:=False)
    If Not rFind Is Nothing Then
        MsgBox rFind.Column
        MsgBox rFind.Row
    End If
End With

【问题讨论】:

  • 只需将LookAt:=xlWhole 更改为LookAt:=xlPart...
  • xlWhole 更改为xlPart。 (这很容易通过搜索来搜索,例如excel vba find 并查看第一个结果,使用宏记录器更容易找到。)
  • @YowE3K 你太马虎了,Wolfie 打败了你 ;)
  • @RuediSpring - 下次发帖前请先做一些简单的研究

标签: vba excel


【解决方案1】:

只需将LookAt:=xlWhole 更改为LookAt:=xlPart

文档:Range.Find Method (Excel)


您也可以使用 & 符号 (&) 来整理返回的结果,它连接字符串:

"Col: " & rFind.Column & ", Row: " & rFind.Row
' For example, gives the string "Col: 1, Row: 1" if found in A1

您说您要在“特定行中的每一列”中进行搜索,但您正在查看“特定列中的前 100 行”?!不确定这是拼写错误还是您的代码错误。无论哪种方式,您都可以使用 RowsColumns 对象。这些应该与您的范围完全限定一起使用,即说明它在哪里。

ThisWorkbook.Sheets("Sheet1").Rows(1)      ' Range of entire first row
ThisWorkbook.Sheets("Sheet1").Columns(1)   ' Range of entire first column
ThisWorkbook.Sheets("Sheet1").Columns("A") ' Equivalent, range of entire first column

重写:

Dim rFind As Range     
With ThisWorkbook.Sheets("Sheet1").Columns("D")
    Set rFind = .Find(What:=TextBox13.Value, LookAt:=xlPart, MatchCase:=False, SearchFormat:=False)
    If Not rFind Is Nothing Then
        MsgBox "Col: " & rFind.Column & ", Row: " & rFind.Row
    End If
End With

【讨论】:

    【解决方案2】:

    部分

    LookAt:=xlWhole
    

    应该是

    LookAt:=xlPart
    

    【讨论】:

      【解决方案3】:

      看起来你想检查每个单词 - 这会做到这一点:

      Sub Check()
      Dim vWords As Variant
      Dim sCheck As String
      Dim rFind As Range
      Dim i As Long
      
      sCheck = "Lorem ipsum, dolor sitamet" ' TextBox13.Value
      sCheck = Replace(sCheck, ",", "")
      
      vWords = Split(sCheck, " ")
      
      For i = 0 To UBound(vWords)
          With Range("D1:D100")
              Set rFind = .Find(What:=Trim(vWords(i)), LookAt:=xlPart, MatchCase:=False, SearchFormat:=False)
              If Not rFind Is Nothing Then
                  MsgBox rFind.Column
                  MsgBox rFind.Row
              End If
              Set rFind = Nothing
          End With
      Next
      
      End Sub
      

      【讨论】:

      • 笔记杰里米,我不认为 OP 要求搜索字符串中的每个单词,他只是说他希望 .Find 处理任何单词 within i> 字符串。另外顺便说一句,您不需要Set rFind = Nothing,因为如果无论如何都找不到字符串,.Find 会返回Nothing :)
      • @Wolfie 你是对的 - 我误解了 OP 正在寻找什么(因此我认为每次迭代都需要将 rFind 设置为空)
      • 即使你正在循环,将rFind 设置为Nothing 对你的代码没有影响,因为它在下一个循环中无论如何都会改变。没关系或改变代码的工作方式,只是想我会尝试帮助..
      • @Wolfie 但如果您没有清除 rFind 值,If Not rFind Is Nothing Then... 参数将不正确,因为它会从上一次迭代中获取值
      • 这就是我要指出的,它不会!当您拨打Set rFind = .Find(...) 时,您会收到rFind = NothingrFind = some range.Find 函数将总是更改rFind 的值。也许我不清楚,请参阅文档 (here) -“如果找不到匹配项,此方法将返回 Nothing”
      【解决方案4】:

      代码更新:对于所有 cmets, 1.增加了xlPart 2. 只执行了一次搜索,

      现在,如果你能升级我。

      最简单的代码 - 根据您选择的范围 - Range("D1:D100"),您只能找到值存在的行号。为了也能找到列号,请扩大您的范围。

      就是这样-

      Sub find_code()
      Dim add As String
      
      On Error Resume Next
      add = Range("D1:D100").Find(TextBox1.Text, Lookat:=xlPart, MatchCase:=False).AddressLocal
      
      If Err.Number <> 0 Then
      MsgBox "Empty Search result", vbInformation
      Exit Sub
      End If
      
      MsgBox Range(add).Row
      MsgBox Range(add).Column
      
      End Sub
      

      【讨论】:

      • 这不是一个好主意,因为如果找不到文本,它将崩溃,因为查找将返回 Nothing 并且您正在请求它的 Row。这就是 OP(正确)使用 If Not rFind Is Nothing 逻辑的原因。
      • 无论如何,搜索两次需要两倍的时间。也是个坏主意!
      • 而且它只会使用xlPart,前提是 OP 在他们之前的 Find 上使用过。 (最好指定搜索是在 xlPart 还是 xlWhole 上,因为 Excel 会记住最后的设置。)
      • 您的编辑是一个改进,但不是很好。您现在可能仍然会导致错误,但忽略它。如前所述,这比像 OP 那样正确处理它更糟糕。此外,“最简单的代码”现在看起来比原始代码更复杂,只需要更改 5 个字符...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 2015-11-02
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      相关资源
      最近更新 更多