有没有什么简单的方法可以在单元格内搜索特定的单词?

有没有什么简单的方法可以在单元格内搜索特定的单词?

由于这里无需补充的原因,我有一个 Excel 2007 电子表格,其中包含多个单元格中的文本。这些单元格中的文本范围从少于 100 个字到在某些情况下接近 500 个字。每隔一段时间,我需要找到一个词在其中一些细胞内。

以前,我使用 Excel 的搜索功能缩小包含该单词的单元格范围后,只是用眼睛扫描单元格。在这样做的时候,我开始思考是否有更有效的方法来实现这一点。我还开始思考,如果我处理的单元格包含更多的文本,这种方法可能会变得更加繁琐和容易出错。 有没有简单的方法可以在单元格内进行搜索,换句话说,无需借助某些复杂的公式或使用 VBA?

当然,我可以简单地将文本复制并粘贴到 Word 文档中,然后通过 Word 中的 CTRL+F 精确定位单词,但有没有一种简单的方法可以在 Excel 单元格中搜索和识别特定单词?我在下面为您粘贴了一张图:


在您上面看到的单元格中,我用眼睛扫描该单元格后突出显示了单词“dispuestos”。有没有办法使用 Excel 搜索功能轻松地执行相同操作?例如,在 Word 表格中,我知道使用 Tab 键可以将我从一个单元格带到另一个单元格,但如果我想在单元格内跳转,我只需按 CTRL+TAB。是否有某种类似的技术可用于在 Excel 单元格内搜索?我需要在 Excel 选项中更改某些内容才能实现此目的?

答案1

我认为唯一的方法是 VBA,所以我打破规则为您编写了一个宏(...抱歉),可以快速实现这一点。它会将搜索词的每个出现都涂成橙色,并告诉您它找到了多少次出现。您可以为其创建一个快捷方式,如 CTRL+SHIFT+F(就像特殊的 CTRL+F)。

顺便说一句,就选择而言,它的作用与 CTRL+F 相同。也就是说,如果只选择一个单元格,那么它会搜索整个工作表……但如果选择了单元格范围,那么它只会检查该特定范围,就像常规的“查找”功能一样。

以下是示例结果:

在此处输入图片描述

这是 VBA:

Sub findPaintString()
    Dim values As Range
    Dim LastRow As Long, LastCol As Integer

    myName = "Find+Paint String"

    'We'll work like the normal Find/Replace function which looks at the selected range...
    Set values = Selection

    '...if the selected range is one cell then we look at the entire worksheet (within the used range):
    If values.Cells.Count = 1 Then
        LastRow = Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
        LastCol = Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByColumns).Column
        Set values = Range(Cells(1, 1), Cells(LastRow, LastCol))
    End If

    'Set a suggested/default search query if you repeatedly search the same word:
    strSearch = ""

    'Get the string to paint:
    theString = CStr(InputBox("Enter the string you want to paint" & vbNewLine & "(not case sensitive):", myName, strSearch))
    If theString = "" Then Exit Sub

    'Set the colour to paint occurrences:
    theColour = 1137094

    'Make a log of occurrences:
    foundLog = 0

    'Work through each cell in range, searching for the string and painting it:
    For Each cell In values
        'Check if our string is somewhere in the cell - if not then ignore it:
        If InStr(LCase(cell.Value), LCase(theString)) Then
            matchLog = 0 'match success log (increments by 1 per character)
            j = 1 ' string character selector
            For i = 1 To cell.Characters.Count
                If LCase(Mid(cell.Value, i, 1)) = LCase(Mid(theString, j, 1)) Then
                    matchLog = matchLog + 1 '+1 to matchlog
                    j = j + 1 '+1 to string character selector
                    If matchLog = Len(theString) Then
                        'we have found the full word, so paint it:
                        cell.Characters(i - Len(theString) + 1, Len(theString)).Font.Color = theColour
                        j = 1 'reset string character ready for next use
                        matchLog = 0 'reset matchLog ready for next use
                        foundLog = foundLog + 1
                    End If
                Else
                    'reset matchLog and string character selector:
                    matchLog = 0
                    j = 1

                    'see if this cell character (which didn't match the string character that we
                    'got up to) matches the first string character:
                    If LCase(Mid(cell.Value, i, 1)) = LCase(Mid(theString, j, 1)) Then
                        matchLog = matchLog + 1
                        j = j + 1
                    End If
                End If
            Next i
        End If 'in string
    Next cell

    'Tidy data for message box:
    If Len(theString) > 20 Then theString = Left(theString, 16) & "..."
    If foundLog = 0 Then
        foundLog = "0"
        theS = "s"
    ElseIf foundLog = 1 Then
        theS = ""
    Else
        theS = "s"
    End If
    MsgBox "Found " & foundLog & " occurrence" & theS & " of '" & theString & "'.", vbOKOnly, myName
End Sub

确实如此区分大小写。要使其区分大小写,请删除 的四个实例LCase()

如果你经常搜索相同的字符串,那么将行改为strSearch = ""[for example] strSearch = "apples"。你仍然可以在启动时覆盖它。

相关内容