É possível remover caracteres específicos de uma célula com base na cor e reter a formatação?

0

TL; DR: É possível remover texto específico em uma célula, com base em sua cor, sem perder a formatação remanescente do conteúdo de outras células. Até agora, qualquer solução de trabalho pode remover texto especificamente colorido, mas retira a formatação restante.

Recentemente, herdei uma planilha grande e, em uma seção, há células que têm quebras de linha com várias linhas de texto em cada caixa. A pessoa anterior que gerenciava a planilha coloria cada linha de acordo com o status de cada item. Um exemplo é abaixo (colchetes indica a cor em que cada linha é formatada, por favor, note também que deve haver uma quebra de linha após cada item).

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

Existem várias colunas (e muitas linhas) dos dados semelhantes às acima (ou seja, uma coluna para o membro da equipe atribuído a cada ação, uma para descrição e outra para status), porém cada uma segue o mesmo formato de codificação de cores. p>

O que eu preciso fazer é excluir todos os blue (RGB(0,0,139)) itens de cada célula, mas manter o conteúdo restante e a formatação.

Isso é possível?

Antes de enviar esta pergunta, eu tentei várias soluções, como este no superusuário onde a informação é copiada em word e depois volta para excel. Isso funciona para mim, exceto quando eu removo os pilcrows no excel, toda a formatação restante é removida (embora eu possa usar o Word para remover o texto em azul).

Eu também tentei várias soluções VBA do Stackoverflow, mas parece que não consigo funcionar. Eu também tentei remover o Pilcrow usando a função SUBSTITUTE no Excel, mas ainda retira a formatação restante.

Eu tive um pouco de sorte com o método Delete dos 'Caracteres' detalhado nesta resposta do MrExcel

    
por Graphene 04.05.2018 / 02:07

1 resposta

0

Isso pressupõe que

  • cada linha na célula tem as mesmas características color e bold ness
  • Os dados a serem processados estão na Coluna A

Algoritmo:

  • Obter o intervalo a ser testado
  • Divida o conteúdo da célula com vbLf como o delimitador
  • Crie uma turma com a sequência de texto, negrito e cor
  • salva cada instância da classe em uma coleção, exceto se tiver a cor a ser excluída.
  • recrie o texto da célula sem a linha relevante e formate os dados da célula linha por linha como o original

Módulo de turma Renomear: cLineData

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

Módulo regular

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

Note que,

  • outras características de formatação podem ser adicionadas ao teste de classe para testar e / ou reproduzir
  • my blue (código RGB) é um pouco diferente de seu azul
  • Esta macro coloca os resultados na coluna adjacente. Você também pode optar por substituir a coluna original ou ocultá-la.

Na captura de tela abaixo, a coluna A é o original, a coluna B é o resultado da execução da macro acima.

    
por 06.05.2018 / 21:52