由于这里无需补充的原因,我有一个 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"
。你仍然可以在启动时覆盖它。