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.

4 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/ ?

Mensagens Recentes



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