Notifications
Clear all

Como Fazer: Macro para excluir Linhas

9 Posts
2 Usuários
0 Reactions
3,579 Visualizações
Eron
 Eron
(@eron)
Posts: 102
Illustrious Member Admin
Topic starter
 

Macro pronta para excluir linhas.
Autor: AleXcel

Sub fnDeletaLinha()
    Dim lngLinha As Long
 
    On Error Resume Next
    lngLinha = InputBox("Número da linha que será apagada: ", "Apagar uma linha", ActiveCell.Row)
    On Error GoTo 0
    If Val(lngLinha) <> 0 Then
        If lngLinha <= ActiveSheet.Rows.Count Then
            ActiveSheet.Cells(lngLinha, 1).EntireRow.Delete xlShiftUp
        Else
            MsgBox "Esta planilha possui apenas " & ActiveSheet.Rows.Count & " linhas!"
        End If
    Else
        'Nada feito...
    End If
End Sub
 

Se não quiser fazer a chamada a partir de um botão Commandbutton, pode-se executá-la pressionando ALT+F8 > Executar.

Eron
CRA/RS 27.563
Administrador Fórum Planilhando

 
Postado : 07/09/2011 7:59 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa Eron, aprendi muito com o grande AleXcel no forum do Yahoo ExcelBr, ele foi um dos que mais me ajudram e me ensinaram desde a época que comecei a engatinhar no VBA, vou até aproveitar e fazer uma visita lá, que já faz algum tempo que não acesso o yahoo.

E para não ficar somente no elogio, vou aproveitar um pouco do que ele me ensinou e fazer umas alterações na rotina, possibilitando a contagem das linhas preenchidas e só deletar se realmente a linha estiver dentro desta contagem:

Sub fnDeletaLinha2()
    Dim lngLinha, UltimaLinha As Long
    
    UltimaLinha = Range("A" & Rows.Count).End(xlUp).Row
    
    On Error Resume Next
    lngLinha = InputBox("Número da linha que será apagada: ", "Apagar uma linha", ActiveCell.Row)
    
    On Error GoTo 0
    
    If Val(lngLinha) <> 0 Then
            
        If lngLinha <= ActiveSheet.Rows.Count Then
            If lngLinha > UltimaLinha Then
            
                If MsgBox("A Última Linha preenchida é a Linha " & UltimaLinha & Chr(13) & "Deseja Continuar ? ", vbQuestion + vbYesNo, "Continuar...") = vbNo Then
                    Exit Sub
                Else
                    GoTo slDeleta
                End If
                
            Else
slDeleta:
                ActiveSheet.Cells(lngLinha, 1).EntireRow.Delete xlShiftUp
            End If
        Else
            MsgBox "Esta planilha possui apenas " & ActiveSheet.Rows.Count & " linhas!"
        End If
    Else
        'Nada feito...
    End If
        
    End Sub

abraços

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 07/09/2011 7:25 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Eron e colegas do forum, realizei as adaptações na rotina do Alex, e alem de posta-la aqui enviei ao mesmo, o qual mais uma vez me gratificou com mais uma lição, a qual resolvi compartilhar, uma vez que acabei declarando erroneamente a variável, segue a resposta do Alex:

Mauro,

Seu código está 99% certo. Seguem três observações importantes:

1) No dimensionamento de lngLinha, você a definiu como Variant - de forma implícita, que é a que o VBA atribui por padrão, caso o programador não a defina explicitamente com seu tipo de dados. O ideal, como comentei, é definí-la explicitamente, neste caso, como Long. Por conta disto, o código falhou nesta linha:

If lngLinha <= ActiveSheet.Rows.Count Then

Porquê? O InputBox retornou o número da linha como TEXTO e, como sua variável lngLinha é Variant, ela assume o TEXTO “10”.

2) O código está presumindo que o intervalo usado é apenas o da coluna A, o que pode não ser verdadeiro. Veja a imagem. Talvez utilizar o retorno de UsedRange seja ideal.

3) Se o código pretende limitar a tarefa à provável última linha, está faltando igualar lngLinha = UltimaLinha, caso o usuário responda Sim aqui:
If MsgBox("A Última Linha preenchida é a Linha " & UltimaLinha & Chr(13) & _
"Deseja Continuar ? ", vbQuestion + vbYesNo, "Continuar...") = vbNo Then
Exit Sub

Else

lngLinha = UltimaLinha

GoTo slDeleta

End If

No mais, realmente, apagar uma linha fora de contexto, não tem sentido, e você foi direto ao ponto.

