none
Macro excluir linhas com determinado valor

    Question

  • Olá pessoal, alguém consegue ajudar?

    Tenho uma planilha em Excel 2010 com várias colunas e valores bem variados. Como esta planilha tem 50.000 linhas, fazendo um filtro para selecionar as linhas que tem determinado valor para excluí-las é muito pesado e trava o Excel.

    Gostaria de uma macro que fizesse automaticamente isso sem eu precisar fazer os filtros manualmente para excluir essas linhas, é possível?

    Ex. 1: Gostaria de excluir todas as linhas que contém o valor "5" na coluna "C"

    Ex. 2: Outra macro que verificasse 2 valores, excluir as linhas que contém o valor "2" na coluna "B" e o valor 4 na coluna "E".

    Obrigado

    Thursday, March 07, 2013 12:17 PM

Answers

  • "Como esta planilha tem 50.000 linhas, fazendo um filtro para selecionar as linhas que tem determinado valor para excluí-las é muito pesado e trava o Excel."

    Discordo dessa afirmação. Em todo caso, experimente o código abaixo. Note que o código é mais lento que o uso de operações nativas do Excel:

    Sub Exemplo1()
        Dim lLin As Long
        
        Application.ScreenUpdating = False
        
        'Altere o nome da planilha abaixo:
        With Sheets("Plan1")
            For lLin = .Cells(.Rows.Count, "C").End(xlUp).Row To 2 Step -1
                If .Cells(lLin, "C") = 5 Then .Rows(lLin).Delete
                
                'Desafoga os processos pendentes do Windows a cada 100 linhas iteradas:
                If lLin Mod 100 = 0 Then DoEvents
            Next lLin
        End With
    
        Application.ScreenUpdating = True
    End Sub
    
    Sub Exemplo2()
        Dim lLin As Long
        
        Application.ScreenUpdating = False
        
        'Altere o nome da planilha abaixo:
        With Sheets("Plan1")
            For lLin = .Cells(.Rows.Count, "B").End(xlUp).Row To 2 Step -1
                If .Cells(lLin, "B") = 2 And .Cells(lLin, "E") = 4 Then
                    .Rows(lLin).Delete
                End If
                
                'Desafoga os processos pendentes do Windows a cada 100 linhas iteradas:
                If lLin Mod 100 = 0 Then DoEvents
            Next lLin
        End With
    
        Application.ScreenUpdating = True
    End Sub




    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    Thursday, March 07, 2013 9:57 PM

All replies

  • Ola Marco, bom dia.

    Ao invés de desenvolver uma macro a fim de customizar essa ação, o recurso Localizar e substituir que é nativo realizaria essa ação de forma mais simples e prática.

    Falo isso porque se você clicar em na aba Página Inicial - grupo Edição - opção Localizar e Substituir, você realizaria a busca de todas as informações que você precisa e faria a substituição de todas automaticamente.

    Referência Microsoft:

    http://office.microsoft.com/pt-br/excel-help/localizar-ou-substituir-texto-ou-numeros-em-uma-planilha-HP010342525.aspx

    Espero ter ajudado.

    Hezequias Vasconcelos

    Thursday, March 07, 2013 1:28 PM
    Moderator
  • Olá Hezequias, obrigado pela reposta, mas este recurso não atende minha necessidade, pois não quero substituir valores das células, e sim EXCLUIR as LINHAs que possuem os critérios que quero definir ok.

    Mesmo assim obrigado, vou continuar aguardar a ajuda sobre a macro.

    Thursday, March 07, 2013 6:46 PM
  • Olá Marco, boa tarde.

    Siga este tutorial, ele descreve o passo a passo como realizar a ação de exclusão com base em condições através do VBA.

    http://www.ozgrid.com/VBA/row-delete-criteria.htm

    Espero ter ajudado.


    Hezequias Vasconcelos

    Thursday, March 07, 2013 7:15 PM
    Moderator
  • "Como esta planilha tem 50.000 linhas, fazendo um filtro para selecionar as linhas que tem determinado valor para excluí-las é muito pesado e trava o Excel."

    Discordo dessa afirmação. Em todo caso, experimente o código abaixo. Note que o código é mais lento que o uso de operações nativas do Excel:

    Sub Exemplo1()
        Dim lLin As Long
        
        Application.ScreenUpdating = False
        
        'Altere o nome da planilha abaixo:
        With Sheets("Plan1")
            For lLin = .Cells(.Rows.Count, "C").End(xlUp).Row To 2 Step -1
                If .Cells(lLin, "C") = 5 Then .Rows(lLin).Delete
                
                'Desafoga os processos pendentes do Windows a cada 100 linhas iteradas:
                If lLin Mod 100 = 0 Then DoEvents
            Next lLin
        End With
    
        Application.ScreenUpdating = True
    End Sub
    
    Sub Exemplo2()
        Dim lLin As Long
        
        Application.ScreenUpdating = False
        
        'Altere o nome da planilha abaixo:
        With Sheets("Plan1")
            For lLin = .Cells(.Rows.Count, "B").End(xlUp).Row To 2 Step -1
                If .Cells(lLin, "B") = 2 And .Cells(lLin, "E") = 4 Then
                    .Rows(lLin).Delete
                End If
                
                'Desafoga os processos pendentes do Windows a cada 100 linhas iteradas:
                If lLin Mod 100 = 0 Then DoEvents
            Next lLin
        End With
    
        Application.ScreenUpdating = True
    End Sub




    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    Thursday, March 07, 2013 9:57 PM
  • Benzadeus, muito obrigado... Deu certo!!!
    Wednesday, March 13, 2013 5:55 PM