Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

Excel: Formatação Condicional Expandida

A formatação condicional permite-nos formatar uma ou mais células de acordo com um critério predefinido. Uma das limitações do Microsoft Excel é que a formatação condicional permite-nos apenas utilizar 3 condições e muitas vezes existe a necessidade de criar diversas formatações de acordo com diversos critérios.

No entanto é possível, com recurso ao VBA, criar a nossa própria formatação condicional aumentando o número de critérios de 3 para os que necessitarmos (sem limite definido).

Para efectuar esta formatação condicional deve-se fazer o seguinte:

1 - Seleccionar o menu Tools - Macro - Visual Basic Editor ou carregar em ALT+F11.

2 - No Editor, mais precisamente na janela de projecto, podemos seleccionar uma das Worksheets para que o código apenas funcione nela ou ThisWorkbook para que funcione em todas. Neste exemplo vamos seleccionar apenas uma Worksheet (Sheet1)
3 - Colocar o seguinte código no editor de código:


' Procedimento executado quando existe alguma alteração no valor da célula
Private Sub Worksheet_Change(ByVal Target As Range)

    ' Desabilita outros eventos para tornar mais rápido
    Application.EnableEvents = False

    ' Verifica se a célula está dentro da área escolhida
    If Not Intersect(Target, Me.[C2:C65536]) Is Nothing Then

        ' Verifica qual o valor e aplica uma formatação
        Select Case Target.Value
            Case 1
                Target.Interior.Color = vbRed
            Case 2
                Target.Interior.Color = vbYellow
            Case 3
                Target.Interior.Color = vbGreen
            Case 4
                Target.Interior.Color = vbBlue
            Case 5 To 10
                Target.Interior.Color = vbBlack
                Target.Font.Color = vbWhite
            Case "OK"
                Target.Interior.Color = vbMagenta
                Target.Font.Color = vbYellow
                Target.Font.Bold = True
            Case Else
                Target.Interior.Color = xlNone
                Target.Font.Color = vbBlack
                Target.Font.Bold = False
        End Select

    End If

    ' Reabilita os eventos
    Application.EnableEvents = True

End Sub


Neste exemplo vamos colocar algumas cores de fundo, mudar a cor de texto e estilo de texto para bolt (negrito) de acordo com diferentes critérios na coluna C.


PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

37 comentários:

Anónimo disse...

Muito bom, estava a uma semana tentando programar está macro e não conseguia.Parabens! Muito obrigado

Cláudio disse...

o código funcionou, mas detectei um problema que até o momento não consegui descobrir. depois de utilizado uma condição e o interior da célula se preenchida com a devida cor, ao deletar o conteúdo dessa célula ela assume a cor verde ao invés de simplesmente ficar sem preenchimento. se tiver uma resposta poste no blog por favor...obrigado.

jpaulino disse...

Olá Cláudio,

Pode substituir:
Target.Interior.Color = xlNone

Por:
Target.Interior.ColorIndex = 0

Leandro Barbosa disse...

Olá pessoal.
Parece que o problema que o pessoal teve foi o mesmo que estou tendo. Na verdade não entendo muito bem de VBA e por isso não consegui adaptar a macro para a minha planilha. Para eu tentar resolver esse meu problema, vocês poderiam disponibilizar a planilha aqui no forum para eu baixar?
Obrigado.
Abraços

Antonio Silva disse...

Olá jpaulino.

Muito legal, mas eu precisava que ele alterasse a cor da linha!
Tem como postar!
desde já obrigado

Antonio

Electro 99 disse...

E não será possivel colocar uma linha no programa dizendo algo como: "se o resultado da célula a2 for x, o conteúdo da célula b2 aparecerá a megrito"?

jpaulino disse...

Olá Electro 99,

Sim é possível, é apenas necessário fazer algo (dentro do evento Worksheet_Change):

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.[a2]) Is Nothing Then
If Target.Value = 123 Then
[b2].Font.Bold = True
Else
[b2].Font.Bold = False
End If
End If
End Sub


É isto ?

Anónimo disse...

Olá, a minha dúvida é um pouco diferente! Na verdade o que eu preciso é... exemplo:

Que qd eu digitar em A5 o número 1, o intervalo L5:O5 Altere a cor.
E assim sucessivamente, quando eu alterar A6, o intervalo L6:O6 altera a cor tb.

