Notifications
Clear all

Macro para Conciliar valores repetidos

16 Posts
4 Usuários
0 Reactions
3,074 Visualizações
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

Boa noite pessoal,
preciso de uma ajuda,

Estou com uma dúvida na criação de uma macro que faça a limpeza em uma base de dados
seguindo algumas regras, reparem que nas tabelas sempre há um fornecedor e um valor positivo
e outro negativo, a ideia é sempre que tenha um positivo e um negativo do mesmo fornecedor,
ambos sejam apagados... O objetivo é deixar apenas os negativos ou positivos que não casarem...

Feito isso, outra macro seria para comparar os valores que sobraram com outra tabela, exemplo,
se sobrar negativo, ele deve encontrar o mesmo valor positivo nessa outra tabela, se positivo,
negativo, e caso encontrar marcar com alguma cor.

Alguém conseguiria me ajudar ?

 
Postado : 16/04/2018 6:44 pm
(@klarc28)
Posts: 971
Prominent Member
 

Eu consigo te ajudar, indicando que você deve estudar laço de repetição:

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

Com todo respeito, eu prefiro ajudar quem já traz algum código.

 
Postado : 16/04/2018 9:19 pm
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

Existem 6 tipos de laços de repetição, estou tentando montar a lógica mas estou com muita dificuldade, pois no loop, não sei como especificar o cálculo a ser feito, exemplo, se (fornecedorA & ValorAPositivo) + (FornecedorA & ValorAnegativo) = 0 então delete linha...

exemplo:

Sub teste()

Dim linha As Integer
Dim qtd As Integer

qtd = Planilha1.Range("b2").End(xlDown).Row

For linha = 1 To qtd

Next


End Sub

Não to conseguindo colocar minha lógica dentro do loop.

 
Postado : 17/04/2018 5:42 am
xlarruda
(@xlarruda)
Posts: 732
Honorable Member
 

Bom dia, veja se é mais ou menos assim:

___________________________________________________________________________________________
Se a resposta atendeu sua dúvida, por favor, clique no Gostei e marque o Tópico como [Resolvido].

Att.

André Arruda

 
Postado : 17/04/2018 7:29 am
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa tarde ericksant,

Se a sugestão do colega xlarruda não resolveu.

Anexe uma planilha de exemplo, assim fica mais fácil tentar ajudar.

att,

 
Postado : 17/04/2018 3:15 pm
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

Galera, boa noite

Testei a macro, ela funciona claramente quando a diferença dos positivos contra os negativos é apenas de 1 registro.
Fiz um teste onde pega valores positivos e negativos repetidos, onde cruzando os valores, sobram mais de 1 registro negativo, a idéia é trazer eles também.

Vejam a tabela em anexo.

A idéia principal é trazer sempre os registros que não tiverem seu par, seja negativo ou positivo.

O grande problema é que a base total tem em torno de 90 mil linhas... Estou desesperado...

 
Postado : 17/04/2018 4:00 pm
xlarruda
(@xlarruda)
Posts: 732
Honorable Member
 

Segue a correção:

Sub conciliar()
On Error Resume Next
Dim ul As Long
inicio:
ul = Planilha1.Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To ul
conf1 = CStr(Cells(i, 7).Value & Cells(i, 8).Value)
For j = 2 To ul
If CStr(Cells(j, 7).Value & (Cells(j, 8).Value) * -1) = conf1 And Cells(j, 7).Row <> Cells(i, 7).Row Then
Cells(j, 2).EntireRow.Delete
Cells(i, 2).EntireRow.Delete
GoTo inicio
End If
Next j
Next i
MsgBox "Conciliação realizada com Sucesso!", vbExclamation, "Sucesso!"
End Sub

Nos meus testes sobrou exatamente a diferença, da forma como você descreveu na planilha . Por favor, faça o teste e retorne...

Abrç!

___________________________________________________________________________________________
Se a resposta atendeu sua dúvida, por favor, clique no Gostei e marque o Tópico como [Resolvido].

Att.

André Arruda

 
Postado : 18/04/2018 10:12 am
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

@ xlarruda

Muito obrigado pela ajuda cara! Rodou perfeitamente na base em que compartilhei aqui com vocês.

Eu to testando na base principal, só que ela tem em torno de 20 mil linhas, fica demorando demais... Isso é normal ?

Em bases menores ela vai...

Há alguma maneira de otimizar isso ?

 
Postado : 18/04/2018 2:06 pm
xlarruda
(@xlarruda)
Posts: 732
Honorable Member
 

