Dicas de VBA – Ciclos
Dentro da parceria que o Pplware teve o prazer de encetar com a revista PROGRAMAR eis mais um novo artigo repleto de dicas úteis e simples de VBA, para Excel.
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:
- Caso existam várias colunas na lista, devemos definir a coluna que tem mais dados;
- 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, mesmo na versão do Excel 2003, 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 princípio, 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.
Página Pessoal do Autor: Jorge Paulino
Este artigo tem mais de um ano
Ganda artigo!
Gostaria de poder complementar este excelente artigo com a informação de que existe outro metodo que eu gosto bastante chamado “UsedRange” que devolve o range ocupado por dados de uma folha (atenção que inclui celulas vazias que já tiveram dados e agora não, ou seja já foram “used”)
Criei esta pequena função para me ajudar quando preciso de saber o tamanho dos dados de uma folha antes de efectuar um ciclo sobre os dados…
Function getLastRow(ByRef ws As Worksheet) As Long
getLastRow = ws.UsedRange(ws.UsedRange.Cells.Count).Row
End Function
Mais um excelente artigo do guru da Microsoft Jorge Paulino.
Bem, eu cá acho que o VBA já era. O que está a dar é C#.
Deves estar a confundir VBA (Visual Basic for Aplications) com o Visual Basic (do Visual Studio .NET) mais conhecido para programar aplicações “stand-alone”…
O VBA executa dentro do Access, Excel, Word (e acho que outros), coisa que não podes fazer com C# (penso eu, corrigam-me se estiver enganado)
Se quiseres comparar o C# com outra linguagem compara-o por exemplo com algo do seu nível, por exemplo Java.
É verdade ACampos, C# não executa dentro do Access, Excel, Word, Outlook nem de muitas outras aplicações que permitem usar VBA como AutoCad, Primavera, MathCad, Zenon, RSView, etc, etc.
C# pode sim ser comparado com VB.NET, Java, etc.
Boa tarde. Eu estou a fazer um projecto VB neste momento, em que consiste no jogo do 24. Tudo tem corrido bem, até a este momento. Então, estou a fazer uma coisa de cada vez, a começar pelas contas de mais, só que da maneira que estou a tentar fazer, não me deixa repetir os IFs que estou a utilizar. Alguém me pode dar uma mãozinha pelo skype, msn ou outro? Sou novo ainda no Visual Basic. Cumprimentos pessoal! 🙂
@Freddiieee Faria,
Passa pelo fórum e mostra o que tens feito 😉
Qual fórum? Da pplware ou mesmo o seu? Visitei o seu site mas não encontrei nenhum fórum. De qualquer maneira, meti aqui o projecto: http://www.megaupload.com/?d=HYCCKU1V
Começei pela conta de mais, tenho que completar os IFs:
If cont = 2 Then
bconta1.Text = totala
End If
Ainda experimentei meter um elseif mas sem resultado claro. Atenção que ainda está muito incompleto o programa, pois começei à pouco tempo e não tenho assim tanto tempo livre quanto isso para continuar. Agradeco imenso a disponibilidade! :p
Já me consegui desenrascar. Muito obrigado de qualquer maneira. 🙂 abraços.
o forum é http://www.portugal-a-programar.org
e expõem o teu projecto e as tuas duvidas nesta secção http://www.portugal-a-programar.org/forum/index.php/board,226.0.html
Ja andava a espera de um artigo assim faz algum tempo, é favor continuar com a rubrica VBA.
Uma opinião. É que tal fazer o Artigo de modo a que se possa imprimir ou guardar como “Manual VBA”? Era optimo.
Abraço
Fantástico, fantástico era fazeres um artigo paralelo para LibreOffice…
Abraço!
Bom dia,
Necessito de uma ajuda para este código em VBA..
Tenho este código que está a funcionar como pretendido, mas quero que seja executado apenas quando as celulas da coluna “x” estiverem vazias..
Precisava de uma ajuda o mais rapido possível..
Sub While_LoopIS()
Application.ScreenUpdating = False
Dim i, j As Integer
Dim var1, var2 As String
Dim a, B As String
Dim cells1, cells2, cells3, cells4 As String
i = 4
Sheets(“LOP TI Tarefas IS”).Select
Do
cells1 = “A” & i
cells2 = “B” & i
Sheets(“LOP TI Tarefas IS”).Select
ActiveSheet.Cells(i, 1).Select
var1 = ActiveCell.Value
ActiveSheet.Cells(i, 2).Select
var2 = ActiveCell.Value
Sheets(“LOP TI Tempos IS”).Select
ActiveSheet.Cells(i, 1).Value = var1
ActiveSheet.Cells(i, 2).Value = var2
ActiveSheet.Cells(i, 5).Value = “T”
i = i + 1
Sheets(“LOP TI Tempos IS”).Select
Loop While (Range(cells1) vbNullString)
j = i – 1
i = 4
Sheets(“LOP TI Projectos IS”).Select
Do
cells1 = “A” & j
cells2 = “B” & j
Sheets(“LOP TI Projectos IS”).Select
ActiveSheet.Cells(i, 1).Select
var1 = ActiveCell.Value
ActiveSheet.Cells(i, 2).Select
var2 = ActiveCell.Value
Sheets(“LOP TI Tempos IS”).Select
ActiveSheet.Cells(j, 1).Value = var1
ActiveSheet.Cells(j, 2).Value = var2
ActiveSheet.Cells(j, 5).Value = “P”
i = i + 1
j = j + 1
Sheets(“LOP TI Tempos IS”).Select
Loop While (Range(cells1) vbNullString)
Application.ScreenUpdating = True
End Sub