Destacar a linha selecionada alterando a cor de fundo

Escrito por: Reinaldo Coral Em 4 - outubro - 2008

Esse código destaca toda a linha onde há a célula ativa no momento, alterando sua cor de fundo. Toda vez que uma célula receber o foco, a linha toda ficará realçada e ao sair dela, voltará ao normal.

Um detalhe, é que, foi criada uma condição para excluir as linhas cuja formatação de fundo não poderia ser alterada, como por exemplo, uma linha que contenha um título e já esteja com um padrão de fundo definido de forma diferenciada.

Vamos ao código.

No módulo de classe da Plan1, declare, na seção Geral do mesmo, a variável LinhaSelecAnterior, pois ela ficará acessível a toda a Plan1.

Digite o seguinte código:

Dim LinhaSelecAnterior As Range
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 
    Select Case ActiveCell.Row
 
        Case 1, 2
            'Coloque neste 'case' as linhas que não devem ser
            'destacadas na seleção
            'Exemplo: Linhas de título; Aqui eu defini como as linhas 1 e 2

            'Remove cor de fundo da linha selecionada anteriormente
            Select Case LinhaSelecAnterior.Row
 
                Case Is <> 1, 2
 
                    Rows(LinhaSelecAnterior.Row).Interior.ColorIndex = 0
 
                End Select
 
        Case Else
 
            'Altera a cor de fundo da linha selecionada
            Rows(ActiveCell.Row).Interior.ColorIndex = 15
 
            'Remove a cor de fundo quando a linha perde a seleção
            If Not LinhaSelecAnterior Is Nothing Then
 
                'Verifica se a linha atual já estava selecionada
                'neste momento, caso seja uma nova linha selecionada
                'remove a cor de fundo.
                If ActiveCell.Row <> LinhaSelecAnterior.Row Then
 
                    Rows(LinhaSelecAnterior.Row).Interior.ColorIndex = 0
 
                End If
 
            End If
 
            'Inicializa a variavel informando a seleção atual
            'que será utilizada no inicio do procedimento
            'como sendo a seleção anterior
            Set LinhaSelecAnterior = ActiveCell
 
    End Select
 
End Sub

Salve e Encerre o ambiente do VBA

Pronto. Agora quando você selecionar qualquer célula da Plan1, a linha inteira será destacada das demais.

Um abraço a todos.

Termos aprendidos neste artigo:

Range Retorna um objeto Range representando uma única célula ou um intervalo de células.
ActiveCell Retorna um objeto Range representando a célula ativa da janela ativa (a janela visível) ou da janela especificada. Se a janela não estiver exibindo uma planilha, essa propriedade falhará. Somente leitura.
Row Retorna o número da primeira linha da primeira área do intervalo. Long somente leitura.
Rows Para um objeto Application, retorna um objeto Range representando todas as linhas da planilha ativa. Se o documento ativo não for uma planilha, a propriedade Rows falhará. Para um objeto Range, retorna um objeto Range representando as linhas no intervalo especificado. Para um objeto Worksheet, retorna um objeto Range representando todas as linhas da planilha especificada. Objeto Range somente leitura.
Interior Retorna um objeto Interior representando o interior do objeto especificado.
ColorIndex Retorna ou define a cor interna. A cor é especificada como um valor de índice na paleta de cores atual.
Worksheet_SelectionChange O Evento SelectionChange ocorre quando a seleção é alterada em uma planilha.
Bookmark and Share

