Novidade a partir da versão 2007 do Excel gerou problema de compatibilidade entre o código VBA de versões antigas.
Entre as versões 2003 e 2007, o número de linhas que pode atingir o Excel em uma planilha evoluiu consideravelmente, passando de 65.536 para 1.048.576. Com isso, há problemas de portabilidade dos arquivos entre as versões devido aos códigos VBA diferentes antes e depois da edição 2007 do programa. Veja aqui alguns métodos para definir a primeira célula vazia da planilha e corrigir essa dificuldade.
Geralmente, é bom saber qual é a primeira linha vazia de uma coluna, principalmente para poder colar conteúdo sobre os dados já existentes. Os diferentes códigos dados aqui são válidos para qualquer versão do Excel.
Nesta dica, vamos fechar todas as células da coluna C para determinar a primeira célula vazia:
Dim lig As Long
Lin = 1 'primeira linha a ser verificada
Do While Not IsEmpty(Range("C" & Lin))
Lin = Lin + 1
Loop
MsgBox "A primeira linha vazia coluna C é a linha: " & Lin
Este procedimento tem desvantagens, principalmente no que se refere à velocidade de execução. Na verdade, em tabelas muito grandes, o looping em todas as linhas é a opção mais lenta. Para se ter uma ideia, em um quadro de 60 mil linhas, ela durou 1,05 segundos no meu PC. O segundo problema seria, se você tivesse, nesta coluna, células vazias. O procedimento vai parar na primeira célula vazia encontrada e ela vai te enviar o número da linha correspondente. Isso nem sempre é prático.
Você deve ter notado que quando você pressiona simultaneamente as teclas Ctrl e Seta para baixo, a célula selecionada torna-se a última célula não vazia de sua coluna. Esta manipulação de teclas pode ser realizada como um código VBA, sem passar pelas SendKeys.
Trata-se da propriedade End do Excel, à qual é atribuído o parâmetro obrigatório xlDown. Com este procedimento, envia-se o número da última linha não vazia da coluna. Para obter a primeira linha vazia, basta adicionar 1:
Dim DLin As Long
DLin = Range("C1").End(xlDown).Row + 1
Observação: se você tem uma (ou mais) célula vazia no meio da sua coluna é esta linha que será devolvida por sua função.
Ao contrário da combinação anterior, ao selecionar a última célula da sua coluna (C65536 ou C1048576, dependendo da versão) e pressionar, ao mesmo tempo, as teclas Ctrl + Seta para cima, você vai selecionar a última célula não vazia da coluna.
O código VBA correspondente, independente de sua versão, seria em pseudocódigo:
Range("C" número_da_linha_total_de_uma_planilha) .End(xlUp).Row
No entanto, o número de linha total de uma planilha, seja qual for a versão, é expressa, em VBA, por
Rows.Count (contagem das linhas)
. Resultando no código:
Dim maLinha As Long minhaLinha = Range("C" & Rows.Count).End(xlUp).Row + 1
Observação: este método, quando sua coluna estiver inteiramente vazia, devolve o valor 2. Na realidade, a primeira linha vazia é a 1. Para remediar isso, é melhor fazer um teste na primeira célula de sua coluna.
O método Find (pesquisar) é usado para procurar um valor em um intervalo de células. Nós podemos adicionar configurações como o sentido e/ou a direção da pesquisa. O método Find devolve a primeira ocorrência que encontrar. Então, basta procurar:
o quê: "qualquer coisa";
onde: "coluna(3)" (= coluna C);
direção: "por colunas";
sentido: "para cima" (= anterior).
Na verdade, vamos reproduzir aqui o método End(xlUp) graças ao Find, pesquisando a primeira célula cheia da nossa coluna, o que resulta, em VBA, em:
Dim Linha As Long Linha = Columns(3).Find("*", , , , xlByColumns, xlPrevious).Row + 1
Observação: como os procedimentos anteriores, convém adicionar 1 para obter o número da primeira linha vazia. Este método devolve um erro quando a coluna estiver inteiramente vazia. Neste caso, utilize um teste na primeira célula. A vantagem deste método é que você utiliza o número da coluna e não a letra. Isto faz ciclos mais fáceis e compreensíveis.
Exemplo de um looping na colunas de A à J para determinar qual é a mais longa:
Dim Lin As Long, númCol As Integer, tempLin As Long, Colonne As String For numCol = 1 to 10 'colunas A à J If Cells(1, númCol) <> "" Then 'teste se primeira linha vazia Linha = Columns(númCol).Find("*", , , , xlByColumns, xlPrevious).Row If Linha > tempLig Then tempLig = Linha: Coluna = Chr(64 + númCol) End If Next MsgBox "A coluna mais cheia é: " & Coluna
Vimos que este método tem uma escrita diferente do End(xlUp). Saiba que a mesma coisa é possível para o End(xlDown) com a ajuda da seguinte sintaxe:
Linha = Columns(3).Find("", , , , xlByColumns, xlNext).Row
Observação: não há mais necessidade de +1, visa-se diretamente a primeira célula vazia. Desta maneira, encontramos o mesmo problema que End(xlDown), ou seja, uma célula vazia no meio da nossa coluna devolve um resultado errado.
Este método permite encontrar a última linha de sua planilha, com ou sem linhas vazias.
Observação: cuidado no caso de supressão de linhas para recuperar o número real da última linha, pois você deverá salvar a pasta:
Dim Linha As Long Linha = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
Vemos aqui que é inútil referenciar uma linha ou uma coluna. Trata-se da última linha absoluta da planilha. Este método também comporta uma propriedade Address, prática para detectar a coluna:
Dim Adresse As String Endereço = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Address
Um dia, você também vai se deparar com o mesmo problema em relação às colunas. Na verdade, nós nem sempre sabemos com antecedência o número de colunas utilizadas na nossa planilha. Para realizar loopings nas colunas, esta informação pode ser indispensável. Os exemplos são todos baseados na busca da última coluna preenchida da linha 4. Por outro lado, contrariamente ao que vimos anteriormente, nós devolveremos o número da última coluna cheia, e não a primeira coluna vazia. As explicações serão menos extensas para as linhas, porque é exatamente a mesma coisa. Veja alguns métodos possíveis.
O método End tem um parâmetro de direção, como já vimos. Esta direção pode muito bem ser para esquerda. Neste ponto, precisamos apenas partir da última coluna da nossa pasta (Columns.Count) e voltar para a esquerda. O equivalente das teclas Ctrl + Seta para à esquerda:
Dim DernCol As Integer ÚltCol = Cells(4, Cells.Columns.Count).End(xlToLeft).Column
Observação: não precisa mais de uma variável do tipo Long. Aqui o tipo Integer basta.
Dim ÚltCol As Integer ÚltCol = Range("A4").End(xlToRight).Column
Dim ÚltCol As Integer ÚltCol = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column
Dim Col As Integer Col = Rows(3).Find("*", , , , xlByRows, xlPrevious).Column
ou:
Dim Col As Integer Col = Rows(3).Find("", , , , xlByRows, xlNext).Column
Saiba que existem outros procedimentos. Nesta dica, tentamos descrever o máximo de situações possíveis. Se estas manipulações não forem suficientes, poste o seu problema no fórum do CCM.
Foto: © RoSonic - Shutterstock.com