É possível fazer isso?

POR FAVOR PRECISO DE AJUDA! rs

Anónimo disse...

Estou com o mesma duvida do anonimo, EX: faço uma soma ente A1 + A2 e o resultado da soma é justamente onde precso utilizar a formatação condicional porém quando o resultado altera de acordo com a soma que faço o mesmo não assume a cor de fundo imposta na formatação condiciona

Lucas disse...

Estou com o mesma duvida do anonimo, EX: faço uma soma ente A1 + A2 e o resultado da soma é justamente onde precso utilizar a formatação condicional porém quando o resultado altera de acordo com a soma que faço o mesmo não assume a cor de fundo imposta na formatação condiciona

jpaulino disse...

Olá pessoal,

Peço desculpa por não responder mais cedo mas ... férias :)

De momento no meu PC não tenho o office 2000/2003 para mostrar um exemplo, porque estou a testar o Office 2010, mas podem fazer algo como assim: http://www.contextures.com/xlCondFormat02.html

Se não conseguirem digam que eu ainda esta semana coloco um exemplo em Excel 2003!

Um abraço,
Jorge Paulino

Lucas disse...

jpaulinho.....
O problema é que tenho mais que 5 formatações condicionais, quando utilizo a formatação condicional no VB ele da o problema que citei anteriormente isto é ele não altera altomaticamente quando o resultado sai de uma soma.

jpaulino disse...

Olá Lucas,

Desculpa mas não vi este comentário.

Conseguiste resolver ?

Cumprimentos,
Jorge Paulino

Ronalod Bastos disse...

Jorge,

Meu problema é o seguinte.
Numa planilha eu tenho linhas preenchidas de de A1 até Z500

Na coluna A1, o texto "a" que se repete várias vezes.
Gostaria que, sempre que o texto "a" aparecer, que fiquei pintado em amarelo a célula que contém "a" na colua A e suas células equivalentes em linha nas colunas P, R e S.
Tem como fazer?

Desde já, meus agradecimentos!

Ronaldo BAstos

jpaulino disse...

Olá Ronaldo,

Claro que dá para fazer, mas pode ser feito(pelo que entendi) com a formatação normal, sem VBA.

Pode mostrar um ficheiro de exemplo ?

Polen disse...

JPaulino, boa tarde!
Primeiro quero agradecer a excelente Macro.
Se possível gostaria de mais uma "dica".
A macro só funciona quando clico na célula. É possível ela "rodar" quando o valor da célula for alterado como resultdo de uma formula?
Ex: A1 = 2 e A2 = 3
A3 = A1 + A2
Logo A3 = 5
Se eu mudar A1 para 5
Logo A3 será 8
É possível executar a formatação condiconal nesta soma?

Desde já obrigado!

Polen

Ronaldo Bastos disse...

Jorge,

O problema é que eu tenho mais de 20 classificações diferentes e as celulas não são sequencias.
Tenho que ficar filtrando e pintando categoria por categoria...
Só o "case" para me salvar..mas eu preciso pintar colunas relacionadas também...

jpaulino disse...

Olá Ronaldo,

Podes mostrar um exemplo ?

Podes colocar a questão no fórum portugal-a-programar.org (secção de VBA) ou usando o email no fim do blog.

Um abraço!

Física - E.E.C.A./Itanhomi disse...

OLÁ PESSOAL SOU NOVO POR AQUI!
GOSTARIA ,SE POSSÍVEL, CONTAR COM A COLABORAÇÃO DE VOCÊS PARA A SEGUINTE DÚVIDA:
QUERO USAR A FORMATAÇÃO CONDICIONAL DA SEGUINTE FORMA:
-SE QUALQUER CÉLULA DO INTERVALO K10:Q15 TIVER VALOR IGUAL A QUALQUER CÉLULA DO INTERVALO E78:AI78, PREENCHA A(S) CÉLULA(S) COM A COR LARANJA, SE NÃO NÃO MODIFIQUE.

ABRAÇOS,

RANGEL

Física - E.E.C.A./Itanhomi disse...

MAS APENAS AS CÉLULAS DE VALORES COMUNS E QUE PERTENCEM A K10:Q15 DEVEM SER FORMATADAS!

Jorge Paulino disse...

OLÁ PESSOAL SOU NOVO POR AQUI!

Não é pessoal ... sou eu :)