Aproveito para recomendar a leitura das Convenções RVBA do Greg Reddick, que postei aqui na Lista, em Arquivos > Apostilas( http://br.groups.yahoo.com/group/ExcelB ... stilas%20/). Ela aborda vários assuntos importantes para observação pelo programador, de forma a fazer o melhor, desde o início. Está traduzida para Pt-Br e aceito comentários para melhorar essa tradução. O original, em Inglês, é acessado aqui( http://www.xoc.net/downloads/rvbacc.pdf ). Não menos importantes são as Convenções de Nominação do VBA, também do Greg. Estas eu ainda não as traduzi. Estão aqui ( http://www.xoc.net/standards/rvbanc.asp ).

Para quem quiser se cadastrar : http://br.groups.yahoo.com/group/ExcelBr/

A apostila traduzida, por AlexExcel:

"Se NÃO sei pergunto, se SEI compartilho"

Abraços

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 08/09/2011 9:39 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Continuando o assunto, eu cheguei a realizar as adaptações recomendadas, e enviei ao Alex com uma obs conforme abaixo, então segue minha resposta e a rotina readaptadada:

ALeXceL,

Mais uma vez agradeço pela aula, apesar de estar lidando com VBA a um bom tempo, e como tudo que sei, foi atraves dos Foruns e colegas como você que sempre tiveram disposição de ajudar e ensinar, eu realmente não sabia desta variação de definíção de forma implícita ou explicita, sabia que toda Variavel não definida, o VBA assume como Variant, mas, sempre é tempo de aprender.
Baixei as apostilas, vou imprimi-las e ler com atenção, o site que indicou tambem é ótimo, o meu ingles não é aquelas coisas, mas na medida do possivel vou ver se consigo dar minha contribuição.

Voltando a rotina, pode parecer engraçado, mas quando fiz as adaptações, eu tinha declarado lngLinha e UltimaLinha "Explicitamente", ou seja separadas como Long, fiz os testes antes e correu tudo Ok, mas na hora de postar, resolvi limpar o código e na limpesa deixei-as "implicitas", se eu soubesse disto antes, não teria feito, mas o lado bom, é que aprendi mais uma, agradeço mais uma vez.

De fato, eu limitei o intervalo pela Coluna "A", não havia penssado na possibilidade que citou.

Quanto a Opção de Continuar "Sim", a intenção foi justamente a de alertar que se apagara uma linha vazia que está fora do contexto das linhas preenchidas, e com a sua sugestão, se continuarmos, será apagada a última linha definida na contagem, o que talvez não seja a linha desejada, então, junto com sua sugestão eu alteraria tamebm a mensagem avisando o usuário desta ocorrência.

Sendo assim, segue novamente a rotina com as alterações, e por favor, se tiver mais algum erro, avise-me.

Sub fnDeletaLinha3()
    Dim lngLinha As Long
    Dim UltimaLinha As Long
  
    UltimaLinha = ActiveSheet.UsedRange.Rows.Count
   
    On Error Resume Next
    lngLinha = InputBox("Número da linha que será apagada: ", "Apagar uma linha", ActiveCell.Row)
  
    On Error GoTo 0
  
    If Val(lngLinha) <> 0 Then
          
        If lngLinha <= ActiveSheet.Rows.Count Then
            If lngLinha > UltimaLinha Then
          
                    If MsgBox("Foi definido uma linha fora do contexto" & Chr(13) & _
                        "se continuar, será apagada a linha :- " & UltimaLinha & Chr(13) & _
                        " que é a última Linha Preenchida :- " & Chr(13) & _
                        "Deseja Continuar ? ", vbQuestion + vbYesNo, "Continuar...") = vbNo Then
                   
                    Exit Sub
               
                Else
               
                    lngLinha = UltimaLinha
                   
                    GoTo slDeleta
                   
                End If
              
            Else
slDeleta:
                ActiveSheet.Cells(lngLinha, 1).EntireRow.Delete xlShiftUp
               
            End If
           
        Else
       
            MsgBox "Esta planilha possui apenas " & ActiveSheet.Rows.Count & " linhas!"
       
        End If
       
    Else
        'Nada feito...
    End If
      
End Sub

Desde já agradeço a compreensão dos colegas.

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 08/09/2011 9:44 pm
Eron
 Eron
(@eron)
Posts: 102
Illustrious Member Admin
Topic starter
 

Mauro,

O Alex é fera, conheço ele a mais de 10 anos. Pena que ele não participa aqui conosco. Sendo assim, tomo a liberdade de (sempre pedido autorização) de publicar suas respostas geniais aqui no Fórum.

Eron
CRA/RS 27.563
Administrador Fórum Planilhando

 
Postado : 11/09/2011 5:24 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

De fato Eron, ele é 100% e sempre me auxiliou, e em relaçao as alterações que fiz, enviei a ele, o qual me retornou outra, com novas observações pelo fato de ele estar usando o excel 2010, só não postei aqui ainda, pois não fiz os testes que ele me pediu (na v 2003), mas já está no forum do yahoo.
Quanto a autorização, eu já havia falado com ele, e naquela época, disse que eu podia divulgar sem problemas, e apezar de ele não ter exigido, sempre tomo o cuidado de passar os devidos creditos.

Assim que eu fizer os testes, e reenviar a ele posto aqui.

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 11/09/2011 5:33 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Amigos

Lendo este topico..achei muito legal este codigo
tambem estou aprendendo muito com vcs..

já agradeço de antemão

So tive uma dúvida..em que situação exatamente poderia usar este codigo..poderiam me orientar

valeu

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 02/10/2011 6:29 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Andrevioti, quanto a :

So tive uma dúvida..em que situação exatamente poderia usar este codigo..poderiam me orientar

A mesma foi consttruida para atender uma questão expecifica solicitada por um usuário no forum ExcelBr, que foi o seguinte:

Alguem tem uma macro que exclua uma determinada linha?

ou seja quero informar o numero da linha em um caixa de texto e clicar em um botão de comando, pronto.

Como pode ver, a rotina faz exatamente o que foi solicitado, e dependendo do que se quer pode-se adapta-la para outras situações.

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 02/10/2011 10:37 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Entendi Mauro

muito obrigado por responder..

a cada dia aprendo mais!

flw

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 02/10/2011 3:40 pm