Cómo recorrer una lista de datos de una hoja de cálculo mediante macros en Excel

Resumen

Al escribir una macro de Microsoft Visual Basic para Aplicaciones (VBA), es posible que tenga que recorrer en bucle una lista de datos de una hoja de cálculo. Hay varios métodos para realizar esta tarea. La sección "Más información" de este artículo contiene información sobre los métodos que puede usar para buscar en los siguientes tipos de listas:

  • Lista que contiene un número constante conocido de filas.
  • Una lista dinámica o una lista con un número desconocido de filas.
  • Lista que contiene un registro específico.

Más información

Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía, ya sea expresa o implícita. Esto incluye, entre otras, las garantías implícitas de comerciabilidad e idoneidad para un fin determinado. Se considera que está familiarizado con el lenguaje de programación que se muestra y con las herramientas para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento, pero no modificarán estos ejemplos para ofrecer mayor funcionalidad ni crearán procedimientos adaptados a sus necesidades específicas. En los ejemplos de código siguientes se supone que la lista tiene una fila de encabezado que se inicia en la celda A1 y los datos que comienzan en la celda A2.

Para buscar en una lista con un número constante y conocido de filas

Este código mueve la columna A al final de la 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 buscar una lista dinámica o una lista con un número desconocido de filas

Este código mueve la columna A al final de la lista. (En este código se supone que cada celda de la columna A contiene una entrada hasta el 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 Si hay celdas vacías en la columna A a lo largo de los datos, modifique este código para tener en cuenta esta condición. Asegúrese de que las celdas vacías estén separadas por una distancia coherente. Por ejemplo, si todas las demás celdas de la columna A están vacías (esta situación puede ocurrir si cada "registro" utiliza dos filas, con la segunda fila sangrada hacia adentro una celda), este bucle se puede modificar de la siguiente manera:

     ' 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 buscar en una lista un registro específico

Este código mueve la columna A al final de la 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