Notifications
Clear all

Procurar em coluna

14 Posts
2 Usuários
0 Reactions
3,629 Visualizações
(@tiago21)
Posts: 43
Eminent Member
Topic starter
 

Olá pessoal, tenho uma coluna que tem números como exemplo abaixo; Tenho que apagar todos os número positivo e negativo ( 5 e -5 ; 10 e -10) só que algumas vezes pode ter mais de um número negativo igual (10 ; -10 e outro -10). Alguma idéia de como pesquisar e apagar esses dados?

5
10
15
-5
-10
-10

 
Postado : 04/10/2018 1:56 pm
xlarruda
(@xlarruda)
Posts: 732
Honorable Member
 

É para apagar apenas os números ou a linha inteira?

Se for apagando a linha, segue resolução:

Option Explicit

Sub Verificar_e_apagar()
Dim ul, ul2, i, j, contagem, lin_ini As Long
Dim cel As Variant
Dim verif_col As String

verif_col = "A" 'COLUNA A VERIFICAR
lin_ini = 2 'LINHA INICIAL DOS DADOS

inicio:
contagem = 0
ul = Plan1.Range(verif_col & Rows.Count).End(xlUp).Row

For i = lin_ini To ul
ul2 = Plan1.Range(verif_col & Rows.Count).End(xlUp).Row
    For j = ul2 To lin_ini Step -1
        Select Case Plan1.Range(verif_col & j).Value
            Case Is = Plan1.Range(verif_col & i).Value * -1 _
                        And Plan1.Range(verif_col & j).Address <> Plan1.Range(verif_col & i).Address
                       Plan1.Range(verif_col & j).EntireRow.Delete
                       contagem = contagem + 1
            
            Case Is = Plan1.Range(verif_col & i).Value _
                        And Plan1.Range(verif_col & j).Address <> Plan1.Range(verif_col & i).Address
                       Plan1.Range(verif_col & j).EntireRow.Delete
                       contagem = contagem + 1
        End Select
         
    Next j
    
    If contagem > 0 Then
        Plan1.Range(verif_col & i).EntireRow.Delete
        GoTo inicio
    End If
Next i

End Sub

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

Att.

André Arruda

 
Postado : 04/10/2018 2:24 pm
(@tiago21)
Posts: 43
Eminent Member
Topic starter
 

É isso... porém... O 10 positivo (que só tem um) só pode anular um 10 negativo (que tem dois).

 
Postado : 05/10/2018 4:41 am
xlarruda
(@xlarruda)
Posts: 732
Honorable Member
 

Segue:

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

Att.

André Arruda

 
Postado : 05/10/2018 5:56 am
(@tiago21)
Posts: 43
Eminent Member
Topic starter
 

Muito obrigado. Funciona perfeitamente.

 
Postado : 05/10/2018 6:26 am
(@tiago21)
Posts: 43
Eminent Member
Topic starter
 

Olha... estou usando em uma planilha com várias linhas... e não consigo concluir, a planilha trava, alguma sugestão?

 
Postado : 05/10/2018 7:53 am
xlarruda
(@xlarruda)
Posts: 732
Honorable Member
 

Trava de demorar para executar ou trava de dar erro?

quantas linhas são?

Se o problema for apenas demora, isso é natural pois a rotina percorre linha a linha da planilha diversas vezes. Quanto mais linhas houver mais verificações serão feitas.
Fiz um teste com 300 linhas e demorou algo em torno de 32 segundos para concluir.

Fiz uma adaptação no código para adicionar uma mensagem ao final da rotina e traz também o tempo que levou para finaliza-lo. Se tiver interesse segue abaixo:

Option Explicit

Sub Verificar_e_apagar()
Dim ul, ul2, i, j, contagem, lin_ini As Long
Dim cel As Variant
Dim verif_col As String
Dim Temp_ini As Date
Application.ScreenUpdating = False
verif_col = "A" 'COLUNA A VERIFICAR
lin_ini = 2 'LINHA INICIAL DOS DADOS
Temp_ini = Time
inicio:
contagem = 0
ul = Plan1.Range(verif_col & Rows.Count).End(xlUp).Row