ericksant boa tarde.

Baseado na linha de raciocínio que eu utilizei, não vejo como otimizar. Se você reparar , verá que faço um laço de repetição dentro de outro laço de repetição para contemplar todos os registros na verificação linha por linha.

Fazendo um cálculo rápido:

Se sua planilha tem 20mil linhas então serão realizadas 400 milhões de verificações ( 20.000 * 20.000). Ou seja, vai demorar um pouco mesmo.

A não ser que algum colega consiga encontrar um outro caminho para chegar ao mesmo resultado.

Abrç!

___________________________________________________________________________________________
Se a resposta atendeu sua dúvida, por favor, clique no Gostei e marque o Tópico como [Resolvido].

Att.

André Arruda

 
Postado : 18/04/2018 3:32 pm
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

Xlarruda, muito obrigado pela força cara! Uma última dúvida, supondo que eu consiga limpar essa base com a macro, como poderia fazer uma outra para comparar os valores que sobraram com uma outra sheet ? Exemplo:

sheet1 sheet2
FornecedorA R$ -150,00 FornecedorA R$150,00

A idéia era o que encontrar, pintar de alguma cor, para identificar o 'par'...

 
Postado : 19/04/2018 5:31 am
xlarruda
(@xlarruda)
Posts: 732
Honorable Member
 

Seria melhor se pudéssemos ver a estrutura dessa sheet2 para montar algum código ou formatação..

___________________________________________________________________________________________
Se a resposta atendeu sua dúvida, por favor, clique no Gostei e marque o Tópico como [Resolvido].

Att.

André Arruda

 
Postado : 19/04/2018 7:01 am
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

Sub conciliar()
On Error Resume Next
Dim ul As Long
inicio:
ul = Planilha1.Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To ul
conf1 = CStr(Cells(i, 7).Value & Cells(i, 8).Value)
For j = 2 To ul
If CStr(Cells(j, 7).Value & (Cells(j, 8).Value) * -1) = conf1 And Cells(j, 7).Row <> Cells(i, 7).Row Then
Cells(j, 2).Entire.Row.Interior.Color = 65535
Cells(i, 2).Entire.Row.Interior.Color = 65535
GoTo inicio
End If
Next j
Next i
MsgBox "Conciliação realizada com Sucesso!", vbExclamation, "Sucesso!"
End Sub

Por que não tá colocando a linha inteira como amarela ? Onde estaria o erro ?

 
Postado : 21/04/2018 4:54 pm
(@klarc28)
Posts: 971
Prominent Member
 

Tente substituir

Entire.Row

Por

EntireRow
 
Postado : 21/04/2018 5:14 pm
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

Após a correção, ele está pintando as linhas que se completam, o problema é que só está fazendo a primeira linha (2), poderiam me ajudar a montar a lógica para depois que fizer a primeira, fazer as outras de baixo ?

Sub conciliar()
On Error Resume Next
Dim ul As Long
inicio:
ul = Planilha1.Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To ul
conf1 = CStr(Cells(i, 7).Value & Cells(i, 8).Value)
For j = 2 To ul
If CStr(Cells(j, 7).Value & (Cells(j, 8).Value) * -1) = conf1 And Cells(j, 7).Row <> Cells(i, 7).Row Then
Cells(j, 2).EntireRow.Interior.Color = 65535
Cells(i, 2).EntireRow.Interior.Color = 65535
GoTo inicio
End If
Next j
Next i
MsgBox "Conciliação realizada com Sucesso!", vbExclamation, "Sucesso!"
End Sub
 
Postado : 22/04/2018 11:13 am
(@klarc28)
Posts: 971
Prominent Member
 
Sub conciliar()
On Error Resume Next
Dim ul As Long
'inicio:
ul = Planilha1.Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To ul
conf1 = CStr(Cells(i, 7).Value & Cells(i, 8).Value)
For j = 2 To ul
If CStr(Cells(j, 7).Value & (Cells(j, 8).Value) * -1) = conf1 And Cells(j, 7).Row <> Cells(i, 7).Row Then
Cells(j, 2).EntireRow.Interior.Color = 65535
Cells(i, 2).EntireRow.Interior.Color = 65535
'GoTo inicio
End If
Next j
Next i
MsgBox "Conciliação realizada com Sucesso!", vbExclamation, "Sucesso!"
End Sub
 
Postado : 22/04/2018 12:16 pm
Página 1 / 2