17 Comentários

  1. Sebastião Martins Disse,

    Olá amigo (a),

    a macro acima não funcionou, copiei e colei mas nada aconteceu.

    Preciso de um comando um pouco mais simples: após digitas um valor em uma célula e perder foco, a outra célula é atualizada automaticamente (ex. digito “SP” na célula A1 e aparece “São Paulo” na célula A2. Você poderia me ajudar?
    Grato, Sebastião Martins

    Reply

    exceldoseujeito Reply:

    Crie uma lista com os Estados e suas siglas em uma outra planilha, Plan2, por exemplo. Com isso, você poderá deixá-la oculta porque só interessará ao funcionamento da fórmula, ninguém mais precisa visualizá-la, Ok.
    Crie uma tabelinha como esta:

    Abreviação Estado Capital
    AC Acre Rio Branco
    AL Alagoas Maceió
    AM Amazonas Manaus
    AP Amapá Macapá
    BA Bahia Salvador
    CE Ceará Fortaleza
    DF Distrito Federal Brasília
    ES Espírito Santo Vitória
    GO Goiás Goiânia
    MA Maranhão São Luís
    MG Minas Gerais Belo Horizonte
    MS Mato Grosso do Sul Campo Grande
    MT Mato Grosso Cuiabá
    PA Pará Belém
    PB Paraíba João Pessoa
    PE Pernambuco Recife
    PI Piauí Teresina
    PR Paraná Curitiba
    RJ Rio de Janeiro Rio de Janeiro
    RN Rio Grande do Norte Natal
    RO Rondônia Porto Velho
    RR Roraima Boa Vista
    RS Rio Grande do Sul Porto Alegre
    SC Santa Catarina Florianópolis
    SE Sergipe Aracaju
    SP São Paulo São Paulo
    TO Tocantins Palmas

    Na célula A2, digite a fórmula:

    =ÍNDICE(Plan2!A1:C28;CORRESP(B2;Plan2!A1:A28;0);2)

    Pronto. Vou postar este exemplo no blog, ok.
    Qualquer dúvida, visite-nos.
    Um abraço.

    Reply

    Comentário feito em abril 21st, 2009 às 0:51

  2. Michel Disse,

    Olá, a macro comigo tamebm nao funcionou, elá me da o seguinte erro:O obejeto é obrigatorio e me aponta para linha : “If Not LinhaSelecAnterior Is Nothing Then” . Voce poderia me ajudar ? Desde já agradeço.

    Reply

    Comentário feito em novembro 5th, 2009 às 16:44

  3. Fernando Disse,

    Cara colaboradores esse codigo é muito bom pra mim que trabalho bastante com o excel só que
    se eu tive uma linha com cor de fundo esse codigo tira porque as minhas paln. são marcadas com fundo

    com resolver isso.

    grato,

    Fjss

    Reply

    Reinaldo Coral Reply:

    Você deve readaptar o código como descrito abaixo. Não otimizei ele pois o tempo está muito corrido… mas a lógica está toda aí.

    Abração.

    Option Explicit

    Public INT_BG_CEL_SELECIONADA As Integer
    Public wsSelecaoEvidencia As Worksheet
    Public LinhaSelecAnterior As Range
    Public iCorAnterior As Integer

    Sub LimparSelecao()
    On Error GoTo Erro

    'Remove a cor de fundo quando a linha perde a seleção
    If Not LinhaSelecAnterior Is Nothing Then
    LinhaSelecAnterior.Interior.ColorIndex = iCorAnterior
    Set wsSelecaoEvidencia = Nothing
    End If

    Exit Sub
    Erro:
    MsgBox Err.Description
    Exit Sub
    End Sub

    Private Sub Worksheet_Activate()
    On Error GoTo Erro

    Call LimparSelecao

    Exit Sub
    Erro:
    MsgBox Err.Description
    Exit Sub
    End Sub

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    On Error GoTo Erro

    INT_BG_CEL_SELECIONADA = 44

    'Remove a cor de fundo quando a linha perde a seleção
    If Not LinhaSelecAnterior Is Nothing Then
    LinhaSelecAnterior.Interior.ColorIndex = iCorAnterior
    End If

    If Target.Cells.Count = 1 Then
    Select Case Target.Column
    Case 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 'A até J
    If Target.Row >= 10 And Target.Row = 25 And Target.Row = 15 And Target.Row <= 25 Then
    'Remove a cor de fundo quando a linha perde a seleção
    If Not LinhaSelecAnterior Is Nothing Then
    LinhaSelecAnterior.Interior.ColorIndex = iCorAnterior
    End If

    Set LinhaSelecAnterior = Target

    'Altera a cor de fundo da linha selecionada
    iCorAnterior = Target.Interior.ColorIndex
    Target.Interior.ColorIndex = INT_BG_CEL_SELECIONADA
    Set wsSelecaoEvidencia = ActiveSheet
    End If
    End Select
    End If

    Exit Sub
    Erro:
    MsgBox Err.Description
    Exit Sub
    End Sub

    Reply

    Comentário feito em novembro 28th, 2009 às 16:03

  4. Luiz Disse,

    Adorei este código, só que quando saio de uma célula selecionada que estava colorida, ela perde a cor. Gostaria de saber se tem como fazer algum ajuste neste código para não mudar a cor anterior.

    Reply

    Reinaldo Coral Reply:

    Olá…. respondido no comentário anterior (mesma dúvida do Fernando)

    Reply

    Comentário feito em novembro 29th, 2009 às 12:41

  5. Eder Cunha Disse,

    Olá Reinaldo, gostei muito do codigo que vc postou e como eu não sou expert no assunto, gostaria de saber como faço para deixar a linha preenchida somente até a coluna D?

    Valeu cara, Obrigado!!!

    Eder Cunha

    Reply

    Reinaldo Coral Reply:

    Oi Eder,

    Podes substituir os comandos

    Rows(ActiveCell.Row).Interior.ColorIndex = [número da cor]

    Por

    Range(“A” & ActiveCell.Row & “:D” & ActiveCell.Row).Interior.ColorIndex = [número da cor]

    No seu caso, por exemplo, da coluna A até a coluna D:

    Range(“A” & ActiveCell.Row & “:D” & ActiveCell.Row).Interior.ColorIndex = 15

    Um abraço.

    Reply

    Eder Cunha Reply:

    Muito Obrigado pela atenção, fiz o que vc mandou e está dando erro de compilação e os dois pontos antes da
    letra D ( “:D” ) fica selecionado, como se não fosse para ele estar ali, o que será que eu fiz errado?

    Obrigado Reinaldo!!!

    No aguardo!!!

    Eder Cunha

    Reply

    Reinaldo Coral Reply:

    Acredito que você tenha copiado o código (Ctrl+C) e colado(Ctrl+V) no VBA.
    Isso carrega a codificação web para o ambiente de texto puro. A codificação das aspas (“”) não é transformada de maneira correta.
    Tente redigitar, manualmente, todas as aspas das linhas copiadas. Deve corrigir isto.

    Abraço

    Eder Cunha Reply:

    Legal, agora funcionou, eu tinha copiado e colado, não deu certo, dai eu digitei tudo o que vc escreveu e
    funcionou, vai entender né??
    Valeu mesmo!!!
    Eu sei que vc está com o tempo muito curto, mas se vc puder me dar uma dica, eu peguei o comando que vc
    enviou para o Fernando (para que a cor de fundo não fosse substituida) e mesclei junto com o programa
    inicial mas não funcionou, se vc não conseguir responder por falta de tempo não tem problema não pq isso é´
    só um detalhe.
    Desde já agradeço!!
    Eder Cunha

    Reinaldo Coral Reply:

    O ideal é que você substitua por completo o código anterior, a princípio, por você não conhecer muito o VBA.

    Acredito que não tenha funcionado por uma linha de comando que você deve substituir deste código:
    Onde está escrito:

    If Target.Row >= 10 And Target.Row = 25 And Target.Row = 15 And Target.Row <= 25 Then

    Substitua por:

    If Target.Row >= 10 And Target.Row <= 25 Then

    Explicando um pouco:
    Na linha de comando Case 1,2,3,4,… você pode definir as colunas que serão afetadas pelo código.
    Na linha de comando If Target.Row >= 10 And Target.Row <= 25 Then você pode definir as linhas que serão afetadas pelo código.

    Espero ter ajudado.
    Abraço

    Comentário feito em janeiro 29th, 2010 às 10:23

  6. Eder Cunha Disse,

    Puts.. se ajudou?
    Ajudou e muito!!
    Valeu mesmo, deu tudo certo, Muitissimo Obrigado!!!

    Eder Cunha

    Reply

    Comentário feito em fevereiro 1st, 2010 às 11:39

  7. Eder Cunha Disse,

    Reinaldo, só mais uma pergunta, eu sei que isso pra vc deve ser a coisa mais simples do mundo, mas como eu estou começando a “fussar” no VB agora, este codigo que vc escreveu para manter a cor da linha após mudar de celula ativa, ela funcionou com a dica que vc passou..

    “Substitua por:

    If Target.Row >= 10 And Target.Row <= 25 Then"
    A pergunta é:
    Somente a celula ativa muda a cor, como faço para mudar as celulas da coluna A até a D?
    Prometo que não te importuno mais!!!! rsrsrs
    Muito obrigado!!

    Eder Cunha

    Reply

    Reinaldo Coral Reply:

    Substituir

    Target.Interior.ColorIndex = INT_BG_CEL_SELECIONADA

    Por:

    Range(“A” & Target.Row & “:D” & Target.Row).Interior.ColorIndex = INT_BG_CEL_SELECIONADA

    Abraço

    Reply

    Comentário feito em fevereiro 2nd, 2010 às 9:33

  8. Eder Cunha Disse,

    Reinaldo, através da dica que vc passou acima..

    Substituir

    Target.Interior.ColorIndex = INT_BG_CEL_SELECIONADA

    Por:

    Range(“A” & Target.Row & “:D” & Target.Row).Interior.ColorIndex = INT_BG_CEL_SELECIONADA

    A linha mudou de cor da coluna A até a D, perfeito!!
    Dai surgiu um problema, quando a linha ficava perdia a seleção, as colunas de B até C ficavam coloridas, dai eu substitui o comando…

    Set LinhaSelecAnterior = Target

    por

    Set LinhaSelecAnterior = Range(“A” & Target.Row & “:D” & Target.Row)

    e funcionou perfeitamente!!!

    É isso que acontece quando a dica é bem especificada e simplificada!!

    Valeu mesmo!!!
    Obrigado!!

    Eder Cunha

    Reply

    Comentário feito em fevereiro 18th, 2010 às 8:53

Deixar um comentário

Get Adobe Flash playerPlugin by wpburn.com wordpress themes