Notifications
Clear all

Tentar por Vba. Tabela azul não funciona

13 Posts
2 Usuários
0 Reactions
3,453 Visualizações
(@ilbeh-morais)
Posts: 51
Trusted Member
Topic starter
 

Bom dia

Não queria retornar ao fórum para pedi mais do mesmo, mas infelizmente vou ocupar de novo a bondade e o tempo do JValq, mas não tem outro jeito. Separei as tabelas na tentativa de fazer a tabela azul funcionar a contento não deu certo. Por algum motivo, o resultado vai parar na tabela vermelha, mesmo excluindo o change e o código da vermelha, então separei as tabelas na tentativa de fazer a azul funcionar e... nada. Outra coisa, as tabelas ficam "frente a frente" 1ª linha da vermelha de frente a 1ª linha da azul. Se puder solucionar, agradeço.

 
Postado : 24/01/2012 8:41 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite,

Alterei o código e coloquei os comentários para facilitar o entendimento:

Sub Azul()
        Dim Intervalo As Range
        Dim Coluna1 As Range
        Dim Celula As Range
        Dim i As Integer
        Dim QtdeAzul As Integer
        Dim QtdeVermelho As Integer
        Dim QtEnc As Integer
       
        Application.ScreenUpdating = False
       
        QtdeVermelha = [AM2].Value
        QtdeAzul = [AM3].Value
       
        Set Intervalo = [BQ5:AN41084]
        Set Coluna1 = [AN5:AN41084]
       
        With Intervalo.Font
            .ColorIndex = 15
            .Bold = False
        End With
       
        For Each Celula In Coluna1
            Celula.Select
            QtEnc = 0
            While ActiveCell.Value = 1 And Not Application.Intersect(ActiveCell, Intervalo) Is Nothing
                QtEnc = QtEnc + 1
                'Como a Coluna de referência está à direita é necessário alterar este trecho do código
                'ActiveCell.Offset(-1, -1).Select
                'Para
                ActiveCell.Offset(-1, 1).Select
                'A sintaxe de Offset é a seguinte: Offset(linha, coluna)
                'No caso a macro subia uma linha (linha: -1) à esquerda (coluna: -1)
                'pois a coluna estava à direita. Como, agora, a coluna está à esquerda
                'a macro vai continuar subindo a linha (-1), porém à direita (coluna:1)
            Wend
            If QtEnc = QtdeAzul Then
                For i = 1 To QtdeAzul
                    'Aqui vai funcionar no sentido inverso, portanto
                    'ActiveCell.Offset(1, 1).Select
                    'precisa ser alterado para
                    ActiveCell.Offset(1, -1).Select
                    
                    'A constante não é vbazul e sim vbBlue
                    ActiveCell.Font.Color = vbBlue
                    ActiveCell.Font.Bold = True
                Next
            End If
        Next
       
        For Each Celula In Coluna1
            Celula.Select
            QtEnc = 0
            While ActiveCell.Value = 1 And Not Application.Intersect(ActiveCell, Intervalo) Is Nothing
                QtEnc = QtEnc + 1
                'Aqui o mesmo raciocínio
                'ActiveCell.Offset(1, -1).Select
                ActiveCell.Offset(1, 1).Select
            Wend
            If QtEnc = QtdeVermelho Then
                For i = 1 To QtdeVermelho
                    'Idem
                    'ActiveCell.Offset(-1, 1).Select
                    ActiveCell.Offset(-1, -1).Select
                    Application.ScreenUpdating = True
                    
                    'A constante da cor vermelha é vbRed
                    ActiveCell.Font.Color = vbRed
                    ActiveCell.Font.Bold = True
                Next
            End If
        Next
        'É recomendável que se ative novamente a atualização de tela
        Application.ScreenUpdating = True
    End Sub

Espero que ajude.

Abraço

 
Postado : 24/01/2012 5:57 pm
(@ilbeh-morais)
Posts: 51
Trusted Member
Topic starter
 

Boa noite
Um fórum que tem um JValq, é um fórum vencedor. Rapaz, pense numa pessoa iluminada, dedicada e competente? Deu muito certo, a planilha tá voando baixo.
Meu muito obrigado.
abraço

 
Postado : 24/01/2012 9:03 pm
(@ilbeh-morais)
Posts: 51
Trusted Member
Topic starter
 

Bom dia

JValq, existe alguma maneira de incrementar uma rotina para deixar a macro mais rápida no processamento e também quando deleta o valor já pesquisado. Ex.: Pedi apenas uma pesquisa de 13 elementos (leva um tempos considerável para o processamento) processou tudo certinho, Ok. Quando é deletado o 13...

QtdeVermelha = [x].Value
QtdeAzul = [x].Value

Abraço

 
Postado : 27/01/2012 3:53 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia,

O objetivo de "Application.ScreenUpdating = False", no início é justamente esse, não atualizar a tela para a macro ficar mais rápida.
O evento "Change" executa a macro com qualquer alteração nas células de quantidade e não sei se é isso que você quer realmente.
Normalmente, costumo usar um botão de comando para executar a macro, em vez de deixar da forma como está, por que mesmo ao apagar um valor a macro é executada.

Abraço

 
Postado : 27/01/2012 6:08 am
(@ilbeh-morais)
Posts: 51
Trusted Member
Topic starter
 

Bom dia
É exatamente do jeito que foi estruturada que interessa, o Change estar correto, é desse jeito mesmo. Só achei que podia haver uma maneira que, ao ser executada e depois apagado o valor já encontrado, esse procedimento ficasse mais rápido. A maneira escolhida de inserir um valor e a macro procurar se faz necessário porque uso muitos valores diferentes para encontrar o que preciso.

 
Postado : 27/01/2012 8:09 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde,

A macro vai procurar em cerca de 40.000 linhas as sequencias de "1" nas diagonais, portanto vai demorar mais ou menos a mesma coisa.
O que pode ser feito é dividir a macro em duas: uma para procurar a quantidade azul e outra para a vermelha, portanto ao ser alterada a célula de quantidades, apenas uma cor vai ser procurada.
Além disso pode ser alterado o evento "Change" para que quando uma célula de quantidade for apagada a macro não seja executada.
Não sei se é isso que você quer...

Abraço

 
Postado : 27/01/2012 2:19 pm
(@ilbeh-morais)
Posts: 51
Trusted Member
Topic starter
 

Boa noite

Fiz a alteração da "Change" como recomendou mas alguma coisa deu errado, estou tentando dividir em quatro mas dar erro de compilação, posso enviar a planilha para você corrigir?

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$AR$3" Then Vermelho
If Target.Address = "$AR$4" Then Vermelho
If Target.Address = "$AZ$3" Then Azul
If Target.Address = "$AZ$4" Then Azul
End Sub

 
Postado : 27/01/2012 5:00 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite,

Acho que, talvez, você precise de 4 macros:

Azul1 (Formata sequencia azul na planilha azul);
Azul2 (Formata sequencia vermelha na planilha azul);
Vermelho1 (Formata sequencia azul na planilha vermelha);
Vermelho2 (Formata sequencia vermelha na planilha vermelha).

O código do evento "Change" seria algo como:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$AR$3" And [AR3].Value <> "" Then Vermelho1
    If Target.Address = "$AR$4" And [AR4].Value <> "" Then Vermelho2
    If Target.Address = "$AZ$3" And [AZ3].Value <> "" Then Azul1
    If Target.Address = "$AZ$4" And [AZ4].Value <> "" Then Azul2
End Sub

Fiz as macros Azul1 e Azul2, aí é só adaptar as outras:

'Procura a sequencia de "1" e formata para AZUL na planilha AZUL
Sub Azul1()
        Dim Intervalo As Range
        Dim Coluna1 As Range
        Dim Celula As Range
        Dim i As Integer
        Dim QtdeAzul As Integer
        Dim QtdeVermelho As Integer
        Dim QtEnc As Integer
       
        Application.ScreenUpdating = False
       
        QtdeAzul = [AM3].Value
       
        Set Intervalo = [BQ5:AN41084]
        Set Coluna1 = [AN5:AN41084]
       
        With Intervalo.Font
            .ColorIndex = 15
            .Bold = False
        End With
        
        For Each Celula In Coluna1
            Celula.Select
            QtEnc = 0
            While ActiveCell.Value = 1 And Not Application.Intersect(ActiveCell, Intervalo) Is Nothing
                QtEnc = QtEnc + 1
                'Como a Coluna de referência está à direita é necessário alterar este trecho do código
                'ActiveCell.Offset(-1, -1).Select
                'Para
                ActiveCell.Offset(-1, 1).Select
                'A sintaxe de Offset é a seguinte: Offset(linha, coluna)
                'No caso a macro subia uma linha (linha: -1) à esquerda (coluna: -1)
                'pois a coluna estava à direita. Como, agora, a coluna está à esquerda
                'a macro vai continuar subindo a linha (-1), porém à direita (coluna:1)
            Wend
            If QtEnc = QtdeAzul Then
                For i = 1 To QtdeAzul
                    'Aqui vai funcionar no sentido inverso, portanto
                    'ActiveCell.Offset(1, 1).Select
                    'precisa ser alterado para
                    ActiveCell.Offset(1, -1).Select
                    
                    'A constante não é vbazul e sim vbBlue
                    ActiveCell.Font.Color = vbBlue
                    ActiveCell.Font.Bold = True
                Next
            End If
        Next
       
        'É recomendável que se ative novamente a atualização de tela
        Application.ScreenUpdating = True
    End Sub