Se possível coloque a questão aqui (secção VBA): http://www.portugal-a-programar.org/forum/index.php

Se conseguir mostrar um exemplo (ficheiro) era excelente!

Anónimo disse...

ALGUÉM CONHECE UMA MACRO QUE É CAPAZ DE FAZER UMA AUTO FORMA DO EXCELL SEMPRE ACOMPANHAR A CÉLULA QUE TEM O VALOR QUE EU QUERO?
NUM CALENDÁRIO ESCOLAR GOSTARIA QUE A FORMA ESTRELA OU SETA ( QUALQUER UMA) ACOMPANHE AS DATAS DE INÍCIOS E TÉRMINOS DOS BIMESTRES.
POIS DE UM ANO PARA OUTRO ESTES VALORES MUDAM DE CÉLULA E GOSTARIA QUE A FORMA ESTRELA (EXCELL--->INSERIR---> FORMA) ACOMPANHASSE ESTAS DATAS.
TENTEI INSERIR ÍCONES DO EXCELL MAS PERCEBI QUE NÃO DÁ PARA COLOCÁ-LO EM UMA ÚNICA CÉLULA SELECIONANDO UM INTERVALO DE CÉLULAS, O QUE RESOLVERIA MEU PROBLEMA. FORMATAÇÃO CONDICIONAL POR CORES JÁ NÃO RESOLVE MAIS O MEU PROBLEMA, POIS COINCIDEM A DATA DE INÍCIO DO ANO ESCOLAR COM O INÍCIO DO BIMESTRE (MESMA CÉLULA ).
O QUE EU GOSTARIA É O SEGUINTE: A CÉLULA DO MÊS DE FEVEREIRO QUE TIVER VALOR IGUAL AO DÁ CÉLULA L5, CARREGARÁ CONSIGO A AUTO FORMA ESTRELA E A CÉLULA DO MÊS DE ABRIL QUE TIVER O VALOR DA CÉLULA M62 PROCEDE DA MESMA MANEIRA. E DE MANEIRA SIMILAR PARA O INÍCIO E TÉRMINO DOS OUTROS TRÊS BIMESTRES ESCOLARES:
2 BIMESTRE INICIA NA CÉLULA QUE TIVER VALOR IGUAL L63 E TERMINA EM M63 , O TERCEIRO BIMESTRE INICIA NA CÉLULA NA CÉLULADE VALOR IGUAL A L64 E TERMINA NA CÉLULA QUE TIVER VALOR IGUAL A M64, E O QUARTO E ÚLTIMO BIMESTRE INICIA NA CÉLULA DO MÊS QUE TIVER VALOR(DATA) IGUAL AO DA CÉLULA L64 E TERMINA NA CÉLULA DO MÊS DE DEZEMBRO QUE TEM VALOR(DATA) IGUAL A VALOR DA CÉLULA M65. LOGO A FORMA ESTRELA DO EXCELL ACOMPANHARIA AS CÉLULAS QUE OS DOIS VALORES SÃO IGUAIS.
PODERIA SER O MESMO RACIOCÍNIO PARA IMAGEM, QUE SERIA BEM PEQUENA PARA INSERIR NA CÉLULA.

GRATO A TODOS,

RANGEL

sandro disse...

ola a todos sou novo por estas bandas e estou a adorar o site tenho uma questão que não consigo resolver e agradecia que me ajudassem no excel tenho uma celula(A1) onde estou sempre a inserir valores eu gostaria que quando inseri-se o valor fizesse enter a seleção fica-se nessa celula(a1). sei que tem uma opção no excel para fazer isso mas depois fica para o livro inteiro e eu só queria para a celula A1

Jorge Paulino disse...

Olá Sandro,

De uma forma simples, podes detectar quando o utilizador está na célula A1 e quando estiver desabilitas a movimentação com o ENTER.

Mais ou menos isto:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Not Intersect(Target, [a1]) Is Nothing Then
Application.MoveAfterReturn = False
Else
Application.MoveAfterReturn = True
End If

End Sub


Sempre que possível colocas as tuas questões no fórum Portugal a Programar

sandro disse...

Muito obrigada ajudas-te me imenso
mas só tenho um problema agora quando mudo de de folha com o alt TAB a função fica activa para as outras folhas se me pudesses ajudar agradecia imenso.

Jorge Paulino disse...

