Notifications
Clear all

[Resolvido] Organizar dados com quantidade variavel

7 Posts
3 Usuários
7 Reactions
1,789 Visualizações
(@rechbr)
Posts: 22
Eminent Member
Topic starter
 

Ola prezados mestres do Excel!

   Eu até consegui "resolver" o problema, mas tenho certeza que possuem formas mais inteligentes e eficazes de fazer isso. Ai vai:

   Preciso copiar dados de um site e colar manualmente no excel. A quantidade de dados vai variar. Esses dados estao em uma unica coluna e em um formato que cada linha representa uma coluna ate um momento que repete, exemplo: linha 1 coluna 1, linha 2 coluna 2 e linha 3 coluna 3, linha 5 coluna 1 novamente...
  Alem disso, a primeira coluna trata-se de uma data no formato: 26 Oct 2024, 16:54:14.893 e gostaria de separar Data e Hora em colunas separadas.

 Um extra seria interessante se eu conseguisse filtrar as linhas repetidas e ficar com o valor mais recente eliminando os outros. Podendo ate mesmo deletar o restante das linhas.

  Segue anexo para que entendam. Qualquer sugestão de formulas que devo usar ou como pesquisar para melhorar isso.

Já fiz algumas coisas em VBA e formulas complexas.

Muito Obrigado desde já.

 

 

 
Postado : 25/12/2024 10:07 pm
Eron reacted
Tags do Tópico
(@osvaldomp)
Posts: 929
Prominent Member
 

Olá, @  RechBr

Veja se esta solução via macro lhe serve.

O código abaixo utiliza somente a coluna G da planilha Dados Puros e as colunas A:E da planilha Dados Organizados.

Sub OrganizaDados()
Dim ws As Worksheet, k As Long, x As Long, LRo As Long, LRd As Long
Set ws = Sheets("Dados Organizados")
If ws.[A2] <> "" Then ws.Range("A2:E" & ws.Cells(Rows.Count, 1).End(3).Row) = ""
ws.Columns("A:B").NumberFormat = "@"
LRo = Sheets("Dados Puros").Cells(Rows.Count, "G").End(3).Row
LRd = 2
With Sheets("Dados Puros")
For k = 2 To LRo Step 7
If k = 2 Then
GoTo th
ElseIf Left(.Cells(k, "G"), 11) <> Left(.Cells(x, "G"), 11) Then
th:
ws.Cells(LRd, 1) = Left(.Cells(k, "G"), 11)
ws.Cells(LRd, 2) = Right(.Cells(k, "G"), 12)
ws.Cells(LRd, 3) = .Cells(k + 1, "G")
ws.Cells(LRd, 4) = .Cells(k + 2, "G")
ws.Cells(LRd, 5) = .Cells(k + 3, "G")
LRd = LRd + 1
End If
x = k
Next k
End With
End Sub

Osvaldo

 
Postado : 26/12/2024 1:15 pm
Eron reacted
(@rechbr)
Posts: 22
Eminent Member
Topic starter
 

MUITO Obrigado pela atenção! Como posso retribuir?

         
 
Postado : 02/01/2025 5:43 pm
Eron reacted
(@osvaldomp)
Posts: 929
Prominent Member
 

"MUITO Obrigado pela atenção! ---> Obrigado por retornar. 😀 

 

"Como posso retribuir?"---> Em qualquer lugar, a qualquer hora, ajude alguém que esteja precisando. 🤩 

Osvaldo

 
Postado : 02/01/2025 6:53 pm
Eron reacted
(@rechbr)
Posts: 22
Eminent Member
Topic starter
 

Deu liberdade, vou abusar um pouco... haha

Pq por exemplo, o de cima funciona e o de baixo nao? Estou quebrando a cabeca tarde toda e nada

=PROCV("41449";OrdemTrab[#Tudo];5;0)

=PROCV([@SERIAL];OrdemTrab[#Tudo];5;0)

 
Postado : 02/01/2025 9:20 pm
Eron reacted
(@osvaldomp)
Posts: 929
Prominent Member
 

Na tabela DadosOrg a coluna SERIAL é formada por números, ao passo que na tabela OrdemTrab a coluna SERIAL é formada por textos.

=PROCV("41449";OrdemTrab[#Tudo];5;0) ---> esta fórmula retorna o resultado correto porque o valor procurado está entre aspas ("41449") , e isso converte o número em texto, que fica compatível com a coluna em que é feita a busca.

=PROCV([@SERIAL];OrdemTrab[#Tudo];5;0) ---> esta retorna #N/D porque está buscando número em um intervalo que contém textos, conforme comentei acima.

Experimente essa abaixo.

=PROCV(TEXTO([@SERIAL];"0000");OrdemTrab[#Tudo];5;0)

__________________________________________________________________________________________________________________

Sobre o assunto inicial deste tópico, vi que você alterou o código que passei.

ElseIf Left(.Cells(k, "A"), 11) <> Left(.Cells(x, "A"), 12) Then ---> ao alterar de 11 para 12 você tornou esse comando inútil, e esse comando no código que passei tem a missão de impedir a criação de registros duplicados no resultado, aí, para "compensar o seu erro", você acrescentou comando para remover os registros duplicados.

Sugestão: no futuro, se precisar de ajustes em códigos retorne, ao invés de fazer gambiarras.

Dica - não utilize Select nos seus códigos.

Osvaldo

 
Postado : 03/01/2025 8:22 am
Eron reacted
(@jesse0112)
Posts: 1
New Member
 

Pelo arquivo, parece que cada registro é formado por um bloco fixo de informações (Data/Hora, SN, Horas e IP), mas tudo chega em uma única coluna. Nesse caso, eu evitaria VBA inicialmente e tentaria resolver com o Power Query, porque ele lida muito bem com quantidade variável de linhas.

Você pode importar a coluna para o Power Query e criar um índice começando em 0. Depois basta usar o resto da divisão para identificar a posição de cada item dentro do bloco (Data/Hora, SN, Horas e IP). Em seguida, é só transformar esses grupos em colunas. A vantagem é que, se amanhã vierem 100 linhas ou 10.000 linhas, a consulta continua funcionando sem precisar ajustar fórmulas.

Para separar Data e Hora, o próprio Power Query consegue dividir a coluna usando a vírgula como delimitador. Depois você define os tipos de dados adequados para cada campo.

Sobre manter apenas o registro mais recente, eu faria uma classificação pela data/hora em ordem decrescente e depois removeria duplicados usando a coluna que identifica unicamente o equipamento (SN ou IP, dependendo da regra do negócio). Assim você mantém automaticamente a ocorrência mais recente e descarta as anteriores.

Se preferir continuar apenas com fórmulas, também é possível, mas para esse tipo de estrutura repetitiva e com quantidade variável de registros, o Power Query costuma ficar mais simples, mais rápido e mais fácil de manter no longo prazo.

 
Postado : 03/06/2026 11:17 pm
Eron reacted