TOP

VBA-Lección 8.2. Bucles (Loops)

YouLibreCalc for Excel logo

Para practicar lo que acabamos de aprender, recorreremos el proceso de creación de una macro para pintar un tablero de ajedrez de 10x10 (rojo y negro) a partir de la celda actualmente activa. Vamos a ver:

Este es el primer paso del ejercicio:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'El número de celdas que queremos pintar.

    '...
   
End Sub

Comencemos agregando un bucle FOR para ennegrecer la columna A (la constante NB_CELLS es 10). Ver más bajo:

Intenta hacer este ciclo tú mismo.

Ahora puedes comprobarlo con el siguiente código:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'El número de celdas que queremos pintar.

    For r = 1 To NB_CELLS 'r => número de fila
   
        Cells(r, 1).Interior.Color = RGB(0, 0, 0) 'Negro

    Next
   
End Sub

El siguiente paso colorea cada celda subsiguiente de rojo, usando la instrucción IF (según si el número de fila es par o impar). Ver más bajo:

El código para resolver esta subtarea es el siguiente:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'El número de celdas que queremos pintar.

    For r = 1 To NB_CELLS 'r => número de fila
   
       If r Mod 2 = 0 Then 'Mod => es el resto de la división
           Cells(r, 1).Interior.Color = RGB(200, 0, 0) 'Rojo
       Else
           Cells(r, 1).Interior.Color = RGB(0, 0, 0) 'Negro
       End If

    Next
   
End Sub

La condición IF r Modo 2 = 0 significa: si el resto de dividir r entre 2 es 0...

Solo el número de fila que es par tiene un resto de 0 cuando se divide por 2:

Cómo hacer otro bucle que ejecutaría el bucle que ya hemos escrito para 10 columnas. Ver más bajo:

El código para resolver esta subtarea es el siguiente:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Tablero de ajedrez de 10x10 con celdas

    For r = 1 To NB_CELLS 'r => Número de fila
   
        For c = 1 To NB_CELLS 'c => Número de columna
       
           If r Mod 2 = 0 Then
               Cells(r, c).Interior.Color = RGB(200, 0, 0) 'Rojo
           Else
               Cells(r, c).Interior.Color = RGB(0, 0, 0) 'Negro
           End If
           
        Next
    Next
   
End Sub

Ahora el segundo ciclo se inserta en el primero.

Para lograr el siguiente resultado...

Reemplazar:

If r Mod 2 = 0 Then

En:

If (r + c) Mod 2 = 0 Then

Todo lo que queda por hacer es cambiar el código para que el tablero de ajedrez se cree a partir de la celda seleccionada (no A1). Vea abajo:

Para ello escribiremos el siguiente código:

Sub loops_exercise()

   Const NB_CELLS As Integer = 10 'Tablero de ajedrez de 10x10 con celdas
   Dim offset_row As Integer, offset_col As Integer '=> agregar 2 variables
   
   'Desplazamiento (filas) a partir de la primera celda = número de fila de la celda activa actual - 1
   offset_row = ActiveCell.Row - 1
   'Desplazamiento (columnas) a partir de la primera celda = número de columna de la celda activa actual - 1
   offset_col = ActiveCell.Column - 1
   
   For r = 1 To NB_CELLS 'Número de línea
   
        For c = 1 To NB_CELLS 'número de columna
       
            If (r + c) Mod 2 = 0 Then
            'Celda (número de fila + desplazamiento de fila adicional, número de columna +
            'desplazamiento adicional de altavoces)
                Cells(r + offset_row, c + offset_col).Interior.Color = RGB(200, 0, 0) 'Rojo
            Else
                Cells(r + offset_row, c + offset_col).Interior.Color = RGB(0, 0, 0) 'Negro
            End If
           
        Next
   Next
   
End Sub