TOP

VBA-Lección 8.2. Bucles (Loops)

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