Como percorrer uma lista de dados em uma planilha usando macros no Excel

Resumo

Ao escrever uma macro do Microsoft Visual Basic for Applications (VBA), talvez seja necessário fazer um loop por meio de uma lista de dados em uma planilha. Há vários métodos para executar essa tarefa. A seçã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 conhecido e constante de linhas.
  • Uma lista dinâmica ou uma lista com um número desconhecido de linhas.
  • Uma lista que contém um registro específico.

Mais informações

A Microsoft oferece exemplos de programação somente para ilustração, sem garantias expressas ou implícitas. Isso inclui, mas não está limitado a, as garantias implícitas de qualidade comercial ou conformidade para uma determinada finalidade. Este artigo supõe que você conhece a linguagem de programação que está sendo demonstrada e as ferramentas usadas nos processos de criação e depuração. Os engenheiros de suporte da Microsoft podem ajudá-lo, fornecendo a explicação da funcionalidade de determinado procedimento, mas não modificarão estes exemplos para fornecer funcionalidade adicional nem criarão procedimentos específicos para atender às suas necessidades específicas. Os exemplos de código a seguir pressupõem 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 uma lista com um número constante e conhecido de linhas

Esse código move para baixo a coluna A até 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

Esse código move para baixo a coluna A até o final da lista. (Esse código pressupõe que cada célula na coluna A contém uma entrada até o 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 houver células vazias na coluna A em todos os dados, modifique esse código para considerar essa condição. Verifique se as células vazias estão a uma distância consistente umas das outras. Por exemplo, se todas as outras células da coluna A estiverem vazias (por exemplo, essa situação poderá ocorrer se cada 'registro' usar duas linhas, com a segunda linha recuada uma célula), esse loop poderá ser modificado da seguinte maneira:

     ' 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 um registro específico em uma lista

Esse código move para baixo a coluna A até 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