For i = lin_ini To ul
ul2 = Plan1.Range(verif_col & Rows.Count).End(xlUp).Row
    For j = ul2 To lin_ini Step -1
        Select Case Plan1.Range(verif_col & j).Value
            Case Is = Plan1.Range(verif_col & i).Value * -1 _
                        And Plan1.Range(verif_col & j).Address <> Plan1.Range(verif_col & i).Address
                       Plan1.Range(verif_col & j).EntireRow.Delete
                       Plan1.Range(verif_col & i).EntireRow.Delete
                       
        End Select
         
    Next j
    
 
Next i
Application.ScreenUpdating = True

MsgBox "Feito!" & vbNewLine & "Tempo de execução: " & WorksheetFunction.Text(Time - Temp_ini, "HH:MM:SS"), vbInformation
End Sub

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

Att.

André Arruda

 
Postado : 05/10/2018 8:01 am
(@tiago21)
Posts: 43
Eminent Member
Topic starter
 

Tem 17 763 kkk segue a planilha em anexo.
Eu só to usando para aplicar na coluna A.

https://drive.google.com/file/d/10Mvf0dzEOrzQ6t_WTdNRPLn8wAm4-_58/view?usp=drivesdk

 
Postado : 05/10/2018 11:42 am
xlarruda
(@xlarruda)
Posts: 732
Honorable Member
 

Kkk meu amigo. A não ser que alguém consiga te ajudar de uma maneira mais eficiente, eu te aconselho a rodar a macro e esquece-la por pelo menos uns 40 minutos...

O lado bom é que funciona.
O lado ruim é que demora... muito...

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

Att.

André Arruda

 
Postado : 05/10/2018 11:46 am
(@tiago21)
Posts: 43
Eminent Member
Topic starter
 

Inicado: 14:51 kkkk vamos ver ... quando acabar posto aqui .... valeu

 
Postado : 05/10/2018 11:51 am
(@tiago21)
Posts: 43
Eminent Member
Topic starter
 

Não tem como limitar ? fazer da linha 1 até a linha 1000 ?

 
Postado : 05/10/2018 12:03 pm
xlarruda
(@xlarruda)
Posts: 732
Honorable Member
 

Até dá , mas acho que vai perder um pouco de sentido a rotina...

De qualquer forma, segue:

Option Explicit

Sub Verificar_e_apagar()
Dim ul, ul2, i, j, contagem, lin_ini As Long
Dim cel As Variant
Dim verif_col As String
Dim Temp_ini As Date
Application.ScreenUpdating = False
verif_col = "A" 'COLUNA A VERIFICAR
lin_ini = 2 'LINHA INICIAL DOS DADOS
Temp_ini = Time
inicio:
contagem = 0
ul = Plan1.Range(verif_col & 1000).End(xlUp).Row

For i = lin_ini To ul
ul2 = Plan1.Range(verif_col & 1000).End(xlUp).Row
    For j = ul2 To lin_ini Step -1
        Select Case Plan1.Range(verif_col & j).Value
            Case Is = Plan1.Range(verif_col & i).Value * -1 _
                        And Plan1.Range(verif_col & j).Address <> Plan1.Range(verif_col & i).Address
                       Plan1.Range(verif_col & j).EntireRow.Delete
                       Plan1.Range(verif_col & i).EntireRow.Delete
                       
        End Select
         
    Next j
    

Next i
Application.ScreenUpdating = True

MsgBox "Feito!" & vbNewLine & "Tempo de execução: " & WorksheetFunction.Text(Time - Temp_ini, "HH:MM:SS"), vbInformation
End Sub

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

Att.

André Arruda

 
Postado : 05/10/2018 12:14 pm
(@tiago21)
Posts: 43
Eminent Member
Topic starter
 

pois é. acho que não funcionou. muito pesado. não roda.

 
Postado : 05/10/2018 1:13 pm
xlarruda
(@xlarruda)
Posts: 732
Honorable Member
 

Desmarque o resolvido ou crie um novo tópico.
Quem sabe alguém dá uma outra solução para esse problema.

Abrç!

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

Att.

André Arruda

 
Postado : 05/10/2018 1:46 pm