Destacar a linha selecionada alterando a cor de fundo

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.
Escrevi outro artigo sobre um efeito legal para suas planilhas, leia e aprenda como fazer um efeito zebrado em suas planilhas, de maneira automática, ou seja, se você excluir ou adicionar mais linhas, não perderá a formatação, sempre terá uma linha de cor diferente da linha anterior.
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.

31 comentários em “Destacar a linha selecionada alterando a cor de fundo”

  1. 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

    Responder
    • 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.

      Responder
  2. 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.

    Responder
  3. 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

    Responder
    • 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

      Responder
  4. 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.

    Responder
  5. 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

    Responder
    • 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.

      Responder
      • 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

        Responder
        • 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

          Responder
        • 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

          Responder
          • 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

  6. 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

    Responder
  7. 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

    Responder
  8. Olá,
    É uma excelante dica. Porém, quando eu a uso, se clico em uma célula na planilha e copio os dados para colar em outro local, esta função “zera” a área de transferência. Quer dizer, quando vou colar, não tem nada para colar. Isso tem jeito?

    Responder
    • Geovane,
      Infelizmente neste código não tem jeito. Pela macro que é executada para mover-se pelas células e colorir os intervalos, o clipboard é esvaziado.
      Seria necessário implementações, levando em consideração, necessidade de interação com os usuários.
      Abrç

      Responder
  9. olá Reinaldo por favor preciso de uma pequena ajuda se possivel, já alterei a cor de uma linha selecionada, mas tenho algumas linhas já marcadas com outra cor e nao queria que fossem apagadas quando a linha selecionada passa por cima por favor como fazer isto
    muito obrigado
    santos

    Responder
  10. Olá,
    Gostaria de saber como fazemos para mudar a cor de uma linha somente até a última coluna da tabela (descontando as colunas não nulas).
    Diferentemente da dúvida do Éder Cunha, no meu caso, não conheço até onde pode ir a tabela (que, para ele, ia até a coluna D), pois, em cada planilha, temos tabelas distintas e a linha que preciso é escolhida a partir de uma busca por .find pelo nome no início da linha que pode estar mesclado à linha de baixo.
    Por exemplo, como pintar de amarelo a seguinte tabela: http://lc4.in/6hZ5 quando eu digito “Mercado do Zé” na busca.
    Muito Obrigado

    Responder
    • Marlon,
      Para descobrir a última coluna da planilha, você pode usar:
      Ex:
      Plan1.Range(“A1”).SpecialCells(xlLastCell).Column
      Quanto a pintar as linhas tendo células mescladas na 1a. coluna de critério, você terá de trabalhar com blocos de loop para percorrer as células das linhas da tabela para fazer comparações e então pintá-las caso atenda as necessidades. Escrevi um pequeno exemplo que pode te ajudar.
      Sub PintarLinhasDaBusca()
      Dim bCriterioEncontrado As Boolean
      Dim bCelulaMesclada As Boolean
      Dim sCriterio As String
      sCriterio = “Mercado do Zé” ‘Aqui é o critério, no seu caso, vem pela pesquisa
      bCriterioEncontrado = False
      bCelulaMesclada = False
      With Plan1 ‘A planilha contendo a tabela
      For i = 2 To 10 ‘Percorre as linhas da tabela
      If .Cells(i, 1) = sCriterio Then
      bCriterioEncontrado = True
      bCelulaMesclada = .Cells(i, 1).MergeCells
      ‘Pinta as linhas
      .Cells(i, 2).Interior.ColorIndex = 6
      .Cells(i, 3).Interior.ColorIndex = 6
      Else
      If bCriterioEncontrado = True Then
      If bCelulaMesclada = True Then
      If .Cells(i, 1) = “” Then
      ‘Pinta as linhas
      .Cells(i, 2).Interior.ColorIndex = 6
      .Cells(i, 3).Interior.ColorIndex = 6
      Else
      bCriterioEncontrado = False
      End If
      End If
      End If
      bCelulaMesclada = .Cells(i, 1).MergeCells
      End If
      Next i
      End With
      End Sub

      Abç

      Responder
  11. Reinaldo,
    se possivel, tenho tabela(plan1) com hyperlink q abre uma outra tabela(plan2), qndo eu clicar no hiperlink pinte a celula da tabela(plan2) selecionada. é possivel?

    Responder
    • Igor,
      Você pode definir uma rotina para pintar a célula ativa na chamada Private Sub Worksheet_Activate da plan2, por exemplo.
      Acesse o módulo avançado do VBA (ALT+F11). Clique duas vezes na Plan2, na aba Projeto VBA_Project e insira o código:
      Private Sub Worksheet_Activate()
      ActiveCell.Interior.ColorIndex = 6
      End Sub

      Abç

      Responder
  12. Ola pessoal, vi uns exemplos de como marcar a linha e a coluna na planilha, e estou precisando de um ajuda de voces. Eu tenho um planilha que tem 18 colunas e 155 linhas, as 4 primeiras linhas não podem ser limpas e nem mudadas as cores. Eu preciso fazer assim Ex: Quando eu clico na celula G12 a linhas ate A1 fique selecionada de um cor (tipo amarelo) e tambem fica colorido ate a coluna G5. fiz uma imagem do jeito que eu preciso, http://img440.imageshack.us/img440/523/tabelaexcel.jpg. Obrigado e aguardo respostas.

    Responder
  13. Olá amigo, aqui não funcionou. Minha planilha funciona como banco de dados e eu uso o control+l para localizar o registro. Uso Office 2007 / Win 7 32bits.

    Responder
    • Olá Anderson, tudo bem?
      Não há problema algum nas configurações. Pode ser que você não tenha escrito os códigos no módulo correto. Este código deve ser inserido na classe da própria planilha que está sua base, ok!
      Não sei se é isso, é apenas uma idéia do que possa ser, pois você não descreveu o erro que ocorreu.
      Um abraço.

      Responder

Deixe um comentário