none
Formatação condicional - vários valores de comparação RRS feed

  • 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

    quarta-feira, 27 de março de 2013 21:12

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

    sexta-feira, 29 de março de 2013 15:29
    Moderador

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


    quarta-feira, 27 de março de 2013 22:06
    Moderador
  • 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
    quinta-feira, 28 de março de 2013 12:49
  • 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

    sexta-feira, 29 de março de 2013 15:29
    Moderador
  • 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
    segunda-feira, 1 de abril de 2013 12:07