Como percorrer em loop uma lista de dados numa folha de cálculo usando macros no Excel

Resumo

Quando escreve uma macro Microsoft Visual Basic for Applications (VBA), poderá ter que percorrer em loop uma lista de dados numa folha de cálculo. Existem vários métodos para realizar essa tarefa. A secção "Mais Informações" deste artigo contém informações sobre os métodos que você pode usar para pesquisar os seguintes tipos de listas:

  • Uma lista que contém um número de linhas conhecido e constante.
  • Uma lista dinâmica, ou uma lista com um número desconhecido de linhas.
  • Uma lista que contém um registo específico.

Mais Informações

A Microsoft fornece exemplos de programação apenas a título informativo, sem qualquer garantia expressa ou implícita, incluindo, sem limitações, as garantias implícitas de comercialização e/ou adequação a um fim específico. Este artigo pressupõe que o utilizador está familiarizado com a linguagem de programação demonstrada e as ferramentas utilizadas para criar e depurar procedimentos. Os técnicos de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às suas necessidades específicas. As seguintes amostras de código assumem que a lista tem uma linha de cabeçalho que começa na célula A1 e dados que começam na célula A2.

Para Pesquisar numa lista com um número Constante e Conhecido de Linhas

Este código move a coluna A para o final da lista:

   Sub Test1()
      Dim x As Integer
      ' Set numrows = number of rows of data.
      NumRows = Range("A2", Range("A2").End(xldown)).Rows.Count
      ' Select cell a1.
      Range("A2").Select
      ' Establish "For" loop to loop "numrows" number of times.
      For x = 1 To NumRows
         ' Insert your code here.
         ' Selects cell down 1 row from active cell.
         ActiveCell.Offset(1, 0).Select
      Next
   End Sub

Para Pesquisar uma Lista Dinâmica ou uma Lista com um Número Desconhecido de Linhas

Este código move a coluna A para o final da lista. (Este código pressupõe que cada célula na coluna A contém uma entrada até ao final.)

   Sub Test2()
      ' Select cell A2, *first line of data*.
      Range("A2").Select
      ' Set Do loop to stop when an empty cell is reached.
      Do Until IsEmpty(ActiveCell)
         ' Insert your code here.
         ' Step down 1 row from present location.
         ActiveCell.Offset(1, 0).Select
      Loop
   End Sub

Nota Se existirem células vazias na coluna A em todos os dados, modifique este código para ter em conta esta condição. Certifique-se de que as células vazias estão a uma distância consistente. Por exemplo, se as células vazias estiverem intercaladas na coluna A (por exemplo, essa situação pode ocorrer se cada 'registo' usar duas linhas, com a segunda linha recuada uma célula), esse loop pode ser modificado da seguinte forma:

     ' Set Do loop to stop when two consecutive empty cells are reached.
     Do Until IsEmpty(ActiveCell) and IsEmpty(ActiveCell.Offset(1, 0))
        ' Insert your code here.
        '
       ' Step down 2 rows from present location.
       ActiveCell.Offset(2, 0).Select
     Loop

Para Pesquisar uma Lista para um Registo Específico

Este código move a coluna A para o final da lista:

   Sub Test3()
      Dim x As String
      Dim found As Boolean
      ' Select first line of data.
      Range("A2").Select
      ' Set search variable value.
      x = "test"
      ' Set Boolean variable "found" to false.
      found = False
      ' Set Do loop to stop at empty cell.
      Do Until IsEmpty(ActiveCell)
         ' Check active cell for search value.
         If ActiveCell.Value = x Then
            found = TRUE
            Exit Do
         End If
         ' Step down 1 row from present location.
         ActiveCell.Offset(1, 0).Select
      Loop
   ' Check for found.
      If found = True Then
         Msgbox "Value found in cell " & ActiveCell.Address
      Else
         Msgbox "Value not found"
      End If
   End Sub