Olá sandro!

Colocaste no evento Worksheet_Change? Tens de mostrar o que tens ;)

Um abraço

Anónimo disse...

Boa tarde tenho uma planilha de excel. que é composta por 39 horarios, ou seja, 06:00 ; 06:30 e assim sucessivamente. isso na vertical e na horizontal tenho as localidades de desembarque, ou seja pelotas, p. novo, e assim sucessivamente, totalizando 14 pontos. como posso fazer para um aplanilha mediante codigos me demonstre em cores onde os passageiros estão subindo e descendo.tentei fazer na condicional mas não consegui.
antecipo agradecimentos

Física - E.E.C.A./Itanhomi disse...

Olá Pessoal!

Estou com um problema. No intervalo de L10:P15 gostaria de inserir um ícone da formatação condicional somente na célula cujo valor é igual ao de L5.
Mas, as outras células não podem ser formatadas.

Grato,

Rangel

Anónimo disse...

Jorge,

Coloquei no worksheet change o código de cases de 0 a 99 com cada cor diferente para teste, mas na planilha a cor que esta sendo pintada através do pincel fica diferente ao do vba, o que pode esta acontecendo? Poderia me ajudar por favor?

Obrigado.

Jorge Paulino disse...

Só mesmo vendo o código e/ou ficheiro com exemplo. Pode colocar a questão no fórum de VBA da comunidade Portugal-a-Programar?

Anónimo disse...

tem como colocar mais de um select case nesa função, exemplo quero fazer uma formatação condicional no intervalo A:A (um conjunto de condições e case is), quero fazer uma formatação condicional no intervalo B:B (outro conjunto de condições e case is)

Anónimo disse...

Olá.

Esse código funciona bem se o usuário digitar cada célula separadamente.

Porém, comandos em área, como apagar todas as células, ou autopreencher um grupo de células com o mesmo valor, não funcionam (A macro entra em depuração).

Como fazer para que esse código funcione para grupos de células?

Anónimo disse...

Boa tarde,

Acredito que seja uma necessidade incluir na formatação condicional que se utiliza de setas coloridas (para cima=verde; para baixo=vermelho; no meio=amarelo) a possibilidade de existirem setas vermelhas para cima e verdes para baixo. Será possível criar esse modelo?
Marcelo Senna.

Compartilhe o conhecimento. disse...

Bom dia estou precisando de uma ajuda. Tenho uma planilha com vários valores, não sequenciais. Preciso que quando eu lançar um valor repetido ele seja receba uma formatação especifica, diferente de outro número repetido que eu venha cadastrar. Exemplo: o número da célula A1 é igual ao da célula A5 (célula fica verde - as duas) // A3 é igual ao da célula A7 (célula fica laranja - as duas) é possível isso? os números a lançar é algo parecido com 50600.01245/2013-52 números de processos. Obrigado!

Anónimo disse...

Olá pessoal,

Estou precisando de uma ajuda...
Tenho uma planilha que utilizei algumas fórmulas básicas de multiplicação, todas as células são multiplicadas por J2 ou I2.
Eu quero colorir as células que contenham a fórmula com J2 de uma cor e as que contenham a I2 de outra cor. Até dei uma estudada no VBA, mas como não entendo muito, não estou conseguindo.

Obrigada.

Anónimo disse...

Entrei no blog por acaso e gostei muito. Queria uma ajuda. Quero fazer um bolão na mega da virada escolhendo as dezenas de acordo com os resultados anteriores. Nas células a1:f6 tenho o resultado de determinado concurso e nas células a3:j8 as dezenas da mega numeradas de 1 a 60. Queria colorir as células que coincidissem com os valores constantes em a1:f6.
Ex.: a1=2, b1=4, c1=15, d1=31, e1=40 e f1=42. Seriam coloridas as celulas b3, d3, e4, a6, j6, b7. Abraço

Proms disse...

Olá! sou novo aqui e preciso de uma ajuda!
preciso usar o case para me chamar uma macro sempre que o valor de uma celula for alterada.
ex: tenho: "A1:C1" preciso que no intervalo destas celulas ao ser altearado algum valor executa uma macro que eu especificar, seja se eu alterar a celula A1, executa uma macro, e se altear valor da celula B1 ou C1 executa uma macro que eu especificar. alguem me ajuda ai??? agradeço...

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico