Notifications
Clear all

Gerar uma tabela invertida espelhada de uma outra

20 Posts
3 Usuários
0 Reactions
2,491 Visualizações
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Tudo bem pessoal?

A partir de uns dados que vou recebendo no decorrer do dia, preciso gerar uma outra tabela onde as mesmas informações são exibidas, porém ao contrário (de ponta cabeça), sempre com a última linha aparecendo no topo, e os dados antigos não fossem deletados, mas sim fossem sendo movidos (empurrados) para baixo

Exemplo em anexo

Detalhe: No exemplo, a tabela original (a da esquerda), já está pronta, mas os dados vão sendo recebidos, linha a linha esporadicamente

Poderiam me ajudar?

Obrigado

 
Postado : 07/02/2018 10:40 am
(@klarc28)
Posts: 971
Prominent Member
 

Estude laço de repetição:

https://www.youtube.com/results?search_query=vba+la%C3%A7o+de+repeti%C3%A7%C3%A3o

Estude como copiar dados de uma planilha para outra:

https://www.youtube.com/results?search_query=vba+copiar+dados+de+uma+planilha+para+outra

Exemplo:

Option Explicit

Sub teste()

Dim i As Long
Dim linha As Long
i = 1
For linha = Plan1.Range("A1").End(xlDown).Row To 1 Step -1

Plan2.Range("A" & i).Value = Plan1.Range("A" & linha).Value
i = i + 1
Next linha

End Sub
 
Postado : 07/02/2018 10:51 am
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Olá klarc28

Obrigado pela ajuda

Entendi que fez um laço de repetição For Next, assisti aos vídeos, muito esclarecedor

Era exatamente o que eu procurava

Porém preciso que isso fique rodando direto, pois novos dados vão chegando e sendo preenchidos indefinidamente

Por exemplo chegou ao 10 e parou, se eu digitar abaixo do 10, o 11 por exemplo ele não preenche a nova planilha a menos que eu mande executar novamente o código

Como faço pra que o código continue rodando, esperando para preencher novamente a cada novo dado inserido?

Obrigado

 
Postado : 08/02/2018 1:38 pm
gfranco
(@wzxnet7)
Posts: 653
Honorable Member
 

Boa tarde.
Veja se o que fiz te ajuda.

Resposta útil? Clique na mãozinha ao lado do botão Citar.

 
Postado : 08/02/2018 3:02 pm
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Bom dia wzxnet7

Exatamente o que precisava

Porém, teria como fazer via VBA?

Porque quando botei pra rodar aqui tem momentos que os valores falham depois corrige, depois falha de novo

Imaginei que seria por estar tendo muito processamento e a máquina que ela vai rodar é um tanto quanto fraquinha

Mas mesmo assim, valeu muito cara :D

 
Postado : 09/02/2018 5:38 am
(@klarc28)
Posts: 971
Prominent Member
 

Olá klarc28

Obrigado pela ajuda

Entendi que fez um laço de repetição For Next, assisti aos vídeos, muito esclarecedor

Era exatamente o que eu procurava

Porém preciso que isso fique rodando direto, pois novos dados vão chegando e sendo preenchidos indefinidamente

Por exemplo chegou ao 10 e parou, se eu digitar abaixo do 10, o 11 por exemplo ele não preenche a nova planilha a menos que eu mande executar novamente o código

Como faço pra que o código continue rodando, esperando para preencher novamente a cada novo dado inserido?

Obrigado

Arquivos anexos

 
Postado : 09/02/2018 5:52 am
gfranco
(@wzxnet7)
Posts: 653
Honorable Member
 

Bom dia.
Veja se ajuda:

Resposta útil? Clique na mãozinha ao lado do botão Citar.

 
Postado : 09/02/2018 6:14 am
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Bom dia.
Veja se ajuda:

Olá wzxnet7

Legal está funcionando em VBA, porém os novos dados chegam de fonte externa, não são lançados manualmente, então a planilha se atualiza sozinha indefinidamente

Vi no código que você usou Private Sub Worksheet_Change

Só que eu já uso nessa planilha uma outra rotina Private Sub Worksheet_Calculate, tentei colocar junto mas não funcionou a sua rotina, só a minha, e se mudar a sua pra Calculate, também não aceita

Então, qual o comando pra fazer chamar a sua rotina quando a minha rodar?

Quando é Sub, sei que o comando é Call

Mas aqui não consegui, dá esse erro: Erro de compilação: era esperado Identificador

Valeu!

 
Postado : 09/02/2018 11:21 am
gfranco
(@wzxnet7)
Posts: 653
Honorable Member
 

Boa tarde.
Imaginando que sua planilha original está com os dados alocados nas mesmas colunas do seu exemplo postado, ou seja, dados originais nas colunas "A:C", e que a planilha para ser trabalhada tenha o codename planilha1 (se não for, ajuste a planilha correta ) teste o seguinte:
Coloque esse código num módulo qualquer

 Sub Atualiza()
On Error GoTo ErroMatriz
Dim matriz() As Variant
Dim Rmatriz() As Variant
Dim ulinhas(1 To 3) As Variant
Dim maiorLinha As Long
Dim linmatriz As Long
Dim wkf As WorksheetFunction

linmatriz = 0
Set wkf = Application.WorksheetFunction


For c = 1 To 3

ulinhas(c) = Planilha1.Cells(Planilha1.Rows.Count, c).End(3).Row


Next c
maiorLinha = wkf.Max(ulinhas)

If maiorLinha < 2 Then

Planilha1.Columns("j:l").ClearContents

Exit Sub
End If
ReDim Rmatriz(1 To maiorLinha, 1 To 3)

matriz = Planilha1.Range("a2:c" & maiorLinha).Value


For i = UBound(matriz, 1) To LBound(matriz, 1) Step -1
linmatriz = linmatriz + 1

For c = 1 To 3

Rmatriz(linmatriz, c) = matriz(i, c)

Next c

Next i

Planilha1.Columns("j:l").ClearContents

Planilha1.Range("j1:L1").Value = Planilha1.Range("a1:c1").Value
Planilha1.Range("j2").Resize(UBound(Rmatriz, 1), 3).Value = Rmatriz
Planilha1.Columns("j:l").AutoFit

Planilha1.Columns("j:L").HorizontalAlignment = xlCenter


Exit Sub

ErroMatriz:
MsgBox "Um erro ocorreu, verifique !"
End Sub

e use o "call atualiza"no final de sua rotina....

Dê retorno.
Giovani

Resposta útil? Clique na mãozinha ao lado do botão Citar.

 
Postado : 09/02/2018 11:36 am
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Klarc28 e Giovani

Ambos alcançaram o objetivo que eu necessitava, muito agradecido e parabéns!

Porém nos dois casos acontece o seguinte, quando a planilha nova vai ficando com muitas linhas, o sistema vai carregando e ficando lento aos poucos e cada vez mais lento com mais linhas

Será que teria solução pra isso?

No momento, cada vez que roda o código é como se o Excel recortasse e colasse todo o conteúdo uma linha abaixo

Mas se eu deletar a nova tabela gerada e rodar o código novamente, ela é preenchida toda de novo, incluindo as atualizações dos dados

É possível, antes da rotina ser executada inserir um comando de apagar todo o conteúdo anterior? Assim o sistema somente teria que preencher uma nova planilha

Obrigado

 
Postado : 09/02/2018 12:19 pm
(@klarc28)
Posts: 971
Prominent Member
 

Anexo

 
Postado : 10/02/2018 6:28 am
(@klarc28)
Posts: 971
Prominent Member
 

Em relação à lentidão, eu poderia estabelecer um limite de linhas. Por exemplo: montar a tabela invertida somente com as 10 últimas linhas.
Se quiser alterar a quantidade de linhas, basta alterar esta linha:

quantidadeDeLinhas = 10
 
Postado : 10/02/2018 6:31 am
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Olá Klarc28

Funcionou muito bem com esse esquema de mandar deletar tudo e reconstruir a cada novo dado, não pesa tanto aqui mesmo deixando sem limitação de linha

Valeu mesmo!

Agora, tem como exibir os valores diferentes que se encontram nessas linhas em outras células?

Exemplo:

De I1:I10 tem

I1 = 5
I2 = 5
I3 = 3
I4 = 5
I5 = 3
I6 = 7
I7 = 7
I8 = 8
I9 = 5
I10 = 8

Daí gostaria de reservar as células O5 até quantas forem necessárias na coluna O, pra mostrar os valores diferentes que existem de I1:I10

No caso ficaria

O5 = 5
O6 = 3
O7 = 7
O8 = 8
O9 = nada
O10 = nada
O11............ e por aí vai!

É como se eu marcasse de I1 até I10 e clicasse no Filtro

Obrigado

 
Postado : 14/02/2018 8:33 am
(@klarc28)
Posts: 971
Prominent Member
 
Option Explicit

Sub teste()
    
    
    Dim i As Integer
    Dim j As Integer
    Dim linha As Integer
    Dim achou As Boolean
    Plan1.Range("O5").Value = Plan1.Range("I1").Value
    For i = 2 To 10
        linha = 5
        achou = False
        While Plan1.Range("O" & linha).Value <> "" And achou = False
            If Plan1.Range("I" & i).Value = Plan1.Range("O" & linha).Value Then
                achou = True
            End If
            linha = linha + 1
        Wend
        
        If achou = False Then
            Plan1.Range("O" & linha).Value = Plan1.Range("I" & i).Value
        End If
    Next i
    
End Sub
 
Postado : 14/02/2018 9:22 am
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Funcionou Klarc28, só mandei limpar os dados antes com:

Sub filtro()
    
    Dim intervalo As Range
Set intervalo = Plan1.Range("O6:O16")

intervalo.Cells.ClearContents
    Dim i As Integer
    Dim j As Integer
    Dim linha As Integer
    Dim achou As Boolean
    Plan1.Range("O5").Value = Plan1.Range("I1").Value
    For i = 2 To 100
        linha = 5
        achou = False
        While Plan1.Range("O" & linha).Value <> "" And achou = False
            If Plan1.Range("I" & i).Value = Plan1.Range("O" & linha).Value Then
                achou = True
            End If
            linha = linha + 1
        Wend
        
        If achou = False Then
            Plan1.Range("O" & linha).Value = Plan1.Range("I" & i).Value
        End If
    Next i
    
End Sub

Tem como classificar do maior para o menor de O5 até O14?

Obrigado

 
Postado : 14/02/2018 9:52 am
Página 1 / 2