Ir ao conteúdo
  • Cadastre-se
edcronos

RESOLVIDO Achar linha em branco "Antes" da ultima linha preenchida com macro

Recommended Posts

Alguem sabe uma linha de comando que ache a linha em branco Antes da ultima linha preenchida ?

tipo:

If Range("i" & 60).End(xlUp).Offset(-1, 0) = "" Then linV = Range("i" & 60).End(xlUp).Offset(-1, 0).Row

 

como as linhas preenchidas e em brando são intermitentes não sei se existe uma maneira sem ser por loop para achar, qualquer coisa serve só para eu poder ter uma base.

 

01 BBBBBBBB

02 BBBBBBBB

03

04 BBBBBBBB

05

06

07 BBBBBBBB

08 BBBBBBBB

09 BBBBBBBB

10 BBBBBBBB <<ultima linha preenchida então tenho que "pegar" a linha 06 ,Se linha 9 estivesse vazia teria que ser ela.

 

 

Edit:

Acabei fazendo por Loop

 

Range("i" & 6000).End(xlUp).Select
While ActiveCell <> ""
    ActiveCell.Offset(-1, 0).Select
Wend
linV = ActiveCell.Row

 

Como poderia deixar isso menor, vou ter que usar varias vezes na macro,

ou algo melhor que isso.

linha em branco.zip

Compartilhar este post


Link para o post
Compartilhar em outros sites

o código abaixo é válido para a coluna "M"

Sub ÚltimaVazia()  Dim UV As Long    UV = Cells(Rows.Count, "M").End(xlUp).Row      If Cells(UV, "M").Offset(-1).Value = "" Then        UV = UV - 1      Else: UV = Cells(UV, "M").End(xlUp).Row - 1      End IfMsgBox "a última linha vazia do bloco de dados é " & UVEnd Sub

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

o código abaixo é válido para a coluna "M"

Sub ÚltimaVazia()  Dim UV As Long    UV = Cells(Rows.Count, "M").End(xlUp).Row      If Cells(UV, "M").Offset(-1).Value = "" Then        UV = UV - 1      Else: UV = Cells(UV, "M").End(xlUp).Row - 1      End IfMsgBox "a última linha vazia do bloco de dados é " & UVEnd Sub
Osvaldo eu ainda estou bringando com o vba, então me explique em que essa solução seria melhor do que a que eu coloquei?

De inicio eu comecei a fazer com if e else mas ia usar For para fazer o loop, ainda nao aprendi como usar outros comando de loop e busca

 

a minha macro ficou assim

 

Sub reagrupa()
Range("GO" & 6000).End(xlUp).Select
While ActiveCell <> ""  :   ActiveC ell.Offset(-1, 0).Select :  Wend: linV = ActiveCell  .Row  

For n = 1 To 30
linP = Range("GO" & linV).End(xlUp).Row
Range("GO" & linP, "Gt" & linP).Copy
Range("GO" & linV).Select
ActiveSheet.PasteSpecial Format:=3, Link:=1, DisplayAsIcon:=False, IconFileName:=False
 Range("GO" & linP, "Gt" & linP).ClearContents
 linV = linV - 1
 Next
End Sub

 

ela junta as linhas de cima, "ainda estou fazendo"

tenho que achar uma maneira de contar as linhas preechidas para determinar o valor do loop, e depois fazer começar numa linha determinada por outra macro.

 

não sei se você se lembra "provavelmente não" eu estou fazendo essa macro para fazer parte daquela outra que reoganiza por data, "mas"  de uma "determinada data" para cima é tudo junto, e todas as colunas são determinadas por variaveis.


Teoricamente a questão em si está resolvida, mas eu gostaria de saber do osvaldo se o uso do While pode acarretar alguma imperfeição na macro, ou se o uso de if seria mais rápido.

A unica coisa que eu tenho certeza com vba e excel é o fato de que,

 

o lógico para gente, no execel vira uma referencia cruzada infinita, agente arruma uma solução para um problema e o excel arruma outro problema pra gente arrumar solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala, Carlos.

O código que postei não é melhor que o seu. É apenas uma alternativa, já que me pareceu que era isso que você buscava.

A minha impressão é que a diferença de desempenho entre os 2 códigos vai depender da quantidade de células preenchidas abaixo da última célula vazia no bloco de dados.

 

O seu código utiliza um "loop" para buscar a primeira célula vazia, de baixo para cima, então se houver, por exemplo, 200 células preenchidas até encontrar a primeira vazia então o tempo de execução será maior do que o segundo código.

 

No entanto, se houver poucas células preenchidas, 5 ou 10, a diferença de tempo de execução entre os códigos será irrelevante.

 

O ponto negativo que vejo no seu código é o uso do comando "Select". Este comando raramente é necessário na execução de qualquer código. Além de provocar a movimentação das telas ainda acarreta tempo adicional na execução. Tente reescrever o "loop" sem utilizar "Select" (tampouco "Activate") e compare os tempos de execução. Abaixo está uma sugestão de comandos que medem o tempo de execução.

Sub Teste()  Dim tempo As Date   tempo = Now    'código  tempo = Now - tempoMsgBox Format(tempo, "ss,ss")End Sub
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

o problema é que eu não sei fazer diferente,

tentei range=range.value,

mas na minha planilha que tem muita formatação condicional ficou mais lento

e em alguns casos como Resize até bagunçou a formatação, em certas macros eu sou obrigado a transferir os dados para uma parte da planilha sem nada de formatação executar e transferir de volta, essa coluna go é uma area da planilha que uso para isso. tenho até uma macro que transfere os dados de volta.

 

todas as minhas macros são executadas a partir de um userbox onde eu digito os nomes das macros que eu quero.

então todas ficam dentro de um Application.ScreenUpdating = False,Application.Calculation = xlCalculationManual, evitando assim o movimento da tela.

 

Private Sub Exec_macros_Click()
Nome_Planilha = ActiveSheet.Name
mac1 = Macro1.Value
mac2 = Macro2.Value
mac3 = Macro3.Value
mac4 = Macro4.Value
mac5 = Macro5.Value
mac6 = Macro6.Value
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

If Nome_Planilha <> "Fixa" Then
If mac1 <> "" Then Application.Run mac1
If mac2 <> "" Then Application.Run mac2
If mac3 <> "" Then Application.Run mac3
If mac4 <> "" Then Application.Run mac4
If mac5 <> "" Then Application.Run mac5
If mac6 <> "" Then Application.Run mac6
End If
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

If Nome_Planilha = "Fixa" Then MsgBox "Por Favor NÃO faça isso Aqui!"
End Sub

 

se tiver alguma sugestão para não usar "Select" (tampouco "Activate"). aceito, faço muitas modificações e testes na minha planilha, então qualquer tempo ganho é lucro,"pena que não seja no bolso".

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×