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

Resumen

Es posible que quiera escribir una macro de Microsoft Visual Basic para Aplicaciones (VBA) para recorrer en bucle una lista de datos de una hoja de cálculo. Existen varios métodos para realizar esta tarea. La sección "Más información" de este artículo incluye los métodos que puede usar para realizar búsquedas en los siguientes tipos de listas:

  • Una lista con un número constante y conocido de filas.
  • Una lista dinámica o una lista con un número desconocido de filas.
  • Una 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 siguientes ejemplos de código se da por hecho que la lista tiene una fila de encabezado que empieza en la celda A1 y que los datos empiezan en la celda A2.

Realizar una búsqueda en una lista con un número constante y conocido de filas

Este código desplaza la columna A hasta el 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

Realizar una búsqueda en una lista dinámica o en una lista con un número desconocido de filas

Este código desplaza la columna A hasta el final de la lista. (Este código da por hecho que hay información en todas y cada una de las celdas de la columna A.)

   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 en todos los datos, modifique este código para tener en cuenta esta condición. Asegúrese de que la distancia entre las celdas sea siempre la misma. Por ejemplo, si en la columna A hay alternativamente celdas vacías y llenas (esto puede producirse si cada entrada utiliza dos filas y la segunda tiene una sangría de 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

Buscar una entrada concreta en una lista

Este código desplaza la columna A hasta el 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