TL; DR: возможно ли удалить определенный текст в ячейке, основываясь на его цвете, не теряя остальное форматирование другого содержимого ячейки. До сих пор любое рабочее решение может удалять специально окрашенный текст, но удаляет оставшееся форматирование.


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

31029 - Control [RED - bolded]
67934 - Control [BLUE]
41235 - Control [BLACK]
64304 - Action [GREEN - bolded]
69056 - Control [BLACK]

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

Что мне нужно сделать, это удалить все blue (RGB(0,0,139)) элементы из каждой ячейки, но сохранить оставшееся содержимое и форматирование.

Это возможно?

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

Я также попробовал несколько решений VBA от Stackoverflow, но я не могу заставить его работать. Я также попытался удалить Pilcrow, используя функцию SUBSTITUTE в Excel, но он все равно удаляет оставшееся форматирование.

Мне повезло с «методом удаления персонажей», подробно описанным в этом ответе MrExcel. Https://www.mrexcel.com/forum/excel-questions/677646-delete-text-within-cell-specific-color-retain-formatting -remaining-text.html Однако по какой-то причине после того, как я изменил код с colorindex на цветной RGB-формат и ввел мои диапазоны, он удалил часть синего текста, но не весь. Похоже, что синий текст оставлялся, когда ячейки содержали много символов (возможно, больше, чем те переменные vba, с которыми можно иметь дело?

1 ответ1

0

Это предполагает, что

  • каждая строка в ячейке имеет одинаковый color и характеристики bold
  • Данные для обработки находятся в столбце А

Алгоритм:

  • Получить диапазон для тестирования
  • Разделите содержимое ячейки с помощью vbLf в качестве разделителя
  • Создайте класс, включающий текстовую строку, жирность и цвет
  • сохраните каждый экземпляр класса в коллекцию, за исключением случаев, когда у него есть цвет, который нужно удалить.
  • пересоздайте текст ячейки без соответствующей строки и отформатируйте данные ячейки построчно, как оригинал

Переименование модуля класса : cLineData

Public pText As String
Public pBold As Boolean
Public pColor As Long
Public pLength As Long

Обычный модуль

Option Explicit
Sub DeleteColoredLine()
    Dim cLD As cLineData, Coll As Collection
    Dim wsSrc As Worksheet
    Dim R As Range, C As Range, V As Variant, W As Variant
    Dim lineNum As Long, charPos As Long, I As Long

Set wsSrc = Worksheets("sheet4")
With wsSrc
    Set R = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With

For Each C In R
    Set Coll = New Collection
    V = Split(C.Text, vbLf)
    For lineNum = 0 To UBound(V)
        Set cLD = New cLineData
            charPos = charPos + Len(V(lineNum)) + 1 'include newline character
        cLD.pText = V(lineNum)
        cLD.pLength = Len(cLD.pText)
        With C.Characters(charPos - 1, 1).Font 'last printed character in line
            cLD.pBold = .Bold
            cLD.pColor = .Color
        End With

        'Check for color to be removed
        If Not cLD.pColor = RGB(0, 112, 192) Then _
            Coll.Add cLD
    Next lineNum

'Create the new string
    I = 0
    ReDim V(0 To Coll.Count - 1)
    For Each cLD In Coll
        V(I) = cLD.pText
        I = I + 1
    Next cLD
    C.Offset(0, 1).Value = Join(V, vbLf)

'Format the lines
    charPos = 1
    With C.Offset(0, 1)
        For Each cLD In Coll
            With .Characters(charPos, cLD.pLength).Font
                .Bold = cLD.pBold
                .Color = cLD.pColor
            End With
            charPos = charPos + Len(cLD.pText) + 1 '+1 to include newline character
        Next cLD
    End With
Next C

End Sub

Обратите внимание, что,

  • другие характеристики форматирования могут быть добавлены к тесту класса для проверки и / или воспроизведения
  • мой синий (код RGB) немного отличается от вашего голубого
  • Этот макрос помещает результаты в соседний столбец. Вы также можете перезаписать исходный столбец или скрыть его.

На приведенном ниже снимке экрана столбец A - это оригинал, столбец B - результат запуска вышеуказанного макроса.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .