выделить цветом слово внутри ячейки Excel, слова которые нужно найти и выделить предварительно нужно вписать в отдельный столбик(красный,зеленый,сини

я простой пользователь, мне нужна помощь в следующем вопросе. в Excel я создаю файл в котором есть текст и цифры, мне нужно чтобы некоторые слова в тексте были выделены красным, зеленым и синим цветом (только слова внутри ячейки не весь текст). я хотел бы чтобы в определенной колонке я мог добавлять все слова которые должны быть выделены красным цветом, в соседней колонке другой список слов которые будут выделяться зеленым цветом и третий столбик - сюда добавляю слова которые в основном тексте будут выделяться синим цветом.

то есть:

создать три столбика (колонки) куда буду добавлять нужные мне слова на основании п.1 в основном тексте слова из списков будут выделяться определенным цветом Заранее благодарю за помощь.


Ответы (2 шт):

Автор решения: rotabor

Вот макрос, который раскрашивает слова в активной ячейке. Он даже меньше, чем комментарии к вашему вопросу.

Sub ColorizeWords()
  Dim i As Integer, j As Integer, k As Integer, l As Integer
  Dim w As String, m As Integer, c() As Variant
  Dim lj As Long, mj As Long
  c = Array(0, -16776961, -11489280, -4165632)
  mj = Columns(1).Rows.Count
  For i = 1 To 3
    lj = Cells(1, i).End(xlDown).Row
    If lj < mj Then
      For j = 2 To lj
        w = " " & Cells(j, i) & " "
        m = Len(w)
        k = 1
        l = InStr(k, ActiveCell, w)
        While l > 0
          ActiveCell.Characters(Start:=l + 1, Length:=m - 2).Font.Color = c(i)
          k = l + m
          l = InStr(k, ActiveCell, w)
        Wend
      Next
    End If
  Next
End Sub

введите сюда описание изображения

Для макроса слово - это последовательность символов за исключением пробела, ограниченная пробелами. Поэтому макрос не найдёт слова в начале и в конце текста, где нет пробела с одной из строн; он не найдёт слова, ограниченные знаками препинания и другими символами. Над усовершенствованием макроса в этом плане вы можете подумать самостоятельно.

Усовершенствовал макрос. Цвета с верхней левой ячеки, произвольное количество, заголовки должны быть раскрашены в нужный цвет, обрабатывает все выделенные ячейки.

Sub ColorizeWords()
  Dim c As Integer, r As Integer, i As Integer, m As Integer
  Dim w As String, cc As Range, color As Long
  Dim lr As Long, mr As Long, mc As Long
  mr = Columns(1).Rows.Count
  mc = Cells(1, 1).End(xlToRight).Column
  If mc = Rows(1).Columns.Count Then mc = 1
  For Each cc In Selection.Cells
    For c = 1 To mc
      color = Cells(1, c).Font.color
      lr = Cells(1, c).End(xlDown).Row
      If lr < mr Then
        For r = 2 To lr
          w = " " & Cells(r, c) & " "
          m = Len(w)
          i = InStr(cc, w)
          While i > 0
            cc.Characters(Start:=i + 1, Length:=m - 2).Font.color = color
            i = InStr(i + m, ActiveCell, w)
          Wend
        Next
      End If
    Next
  Next
End Sub
→ Ссылка
Автор решения: Алексей Р

Решение на базе регулярных выражений. На тестовых примерах корректно отрабатывает границы слов, которые могут быть отделены друг от друга не только пробелами, но и знаками препинания, небуквенными символами. Казалось бы, поставил \b вокруг подстроки и все дела. Но VBA RegEx не так [как хотелось бы] определяет границы слов для русских букв и не понимает просмотра назад, поэтому пришлось немного нагородить.

Option Explicit

Sub PaintText()
    If IsEmpty(ActiveSheet.Range("A1")) Then Exit Sub ' если в "таблице цветных подстрок" пусто, то сразу выходим
    ActiveCell.Font.color = vbBlack
    Dim txt, cl, substr, len_sub, color, RegEx, res, match
    
    Set RegEx = CreateObject("VBScript.RegExp")
    With RegEx
        .Global = True
        .IgnoreCase = True
        .MultiLine = True
    End With
    
    txt = ActiveCell    'вносим текст в переменную, чтобы минимизировать количество операций чтения ячейки
    For Each cl In ActiveSheet.Range("A1").CurrentRegion ' забираем связный диапазон, содержащий A1
        substr = cl.Text ' забирает из ячейки видимый текст, даже текст ошибок типа #ДЕЛ/0!
        len_sub = Len(substr)
        If len_sub Then
            color = cl.Font.color
            RegEx.Pattern = "(?:[^\wа-яА-ЯёЁ]|^)(" & substr & ")(?=[^\wа-яА-ЯёЁ]|$)"
            Set res = RegEx.Execute(txt)
            If res.Count > 0 Then
                For Each match In res
                    ActiveCell.Characters(match.firstindex + 1 + IIf(match.firstindex = 0, 0, 1), len_sub).Font.color = color
                Next
            End If
        End If
    Next
End Sub

введите сюда описание изображения

→ Ссылка