Есть ли простой способ поиска определенного слова в ячейке?
По причинам, которые здесь не нужно добавлять, у меня есть электронная таблица Excel 2007, которая содержит текст в нескольких ячейках. Текст в этих ячейках варьируется от менее 100 слов до почти 500 в некоторых случаях. Время от времени мне нужно находить одно слово в некоторых из этих ячеек.
Раньше я только сканировал ячейку своим глазом после использования функции поиска в Excel, чтобы определить, какие ячейки содержат слово. Делая это, я задался вопросом, может ли быть более эффективный способ сделать это. Я также начал задаваться вопросом, насколько более утомительным и подверженным ошибкам этот метод может быть, если я работаю с ячейками, которые содержат еще больше текста. Есть ли какой-нибудь простой способ провести поиск в ячейке, другими словами, не прибегая к какой-либо сложной формуле или использованию VBA?
Конечно, я мог бы просто скопировать и вставить текст в документ Word и точно указать слово с помощью сочетания клавиш CTRL+F в Word, но есть ли простой способ простого поиска и идентификации определенного слова в ячейке в Excel? Я вставил визуальное изображение для вас ниже:
В ячейке, которую вы видите выше, я выделил слово "dispuestos" после сканирования этой ячейки своим глазом. Есть ли способ легко сделать то же самое с помощью функции поиска в Excel? Например, в таблице Word я знаю, что использование клавиши табуляции может переводить меня из ячейки в ячейку, но если я хочу перейти в ячейку, я просто нажимаю CTRL+TAB. Есть ли подобная техника, которую я могу использовать для поиска в ячейке Excel? Есть ли что-то, что мне нужно изменить в настройках Excel, чтобы это произошло?
1 ответ
Я думаю, что единственный способ - это VBA, поэтому я нарушил правила написания макроса (... извините) для вас, который может достичь этого быстро. Он будет окрашивать каждое вхождение поискового запроса оранжевым и сообщать вам, сколько вхождений он находит. Вы можете создать ярлык к нему, например, CTRL+SHIFT+F (как специальный CTRL+F).
Кстати, он работает так же, как CTRL + F, что касается выбора. То есть, если выбрана только одна ячейка, тогда она ищет весь лист... но если выбран диапазон ячеек, то он проверяет только этот конкретный диапазон, как обычная функция Find.
Вот пример результата:
А вот и 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 = ""
строка к [например] strSearch = "apples"
, Вы все еще можете перезаписать его при запуске.