'Procura a sequencia de "1" e formata para VERMELHO na planilha AZUL
Sub Azul2()
        Dim Intervalo As Range
        Dim Coluna1 As Range
        Dim Celula As Range
        Dim i As Integer
        Dim QtdeAzul As Integer
        Dim QtdeVermelho As Integer
        Dim QtEnc As Integer
       
        Application.ScreenUpdating = False
       
        QtdeVermelho = [AM2].Value
       
        Set Intervalo = [BQ5:AN41084]
        Set Coluna1 = [AN5:AN41084]
       
        With Intervalo.Font
            .ColorIndex = 15
            .Bold = False
        End With
       
        For Each Celula In Coluna1
            Celula.Select
            QtEnc = 0
            While ActiveCell.Value = 1 And Not Application.Intersect(ActiveCell, Intervalo) Is Nothing
                QtEnc = QtEnc + 1
                'Aqui o mesmo raciocínio
                'ActiveCell.Offset(1, -1).Select
                ActiveCell.Offset(1, 1).Select
            Wend
            If QtEnc = QtdeVermelho Then
                For i = 1 To QtdeVermelho
                    'Idem
                    'ActiveCell.Offset(-1, 1).Select
                    ActiveCell.Offset(-1, -1).Select
                    Application.ScreenUpdating = True
                    
                    'A constante da cor vermelha é vbRed
                    ActiveCell.Font.Color = vbRed
                    ActiveCell.Font.Bold = True
                Next
            End If
        Next
        'É recomendável que se ative novamente a atualização de tela
        Application.ScreenUpdating = True
    End Sub

Só falta acertar os endereços, pois não estou com a planilha aqui, pois era AM2 e AM3 e você colocou, agora, AR3, AR4, AZ3 e AZ4.

Abraço

 
Postado : 27/01/2012 6:29 pm
(@ilbeh-morais)
Posts: 51
Trusted Member
Topic starter
 

Boa noite

Meus sinceros agradecimentos mais uma vez, pelo pronto atendimento a minha solicitação. Vou fazer as alterações e retorno com o resultadoA.

Abraço
ilbeh

 
Postado : 27/01/2012 6:51 pm
(@ilbeh-morais)
Posts: 51
Trusted Member
Topic starter
 

Boa noite

Alguma coisa não saiu como deveria, segui as orientações mas... No anexo vai a planilha de trabalho (devido ao tamanho, foi reduzida a metade) com as macros. Inseri uma função que peguei aqui no fórum para somar os valores formatados (vermelhos e azuis).

 
Postado : 27/01/2012 10:43 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde,

O que não saiu como deveria?
Uma diferença é que a macro azul formata tudo para cinza e mudar as sequencias encontradas para azul e a vermelha faz o mesmo para a cor vermelha, portanto o resultado final vai apresentar células com valores em cinza e azul ou em cinza e vermelho, portanto nunca cinza, azul e vermelho.

Abraço

 
Postado : 28/01/2012 11:42 am
(@ilbeh-morais)
Posts: 51
Trusted Member
Topic starter
 

Boa noite

Depois de tantas idas e vindas vou ficar uns tempos afastado do fórum por força de motivo maior, deixo aqui meus agradecimento ao fórum e especialmente ao JValq pela paciência e vontade de ajudar.

Abraço

 
Postado : 28/01/2012 8:57 pm