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. |
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
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.
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.
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
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
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.
Olá…. respondido no comentário anterior (mesma dúvida do Fernando)
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
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.
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
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
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
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
Puts.. se ajudou?
Ajudou e muito!!
Valeu mesmo, deu tudo certo, Muitissimo Obrigado!!!
Eder Cunha
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
Substituir
Target.Interior.ColorIndex = INT_BG_CEL_SELECIONADA
Por:
Range(“A” & Target.Row & “:D” & Target.Row).Interior.ColorIndex = INT_BG_CEL_SELECIONADA
Abraço
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
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?
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ç
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
No código tem uma condicional restritiva para este caso.
No exemplo, eu defini as linhas 1 e 2 para não serem afetadas pela macro. Inclua as linhas que você desejar nesta mesma linha de código.
Abç
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
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ç
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?
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ç
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.
Muito bom!
Parabéns pela excelente dica…
ola tem como deixar essa ação salva? ou toda vez que eu abrir o excel tenho que adicionar o codigo vba.
Oi Rogério.
Essa macro fica salva com o arquivo sim. Não é necessário repetir o processo de inclusão do código VBA.
Abraço
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.
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.