Usuário com melhor resposta
Formatação condicional - vários valores de comparação

Pergunta
-
Olá!
Tenho uma planilha onde possuo 3 colunas de valores de referência (A, B e C), sendo que não existe um padrão entre eles (ou seja, a ordem crescente e decrescente entre eles é aleatória) e o terceiro valor o usuário tem a opção de modificar.
Quando insiro o dado na coluna de resultados, preciso que ele verifique o segunte:
- Se o valor for um número, deixar negrito. Se contiver qualquer caractere que não seja um número, deixar normal;
Após isso, se o valor for maior ou igual a qualquer um dos valores de referência, a célula deve ser preenchida com a cor correspondente ao maior valor de referencia ultrapassado.
O problema é que, como não existe um padrão nos valores de referência, não da pra colocar uma ordem de prioridade para a formatação condicional. O resultado é que, mesmo que o valor seja superior a "B", por exemplo, ele fica com a cor de "C", pois a prioridade de "C" é mais alta (B > C neste caso).
Tentei estudar um pouco de macro e VBA, mas meu conhecimento é muito restrito pra fazer algo assim.
Se alguem puder me ajudar, agradeço.
Obrigado
Respostas
-
Private Sub Worksheet_Change(ByVal Target As Range) Const clngColunas As Long = 3 Dim rng As Range Dim rngValores As Range Dim lngCol As Long If Intersect(Target, Columns("D")) Is Nothing Then Exit Sub Application.EnableEvents = False 'Se o valor for um número, deixar negrito. If IsNumeric(Target) = True Then If Target = 0 Then Target.Font.Bold = False Target.Interior.ColorIndex = -4142 Else Target.Font.Bold = True Set rngValores = Cells(Target.Row, "A").Resize(, clngColunas) For lngCol = 1 To clngColunas If Target >= WorksheetFunction.Large(rngValores, lngCol) Then Set rng = rngValores.Find(WorksheetFunction.Large(rngValores, lngCol)) Target.Interior.Color = rng.Interior.Color Exit For End If Next lngCol End If Else Target.Font.Bold = False End If Application.EnableEvents = True End Sub
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
- Sugerido como Resposta Felipe Costa GualbertoMVP, Moderator quarta-feira, 1 de janeiro de 2014 00:09
- Marcado como Resposta Felipe Costa GualbertoMVP, Moderator quarta-feira, 1 de janeiro de 2014 00:09
Todas as Respostas
-
Estou assumindo que a coluna de resultados é a coluna C.
Cole o código abaixo na classe da planilha em que deseja que esse efeito ocorra:
Private Sub Worksheet_Change(ByVal Target As Range) Dim rng As Range Dim lngLin As Long If Intersect(Target, Columns("C")) Is Nothing Then Exit Sub Application.EnableEvents = False 'Se o valor for um número, deixar negrito. If IsNumeric(Target) = True Then Target.Font.Bold = True 'Se o valor for maior ou igual a qualquer um dos 'valores de referência, a célula deve ser preenchida 'com a cor correspondente ao maior valor de 'referencia ultrapassado. lngLin = Target.Row If Target >= WorksheetFunction.Max(Cells(lngLin, "A") _ , Cells(lngLin, "B")) Then Set rng = Cells(lngLin, "A").Resize(, 2).Find( _ WorksheetFunction.Max(Cells(lngLin, "A"), Cells(lngLin, "B"))) Target.Interior.Color = rng.Interior.Color End If Else 'Se contiver qualquer caractere que não seja 'um número, deixar normal. Target.Font.Bold = False End If Application.EnableEvents = True End Sub
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
- Editado Felipe Costa GualbertoMVP, Moderator quarta-feira, 27 de março de 2013 22:06
-
Ajudou bastante, mas ainda não é o que eu preciso.
Fiz o teste aqui e o problema é o seguinte:
A coluna "A" possui valor de "200" e a "B" possui valor "100". Quando coloco o valor de "101" na coluna "C", a coluna não é preenchida com a cor de "B". Porém, quando coloco valor de "201", ela é preenchida com a cor de "A".
As mudanças que eu precisaria seriam as seguintes:
- É necessario mais uma coluna de valores referenciais (coluna "C"), que será preenchida pelo usuario. A coluna que será pintada de acordo com o valor será a coluna "D";
- Quando o valor for maior ou igual a um valor de referencia (coluna A, B ou C), ela deve ser preenchida pela cor. Quando mudar o valor pra um novo, ela deve ser preenchida novamente (ou seja, se eu coloco "0" ou deixo em branco, ela deveria ficar branca)
Desde já agradeço a disponibilidade!
- Editado Mizuzin quinta-feira, 28 de março de 2013 13:08
-
Private Sub Worksheet_Change(ByVal Target As Range) Const clngColunas As Long = 3 Dim rng As Range Dim rngValores As Range Dim lngCol As Long If Intersect(Target, Columns("D")) Is Nothing Then Exit Sub Application.EnableEvents = False 'Se o valor for um número, deixar negrito. If IsNumeric(Target) = True Then If Target = 0 Then Target.Font.Bold = False Target.Interior.ColorIndex = -4142 Else Target.Font.Bold = True Set rngValores = Cells(Target.Row, "A").Resize(, clngColunas) For lngCol = 1 To clngColunas If Target >= WorksheetFunction.Large(rngValores, lngCol) Then Set rng = rngValores.Find(WorksheetFunction.Large(rngValores, lngCol)) Target.Interior.Color = rng.Interior.Color Exit For End If Next lngCol End If Else Target.Font.Bold = False End If Application.EnableEvents = True End Sub
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
- Sugerido como Resposta Felipe Costa GualbertoMVP, Moderator quarta-feira, 1 de janeiro de 2014 00:09
- Marcado como Resposta Felipe Costa GualbertoMVP, Moderator quarta-feira, 1 de janeiro de 2014 00:09
-
Puxa vida! Ficou ótimo! Muito Obrigado! Porém, faltou apenas uma coisa pra eu marcar como resposta:
Quando eu insiro um valor menor que o menor valor de referencia, a celula tbm precisa ficar em branco:
A = 100
B = 200
C = 300
qndo eu insiro 100, ele pinta. Se eu inserir 99, ele deve ficar em branco, assim como ele fica em branco se deletar o valor ou inserir "0"
A celula tbm precisa voltar a ser branca quando for inserido algum valor não numérico
Novamente, obrigado pela disponibilidade
EDIT:
Fazendo mais testes na planilha com o código, percebi que, se eu copio e colo valores nessa coluna "D", o codigo só funciona se eu colar apenas 1 valor. Se eu faço com 2 ou mais, ele simplesmente cola o valor sem aplicar a formatação desejada.
Não sei se é possível, mas uma outra opção seria que, em vez da formatação ocorrer logo após o momento de inserção do valor, ela ocorrer na coluna "D" de uma vez só após apertar um botão.
EDIT2:
Tive um erro aqui, chamado: "Erro em tempo de execução '1004', não é possivel obter a propriedade Large da classe WorksheetFunction"
Tal erro ocorre toda vez que eu coloco um valor na coluna "D", sendo que não existe valor nas colunas "B" ou "C". Não necessariamente eu terei 3 valores para comparação, às vezes terei apenas 1 ou 2 e deixarei os outros em branco ou com valores não numéricos.
- Editado Mizuzin segunda-feira, 1 de abril de 2013 16:08