Notifications
Clear all

Finalizar Cells.find quando não encontrar valor

13 Posts
2 Usuários
0 Reactions
3,100 Visualizações
(@jeffergar)
Posts: 15
Eminent Member
Topic starter
 

Olá!

Tenho uma macro simples na qual preciso excluir todas as linhas de uma planilha com mais de 500 mil registros que contenham a palavra "total". Até aí tudo bem, consigo fazer a busca e excluir a linha desejada.
Fazer manual leva muito tempo, mesmo ordenando as colunas. Pois cada coluna contém milhares de totais. Enfim...

Porém, quando o valor não é encontrado, a macro retorna um erro. Já tentei de muitas formas informar que quando não localizar o valor buscado, sair da macro. Mas não consegui usar os códigos corretos para tal.

Segue exemplo:

Sub Macro2()

Dim texto As String

texto = "total"


Do While texto <> vbNullString

Cells.Find(What:=texto, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate


Selection.EntireRow.Delete

Loop

MsgBox ("Retirados todos os totais!")

End Sub

Obrigado!

 
Postado : 13/03/2012 11:01 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bo tarde!!
Tente uma armadilha de erros...

On Error Resume Next
 
Postado : 13/03/2012 11:23 am
(@jeffergar)
Posts: 15
Eminent Member
Topic starter
 

Então alexandrevba, coloquei a expressão antes de Do while e a macro ficou rodando infinitamente.

Tem algo a mais que eu deveria escrever?

A expressão "Do While texto <> vbNullString" faz diferença ou sentido nesse caso?

Obrigado!

 
Postado : 13/03/2012 11:30 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!!

Acho que seria melhor criar uma função dentro de sua macro, tente assim.

Do contrário poste seu arquivo modelo

Option Explicit

Sub Macro2()
    Dim rCl As Range

    Set rCl = ActiveSheet.UsedRange.Find(What:="total", After:=ActiveCell, _
        LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
        SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
    If Not rCl Is Nothing Then rCl.EntireRow.Delete

    MsgBox ("Retirados todos os totais!")

End Sub
 
Postado : 13/03/2012 11:48 am
(@jeffergar)
Posts: 15
Eminent Member
Topic starter
 

resolveu, em partes, pois ele só exclui um único registro. Não faz uma análise cíclica até esgotar os "totais". Creio que poderia usar o 'do while', mas ainda não sei como.

 
Postado : 13/03/2012 12:21 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!!

Poderia postar seu arquivo? mas deve ser Compactado!!

Att

 
Postado : 13/03/2012 12:32 pm
(@jeffergar)
Posts: 15
Eminent Member
Topic starter
 

Enviei sem compactar com apenas 12 registros de exemplo, ficou pequena. Repare que pra cada informação tenho 6 registros, sendo que somente um deles me interessa, pois os demais são subtotais (com nome de total) daquela informação.

A macro teria então que procurar na planilha todas as células que contém a palavra 'total', exceto na linha 1 que é o cabeçalho, e excluir a linha em questão.

Quando não houver mais 'total' a ser encontrado, a sub termina com a msgbox.

Com o exemplo que segue anexo, eu consigo excluir todos os totais, porém não consigo finalizar após esgotar os totais na planilha. E como precisarei continuar o código após a exclusão, tenho que terminar a sub sem erro.

Obrigado!

 
Postado : 13/03/2012 1:03 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Vou tentar te ajudar mas, você está descumprindo as regras isso não é legal.. :evil:

Por favor não faça mais isso... :x

Attt

 
Postado : 13/03/2012 1:15 pm
(@jeffergar)
Posts: 15
Eminent Member
Topic starter
 

alexandrevba
A regra a que se refere é sobre a compactação?
Pois ficou 3KB menor apenas o compactado, pensei que não fizesse tanta diferença.

 
Postado : 13/03/2012 2:00 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!!

Veja se te ajuda..se não for retorne

Sub test()

Application.ScreenUpdating = 0

With Sheets("Plan2").UsedRange
    
    .Replace "", "$$$", xlWhole
    .Replace "Total", "", xlWhole
    
    On Error Resume Next
    .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    On Error GoTo 0
    
    .Replace "$$$", "", xlWhole
    
End With

Application.ScreenUpdating = 1

MsgBox "Retirados todos os totais!", vbInformation

End Sub

Att

 
Postado : 14/03/2012 8:49 am
(@jeffergar)
Posts: 15
Eminent Member
Topic starter
 

Alexandre, muito obrigado!

No exemplo ele funcionou, porém quando coloco todos os registros completos, que são apenas linhas a mais com a mesma formatação, a mesma lógica de distribuição dos registros, a mesma quantidade de coluna, apaga-se todos os registros da planilha, inclusive o que não tem 'total' e retorna um erro '424' informando que o objeto é obrigatório. Quando depuro o erro ele me mostra a linha do comando

    .Replace "$$$", "", xlWhole

Será que isso se deve a quantidade enorme de registros? São 15011 linhas. Isso por que refere-se só do inínio de março até ontem. Se colocar o mês completo certamente dobrará a quantidade.

Poderia continuar a me ajudar? Muito grato!
Precisa da planilha completa?

 
Postado : 14/03/2012 3:01 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Faça um teste...

Sub test()

Dim fname As String, colcount As Long, result, i As Long, n As Long, m As Long, j As Long

With Application

    .DisplayAlerts = 0

    fname = Split(ActiveWorkbook.Name, ".")(0) & ".csv"
    colcount = ActiveSheet.UsedRange.Columns.Count

    .ScreenUpdating = 0

    ActiveSheet.Copy
    ActiveWorkbook.SaveAs fname, xlCSV

    Open fname For Input As #1

    x = Filter(Split(Input(LOF(1), #1), vbCrLf), "Total", 0)

    If UBound(x) > -1 Then
    
        ReDim result(1 To UBound(x), 1 To colcount)

        For i = 0 To UBound(x)
    
            If x(i) <> "" Then
            
                temp = Split(x(i), ",")
                n = n + 1
            
                For m = 0 To UBound(temp)
                    j = j + 1
                    result(n, j) = temp(m)
                Next
        
                j = 0
    
            End If
    
        Next
        
    End If

    Close #1

    Workbooks(fname).Close 0

    Kill fname

    ActiveSheet.UsedRange.Offset(1).Clear

    Range("a2").Resize(n, colcount) = result
    
    .ScreenUpdating = 1
    
End With

End Sub
 
Postado : 14/03/2012 4:29 pm
(@jeffergar)
Posts: 15
Eminent Member
Topic starter
 

Excelente Alexandre! Funcionou para o que eu precisava. Eu já havia preparado um exemplo com mais registros, mas não precisei te enviar.

Muito grato mesmo. Esse código será muito útil em tantas outras coisas que também preciso fazer. Na verdade, preciso primeiro interpretá-lo completamente. Pois, há muitos comandos e funções que desconheço e preciso pesquisar. Na medida do possível irei adaptando em outras ocasiões.

Aliás, vi a sua localização no perfil que aparece na lateral direita do site. É relativamente próximo de mim. Moro em Cariacica. Muito obrigado e espero que continue a contribuir neste espaço. O conhecimento socializável, principalmente voluntariamente, creio ser uma das maiores virtudes humanas e o caminho para o sucesso do coletivo.

Boa noite!

 
Postado : 14/03/2012 5:00 pm