Excel VBA – Excluir linhas de acordo com um critério

É impressionante a quantidade de vezes que vejo esse tipo de dúvida nos fóruns que frequento.

Várias soluções já foram postadas para resolver o problema, mas cada uma mais particular que a outra. Vejam bem, não disse que as soluções eram ruins, mas sim que atendiam somente a uma determinada necessidade.

Pois bem, com base nisso, decidi gastar um tempinho escrevendo uma macro que tenta resolver o problema de forma genérica. Para se ter uma idéia, dêem uma olhada no seguinte código:

Function DeleteRowsByCriteria(ByVal firstRow As Integer, ByVal lastRow As Integer, ByVal criteriaColumn As Integer, ByVal criteria As String) As Integer
    Dim deletedRows As Integer
    Dim i As Integer
    deletedRows = 0
    With ActiveSheet
        i = firstRow
        While i < lastRow
            If CStr(.Cells(i, criteriaColumn).Value) = criteria Then
                .Rows(i).Delete
                deletedRows = deletedRows + 1
            Else
                i = i + 1
            End If
        Wend
    End With
    DeleteRowsByCriteria = deletedRows
End Function

O que ele faz efetivamente é, receber 4 parâmetros, sendo eles:

  • o índice da linha inicial de busca
  • o índice da linha final de busca
  • o índice da coluna onde se deve buscar o critério
  • o valor do critério no formato de string

Recebendo estes parâmetros, ele varre as linhas da planilha ativa a partir do índice da linha inicial até o índice da linha final e em cada linha que passa, compara o valor na coluna cujo o índice também é informado com o parâmetro critério.Por fim, a função retorna quantas linhas foram excluídas no processo.

O código abaixo faz uma chamada de exemplo para a função:

Sub Execute()
    MsgBox DeleteRowsByCriteria (1, 200, 6, "London") & " rows has been deleted"
End Sub

O que exatamente esta chamada está fazendo é, ler na planilha atual da linha 1 até a 200, sendo que, quando a coluna 6 ou F tiver o valor “London”, esta será excluída.

É bom ter ciência de que o código não faz validações sobre como a lista de dados está montada. Também não está previsto em um primeito momento verificações como ranges de dados, valores numéricos ou de data, funcionalidades estas que podem ser implementadas ao longo do tempo para melhorar a função. Portando, cabe a cada um implementar as verificações necessárias para sua necessidade.

Abraços e bom proveito!

Tomás Vásquez
www.tomasvasquez.com.br

Comentários

comentários