sábado, 9 de julho de 2011

VBA: Encontrar a próxima célula vazia

Costumeiramente necessitamos localizar a próxima célula vazia em nossas planilhas, para inserirmos novos dados ou ainda para sabermos o tamanho do Range que teremos para trabalhar.

Sempre utilizei o código abaixo:

    Dim I As Integer
    
    I = 1
    Do While Range("A" & I).Value <> ""
        I = I + 1
    Loop

    Range("A" & I).Select


Porém descobri recentemente que basta utilizarmos o código abaixo para termos o mesmo resultado, poupando um pouco de processamento e bastante os dedos:

    'Localiza a próxima célula vazia
    Range("A1048576").End(xlUp).Offset(1, 0).Select

Análise do código:
  • Range("A1048576")à corresponde a última célula da coluna A
  • .End(xlUp)à localiza a próxima célula preenchida para cima (xlUp)
  • .Offset(1, 0)à significa que a seleção estará uma linha abaixo e na mesma coluna da célula selecionada.

Espero que tenha sido útil, qualquer dúvida ou sugestão de assunto a ser abordado mantenha contato pelos comentários.

Até a próxima...

44 comentários:

  1. Po Valeu mesmo tava atraz do significado dessa linha de código.

    ResponderExcluir
  2. Excelente!
    código muito limpo e que não exigente muito processamento!!
    Obrigado por compartilhar!

    ResponderExcluir
  3. Como faço pra procurar a proxima celula vazia na mesma linha ?

    ResponderExcluir
    Respostas
    1. Boa Noite, Guilherme!

      Já deves ter conseguido resolver seu problema... mas fica o registro de como proceder:

      Para isso basta usar as variações (xlLeft), (xlRigth) no lugar do .End(xlUp)

      Obrigado pela contribuição!

      Excluir
    2. Este comentário foi removido pelo autor.

      Excluir
  4. Eu consigo pegar a linha essa linha preenchida e colar em outra aba?

    ResponderExcluir
    Respostas
    1. Boa Noite, Gabriel!

      Consegue sim, segue um exemplo onde procurarei a linha da última célula preenchida e copiarei-a:

      'Localiza a linha em que consta a última célula preenchida na coluna A
      iFim = Range("A1048576").End(xlUp).Row

      'Copia a última linha preenchida na coluna A
      Rows(iFim & ":" & iFim).Copy

      Obrigado pela contribuição!

      Excluir
    2. Boa Noite, Gabriel!

      Consegue sim, segue um exemplo onde procurarei a linha da última célula preenchida e copiarei-a:

      'Localiza a linha em que consta a última célula preenchida na coluna A
      iFim = Range("A1048576").End(xlUp).Row

      'Copia a última linha preenchida na coluna A
      Rows(iFim & ":" & iFim).Copy

      Obrigado pela contribuição!

      Excluir
  5. Gostaria de saber desse primeiro código:

    Dim I As Integer
    I = 1
    Do While Range("A" & I).Value <> ""
    I = I + 1
    Loop
    Range("A" & I).Select

    Queria aplicar isso de outra forma, só que tentei fazer dessa forma aqui e não reconheceu a inteira I como valor da linha.

    Este é o meu algoritmo:

    I = 3
    Sheets("Banco de Dados").Select
    Do While Range("k" & I).Value <> Range("'Controle Financeiro'!a32")
    I = I + 1
    Loop
    If Range("f32") = Range("p" & I) Or Range("f32") = "" Or Range("f32") = "-" Then

    MsgBox "Não houve alteração de situação.", , "Aviso"

    Sheets("Controle Financeiro").Select
    Range("a32").Select


    Pode me dizer alguma outra forma de usar uma variável pra destacar qual a linha?

    E outra pergunta, pode me explicar porque isso não da certo, e como daria certo? Eu queria colar a função "se" ali embaixo já pronta na célula.

    Range("D27").Select
    ActiveCell.FormulaR1C1 = _
    "=se(b27=""Digite o valor."";""Valor restante."";se(c27=""Valor quitado."";""Valor restante."";b27-c27))"

    ResponderExcluir
    Respostas
    1. Segue dois exmplos para se utilizar, estude-os
      Range("A7").Select
      ActiveCell.FormulaR1C1 = "=IF(R[-6]C&R[-6]C[1]<>"""",R[-6]C+R[-6]C[1],"""")"
      '=SE(A1&B1<>"";A1+B1;"")
      Range("C1").Select
      ActiveCell.FormulaR1C1 = "=IF(RC[-2]&RC[-1]<>"""",RC[-2]+RC[-1],"""")"
      '=SE(A1&B1<>"";A1+B1;"")

      Excluir
  6. BOA NOITE AMIGO MUITO BOM O TÓPICO.
    BEM! EU TENHO UM CÓDIGO QUE GERA TODAS AS COMBINAÇÕES DE 60, TOMADO 6 A 6.
    MAS QUANDO CHEGA NA ULTIMA LINHA (A1 1048576) ELE PARA COMO FAÇO PARA
    QUE ELE CONTINUE E GERE TODAS AS COMBINAÇÕES NA PLANILHA.
    OU SEJA MUDAR DO COLUNA
    .
    ‘C(n, p) = n! / ((n-p)! * p!)
    ‘lPermutações a ser definido, seria o ‘p’ da fórmula acima
    Const lPermutações As Long = 6

    Dim r As Long

    Dim v(1 To 60)

    Sub Teste()
    Dim lElementos As Long
    Dim l As Long

    ‘Popula vetor de elementos
    For l = LBound(v) To UBound(v)
    v(l) = l
    Next l

    ‘C(n, p) = n! / ((n-p)! * p!)
    ‘lElementos seria o ‘n’ da fórmula acima
    lElementos = UBound(v) – LBound(v) + 1

    ‘Contador de linhas para uso no Excel:
    r = 0

    ‘Limpa Planilha ativa
    Cells.Delete

    ‘Inicia recursão:
    Combinação lElementos, lPermutações, 1
    End Sub

    Sub Combinação(n As Long, p As Long, k As Long, Optional s As String)
    If p > n – k + 1 Then Exit Sub
    If p = 0 Then
    ‘Para visualizar o resultado de uma combinação no Excel:
    r = r + 1
    Cells(r, “A”).Resize(1, lPermutações) = Split(s, “|”)
    ‘Se quiser visualizar o resultado na Janela de Verificação imediata, use:
    Debug.Print s
    Exit Sub
    End If
    ‘Recorre novamente:
    Combinação n, p – 1, k + 1, s & v(k) & “|”
    ‘Recorre novamente a partir do elemento anterior:
    Combinação n, p, k + 1, s
    DoEvents
    End Sub

    ResponderExcluir
  7. Olá Rodrigo, bom dia!

    Gostaria de contar com a sua ajuda para escrever um código VBA que busque a próxima celula vazia na mesma linha?
    Haja visto que o código para a busca da celula vazia na coluna funciona perfeitamenta, porém tentei modificar esse código para buscar a celula vazia na culuna mas não obtive êxito apesar de seguir a orientação que você forneceu ao Gilherme.

    ResponderExcluir
    Respostas
    1. Para isso basta usar as variações (xlLeft), (xlRigth) no lugar do .End(xlUp)

      Obrigado pela contribuição!

      Excluir
    2. Para isso basta usar as variações (xlLeft), (xlRigth) no lugar do .End(xlUp)

      Obrigado pela contribuição!

      Excluir
  8. Olá Rodrigo! Muito obrigado por responder ao meu questionamento, porém fiz a alteração que você informou mas o código ainda não está indo para a proxima celula vazia na mesma linha? Fiz o código desta maneira:
    Range("A1048576")(xlRigth).Offset(1, 0).Select

    Porém ele me leva a ultima celula vazia da coluna, mas o que quero é ir para a proxima celula vazia da Linha.

    Desde já agradeço.

    ResponderExcluir
    Respostas
    1. Angelo...

      Faz o seguinte... Utiliza o seguinte código:

      Range("XFD2").End(xlToLeft).Offset(0, 1).Select

      Análise do código:

      Range("XFD2") : corresponde a última célula da linha 2... (o "2" corresponde ao número da linha... por exemplo se vc quiser a 10º linha: coloque "XFD10")
      .End(xlToLeft) : localiza a próxima célula preenchida para esquerda (xlToLeft)
      .Offset(0, 1).Select : significa que a seleção estará na próxima coluna a direita e na mesma linha...

      Esse código seleciona a próxima célula vazia na linha 2...

      Espero ter ajudado...

      Valew...

      Guilherme

      Excluir
    2. Boa noite amigo, gostaria de encontrar a próxima célula vazia a direita e colar valores nela, porém os valores que eu copiei seriam valores um encima do outro, uma coluna de 3 valores, que atualizam toda semana. Pode me ajduar?

      Excluir
    3. Bom dia, Arthur!

      Primeiramente deves copiar o conteúdo, colocando-o na área de transferência:
      Range("D3").Copy 'No meu caso o conteúdo a ser copiado está na célula D3

      Posteriormente para encontrar a próxima célula vazia a direita, será necessário posicionar na primeira célula daquela linha:
      Range("A46").End(xlToRight).Offset(0, 1).Select 'No meu caso utilizei a linha 46

      Por fim será necessário colar o conteúdo copiado:
      ActiveSheet.Paste

      Espero ter ajudado.

      Excluir
  9. Olá Pessoal!
    To com um pequeno problema. Tenho uma tabela mais ou menos assim(abaixo), que quando aparece um x na coluna "500", precisa de acordo com a data, ir pra uma outra tabela, que também precisa mostrar o numero.
    TABELA 1

    Numero Data 500
    100 29/06/2015 X
    101 29/06/2015
    102 30/06/2015


    Tabela 2

    29/06/2015
    500 100

    ResponderExcluir
  10. Muito bom, era o que eu precisa e não estava conseguindo encontrar. DEUS o abençoe!

    ResponderExcluir
  11. Muito bom, era o que eu precisa e não estava conseguindo encontrar. DEUS o abençoe!

    ResponderExcluir
  12. como faço para inciar a localização?

    ResponderExcluir
  13. cara, vc me ajudou muitoooooooooooooooooooooooo
    valeu!

    ResponderExcluir
  14. Olá Rodrigo, preciso encontrar essa linha e automaticamente preenche-la com um numero que digitei em algum local da planilha. Tem como?
    Ou seja. Eu preciso que toda vez que eu digitar um numero na linha C1, esse numero va para uma lista. Exemplo: digitei 250 na C1 e ele vai para a A1. Ai precisei digitar na C1 o numero 260, mas ai quero que ele vá para a A2. Assim criando uma lista sequencial com os numeros que digitei em C1.

    ResponderExcluir
    Respostas
    1. Boa noite,

      Sim é perfeitamente possível, basta colocar o código no evento Worksheet_Change da planilha em questão:

      Algo como:

      Private Sub Worksheet_Change(ByVal Target As Range)
      'Declara a variavel
      Dim iFim As Long

      'Valida se a alteração foi na célula C1
      If Target.Row = 1 And Target.Column = 3 Then
      'Localiza o último registro da coluna A
      iFim = Range("A1048576").End(xlUp).Row + 1

      'Transpõe o valor digitado na célula C1 para a lista contida na Coluna A
      Range("A" & iFim).Value = Range("C1").Value
      End If
      End Sub

      Obrigado pela contribuição!

      Excluir
    2. Bom dia,
      Talvez não esteja no local apropriado mas tenho uma duvida e gostava de a esclarecer:
      É possível num ciclo saltar as linhas vazias sem alterar o valor da variável? isto é:
      exemplo simples

      for x=1to20
      if A="janeiro" then ...
      next x
      exemplo
      A coluna A tem algumas linhas sem registos e Janeiro encontra-se na linha 4 e na 6, queria que o valor de x ao verificar a linha 4 onde se encontra a primeira instrução pretendida fosse 1 e o da linha 6 fosse 2, é possível? como?
      Melhores cumprimentos

      Excluir
    3. Bom dia, Cortez!

      O comando FOR sempre fará o incremento da variável ao passar pelo NEXT, para contornar estes casos normalmente usa-se X = X - 1 para os casos em que não deve ser incrementado.

      Não entendi com clareza qual é sua dúvida e como desejas aplicar, mas vou tentar expressar da forma que entendi... Pelo trecho de código que tu inseriste imagino que desejas percorrer 20 vezes, porém pode haver linhas em branco. Neste caso sugiro que faças da seguinte forma, paraseguir sua estrutura de algoritmo (existem outras formas):

      For X = 1 to 20
      If A = "janeiro" then
      If Selection.Value = "" then
      X = X - 1
      End If
      ...
      End if
      Next X

      Obrigado pela contribuição!

      Excluir
  15. Boa noite Rodrigo
    Preciso de código para imprimir uma planinha que comece A1,mas que após encontrar uma linha vazia,entenda que aquela é a área de impressão. Desde já muito obrigado.

    ResponderExcluir
  16. Boa noite Rodrigo
    Preciso de código para imprimir uma planinha que comece A1,mas que após encontrar uma linha vazia,entenda que aquela é a área de impressão. Desde já muito obrigado.

    ResponderExcluir
  17. Este comentário foi removido pelo autor.

    ResponderExcluir
  18. Este comentário foi removido pelo autor.

    ResponderExcluir
  19. Range("A1048576").End(xlUp).Offset(1, 0).Select
    e se a tabela inteira estiver vazia...?
    ele localiza a1 ?

    ResponderExcluir
  20. Range("A1048576").End(xlUp).Offset(1, 0).Select
    e se a tabela inteira estiver vazia...?
    ele localiza a1 ?

    ResponderExcluir
  21. Ótimo post, exatamente o que eu procurava. Valeu!

    ResponderExcluir
  22. Seguinte: tenho uma planilha onde preciso que:
    Ela pesquise o "nome da coluna", encontre, copie os dados abaixo dela até a ultima linha; depois cole em um local que eu pré estabelecer em outra planilha...

    ResponderExcluir
  23. Pessoal preciso de uma ajuda, estou montando uma planilha de controle de estoque e gostaria que na coluna Qtde qdo eu clicar no botão ADD, somasse o valor 1 e para os próximos registros quando eu chegasse na mesma coluna idem.
    Ex. Data troca | Qtde | Resp.
    29/6/2018 | 1 | Fulano
    29/6/2018 | 1 | Beltrano

    ResponderExcluir
  24. Olá! Preciso de ajuda!
    Estou tentando fazer um macro numa planilha básica, porém, os lançamentos estão sendo sobrepostos ao invés de ir para a ultima célula vazia.
    Segue programação:
    Range("A2:B21").Select
    Selection.Copy
    Sheets("lçto").Select
    Range("A2").End(xlUp).Offset(1, 0).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Sheets("macro").Select
    Range("A2:A21").Select
    Application.CutCopyMode = False
    Selection.ClearContents
    End Sub

    ResponderExcluir
  25. Pro cara que perguntou em 28 de agosto 07:14 Segue :

    Range("A2:B21").Select
    Selection.Copy
    Sheets("lçto").Select
    Range("A10000").End(xlUp).Offset(1, 0).Select ' <- O range deve ser a última celula para dar ".End(xLUp) e Offset(1,0)
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Sheets("macro").Select
    Range("A2:A21").Select
    Application.CutCopyMode = False
    Selection.ClearContents
    End Sub

    ResponderExcluir
  26. Boa tarde! O Código é perfeito, me ajudou muito na produtividade do trabalho.

    ResponderExcluir