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
  • Excelente essa macro, resolveu meu problema, eu estava querendo apagar todas as vendas com o mesmo numero, eu estava usando o Do Until, Loop com o Sheets("Planilha").Cells(lin,col) = txtNumVenda.Text para encontrar todas as celulas da PLAN que contenham o numero de vendas digitado na TextBox, e deletava, mas, sempre sobrava uma celula que ele não era deletada, e com esse procedimento aqui exposto eu consigo deletar tantos registros existam com o critério determinado por mim.

    Obrigado meu amigo FELIPE COSTA

    Tuesday, September 30, 2014 1:13 PM
  • Há uma maneira mais fácil utilizando o Filtro Nativo do Excel:

    Eliminar linha em que uma coluna tem um determinado valor

    1. Criar cabeçalho nomeando cada linha

    2. Marcar toda linha do cabeçalho

    3. Ir em Filtro e escolher na coluna em que a expressão ou texto aparece repetida e escolher esta expressão o texto a ser localizado.

    4. Dar ok

    5. Colocar o ponteiro do mouse no número da primeira linha, clicar com o botão direito para marcar toda linha

    6. Teclar shift+End+seta para baixo até alcançar ao fim da planilha, em geral basta descer duas linhas com a seta para baixa e alcança até o final da planilha automaticamente

    7. Colocar o ponteiro do mouse no número de uma linha, botão direito do mouse e Excluir Linha

    8. As linhas serão excluídas e você terá apenas as linhas sem aquela expressão ou texto.

    Fácil assim.

    prof. Lourenço Stelio Rega, PhD
    Diretor
    Faculdade Teológica Batista de São Paulo
      

    Saturday, May 23, 2015 2:51 PM
  • Bom dia Felipe,

    Eu preciso de uma macro como esta, mais com uma msg box para escolher quais critérios apagar. Por execmplo:

    Tenho uma planilha de orçamento e enumerei os itens da linha 19 em diante como 1, 2, 3 ... 30 e assim suscetivamente.

    Mas vezes preciso excluir os itens 1, 3, 15 ou 2 e 20, de acordo com a solicitação de cada cliente. Então, eu preciso criar uma condição para escolher quais linhas apagar quando acionar a macro.

    Adaptei uma macro que atende parcialmente minha necessidade, mas eu preciso implementá-la para não aparecer a msg box da coluna e também para criar critérios múltiplos ao invés de ter que excluir uma linha por vez.

                                                                      

    Sub sbx_deletar_linhas_baseado_criterios()

    ActiveSheet.Unprotect Password:=""

        Dim vRange As Range, DeletaRange As Range, vColuna As Range
        Dim vProcuraTexto As String, vProcuraColuna As String, vColunaAtiva As String
        Dim PrimeiroEndereco As String, CheckaNulo As String
        Dim SCA


        [B1].Select ' Para selecionar a coluna(C),

        'Extraindo texto para coluna ativa (mas com o c1) select será direcionada para a coluna(C)
        SCA = Split(ActiveCell.EntireColumn.Address(, True), ":")
        vColunaAtiva = SCA(0)

        vProcuraColuna = InputBox("Digite a coluna desejada ou cancela para sair", "Linha código para deletar", vColunaAtiva)

        On Error Resume Next
        Set vRange = Columns(vColunaAtiva)
        On Error GoTo 0

         'Se um intervalo inválido for inserido em seguida, sair
        If vRange Is Nothing Then Exit Sub

        vProcuraTexto = InputBox("Entre com o texto procurado", "Deleta código linha", [E1].Value) 'ActiveCell.Value)
        If vProcuraTexto = "" Then
            CheckaNulo = InputBox("Você realmente deseja excluir linhas com células vazias?" & vbNewLine & vbNewLine & _
            "Sim quero, caso contrário sairá código", "Cuidado", "Não")
            If CheckaNulo <> "Sim" Then Exit Sub
        End If

        Application.ScreenUpdating = False

         'para coincidir com a seqüência de texto TODO
        Set vColuna = vRange.Find(What:=vProcuraTexto, After:=vRange.Cells(1), LookIn:=xlValues, Lookat:=xlWhole)
         'para corresponder a uma cadeia de texto PARCIAL use esta linha
         'Set vColuna = vRange.Find(What:=vProcuraTexto, After:=vRange.Cells(1), LookIn:=xlValues, Lookat:=xlpart)
         'para coincidir com o caso e de uma cadeia de texto TODO
         'Set vColuna = vRange.Find(What:=vProcuraTexto, After:=vRange.Cells(1), LookIn:=xlValues, Lookat:=xlWhole, MatchCase:=True)

        If Not vColuna Is Nothing Then
            Set DeletaRange = vColuna
            PrimeiroEndereco = vColuna.Address
            Do
              Set vColuna = vRange.FindNext(vColuna)
              Set DeletaRange = Union(DeletaRange, vColuna)
            Loop While PrimeiroEndereco <> vColuna.Address
            'nao deixe de ver nosso trabalho com 100 planilhas exemplos Loops (com todas as intruções Do/While/Loop/until/For Next/)
        End If

         'Se houver condição verdadeira exclua as linhas
              sbx = MsgBox("As Linhas contendo a palavra [ " & [E1] & " ] serão deletadas!!!", vbYesNo + vbCritical, "CUIDADO - AÇÃO IRREVERSÍVEL!!")
               If sbx = 6 Then
                  If Not DeletaRange Is Nothing Then DeletaRange.EntireRow.Delete
               End If
          'caso queira retirar a mensagem vbyesno.
     '    If Not DeletaRange Is Nothing Then DeletaRange.EntireRow.Delete

     ActiveSheet.Protect Password:=""
        Application.ScreenUpdating = True

    End Sub

    Desde já agradeço pela atenção!

    Tuesday, June 21, 2016 2:01 PM
  • Muito bem Felipe!

    Obrigado por sua inestimável colaboração. Me salvou.

    Abs.

    Sunday, July 24, 2016 12:28 PM