Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

Excel: Dicas de VBA - Ciclos

Os ciclos nas folhas de cálculo são bastante comuns quando se usa VBA. O objectivo é percorrer uma lista de valores e executar determinada acção ou validação enquanto este percorre todas as linhas ou colunas.

A execução de um ciclo simples pode ser feito da seguinte forma:

        Dim x As Integer
        For x = 1 To 100
            Cells(x, "A").Value = x
        Next


Isto irá escrever em todas as células da coluna A, da linha 1 à linha 100, um número sequencial. Mas este é um exemplo simples onde definimos onde começa e onde termina.

Para se fazer um ciclo numa lista de dados já existente, devemos sempre saber onde começar e onde terminar. Não tem lógica percorrer todas as linhas de uma folha de cálculo se estão apenas a ser utilizadas 20 ou 30.

Para se determinar a última linha usada em uma lista, devemos utilizar o seguinte método:

        Dim lastRow As Long
        lastRow = Cells(Cells.Rows.Count, "A").End(xlUp).Row


Isto é semelhante a seleccionar a ultima linha da coluna A e pressionar as teclas CTRL + UP ARROW, que fará saltar a selecção para a primeira célula com dados.

Só assim podemos saber com exactidão, qual a última linha utilizada, pois mesmo que existam linhas em branco na lista, todas as linhas serão percorridas.

No entanto, algumas considerações:

  1. Caso existam várias colunas na lista, devemos definir a coluna que tem mais dados;
  2. A variável utilizada para a última linha deverá ser do tipo Long e não Integer, pois uma variável do tipo Integer suporta apenas números até  32,768, sendo este inferior ao total de linhas disponível na folha de calculo.

Depois, é só utilizar a variável para limitar o ciclo:

        Dim lastRow As Long
        Dim x As Integer
        lastRow = Cells(Cells.Rows.Count, "A").End(xlUp).Row
        For x = 1 To lastRow
            Debug.Print(Cells(x, "A").Value)
        Next


Isto irá listar o valor de todas as células na coluna A. Para verificar qual a última coluna utilizada, o método é semelhante:

        Dim lastColum As Integer
        lastColum = Cells(1, Cells.Columns.Count).End(xlToLeft).Column


Mas existem outros métodos de verificar a última linha ou coluna utilizada, usando, por exemplo, o método SpecialCells:

        Dim lastCellRow As Long
        Dim lastCellColumn As Long

        ' Informação da ultima linha
        lastCellRow = ActiveSheet.Cells.SpecialCells(xlLastCell).Row

        ' Informação da ultima coluna
        lastCellColumn = ActiveSheet.Cells.SpecialCells(xlLastCell).Column


No entanto, existem vários registos de que este método não é fiável, e basta apagar algumas linhas para verificar que não o é, e por isso não é recomendado.

Existe ainda uma especial atenção para ciclos onde são eliminadas linhas ou colunas, onde o ciclo deverá ser efectuado do fim para o principio, ou seja, da última linha/colunas para a primeira. Deste modo, um ciclo para eliminar linhas, por exemplo, deverá ser feito da seguinte forma:
 

        Dim lastRow As Long
        Dim x As Integer

        lastRow = Cells(Cells.Rows.Count, "A").End(xlUp).Row

        ' Ciclo que irá percorrer da última para a primeira linha
        For x = lastRow To 1 Step -1

            ' Caso a célula esteja vazia
            If Len(Cells(x, "A").Value) = 0 Then
                Rows(x).Delete()
            End If

        Next

 

Estes são alguns exemplos simples de como fazer ciclos em células e como verificar qual a última linha ou coluna utilizada.

5 comentários:

Pedro Ruiz disse...

Tudo o que eu precisava fazer para a minha aplicaçao eu encontrei aqui, excelente para pessoas que tem um pouco de noçao de programaçao e não quer ver dicas para debutantes.

Muito Obrigado, fiz o que eu deveria em 20 minutos com esse pequeno tutorial.

Merci de la France.

Jorge Paulino disse...

Obrigado pelo comentário Pedro Ruiz!

Euzinhazinha disse...

Olá bom dia,
Uma nota prévia: As suas dicas têm ajudado bastante e pouparam-me IMENSO tempo!

Agora, ao ler este artigo enquanto procurava uma solução para um problema que tenho pensei que poderia ser uma resposta para o tal problema que tenho.

Passo então a explicar:
O meu problema é o seguinte. Tenho uma fórmula em que verifico se a data C está entre as datas A e B, no entanto, se uma das primeiras linhas não está dentro do intervalo que eu defini, a fórmula SE dar-me-á um resultado falso.
Ora o que eu pretendo é que se o resultado for falso, a fórmula continue a procurar a partir da linha seguinte.

Isto é possível resolver com um loop? Ou terá de ser de outra forma... Consegue ajudar-me?

Muito obrigada!
Melhores cumprimentos,
Vera Lúcia.

Jorge Paulino disse...

Olá Vera,

Pode colocar essa questão com mais detalhe aqui: http://www.portugal-a-programar.pt/forum/128-visual-basic-for-applications-vba/ ?

Volpi disse...

Pessoal...Tenho uma variável (um nome) declarada no VBA como faço para resgatar este nome para colocar em uma célula na planilha (se possível através de uma fórmula) Obrigado



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico