Cuando programamos macros en Excel usando VBA es muy habitual trabajar con rangos. Una propiedad de los rangos que modifica su tamaño es resize.
Rango.Resize(filas, columnas).Select
Veamos algunos ejemplos de su uso.
Observe que después de
Resize1
Da color aleatorio a las celdas del rango B4:E8.Sub Resize1()
Dim rojo As Byte, verde As Byte, azul As Byte
Dim R As Range
Set R = Range("B4")
Range("A1").Select
Randomize 'elegimos colores aleatorios
rojo = Int(Rnd() * 100) + 100
verde = Int(Rnd() * 100) + 100
azul = Int(Rnd() * 100) + 100
R.Resize(5, 4).Interior.Color = RGB(rojo, verde, azul)
End Sub
Observe que después de
Resize(5.4)
se ha de poner algo, o bien, .Select
para seleccionar, o bien, .Interior.Color=RGB(rojo, verde, azul)
como en este caso. Pero si después de Resize
se deja sin poner nada nos dará error.Resize2
Permite seleccionar un rango de 3 filas y 2 columnas usando como celda de origen la B4.Range("B4").Resize(3, 2).Select
Sub Resize2()
'Seleccionamos un rango de 3 filas y 2 columnas
'La celda de origen es B4
Range("B4").Resize(3, 2).Select
End Sub
Resize3
Permite seleccionar un rango de 3 filas en la primera columna usando como celda de origen la B4.
Range("B4").Resize(3).Select
Sub Resize3()
'Seleccionamos un rango de 3 filas de la primera columna
'La celda de origen es B4
Range("B4").Resize(3).Select
End Sub
Resize4
Permite seleccionar un rango de 3 columnas en la primera fila usando como celda de origen la B4.Range("B4").Resize(, 3).Select
Sub Resize4()
'Seleccionaremos un rango de 3 columnas de la primera fila
'La celda de origen es B4
Range("B4").Resize(, 3).Select
End Sub
Resize5
Permite seleccionar un rango de 2 columnas en la primera fila usando como celda de origen la B4 y hasta la fila 8, ya que el rango indicado es hasta la E8.Range("B4:E8").Resize(, 2).Select
Sub Resize5()
Range("B4:E8").Resize(, 2).Select
End Sub
Resize6
Permite seleccionar un rango de 3 columnas en la primera fila usando como celda de origen la A4.Range("B4").Offset(, -1).Resize(, 3).Select
Es una maravilla poder usar Offset para cambiar el rango de referencia, y usar, como en el ejemplo, valores negativos. Esto aporta flexibilidad al manejar gran cantidad de rangos cambiantes.
Sub Resize6()
Range("B4").Offset(, -1).Resize(, 3).Select
End Sub
Resize7
Copia el rango amarillo (B11:E15) en el rango superior (B4:E8).Range("B4").Resize(5, 4) = A
Este es un uso muy útil de la propiedad
Resize
ya que nos permite depositar (imprimir) de golpe todo un rango o el contenido de una matriz.Sub Resize7()
Dim A As Variant
Worksheets("Hoja1").Range("A1").Select
A = Range("B11:E15")
Range("B4").Resize(5, 4) = A
End Sub
Resize8
Hace lo mismo que la macro anterior, copia el rango amarillo (B11:E15) en el rango superior (B4:E8).Range("B4").Resize(R.Rows.Count, R.Columns.Count) = A
n
y m
que calculan el número de filas y columnas respectivamente del rango R
. De esta forma hacemos más flexible el código ya que evitamos tener que dar nosotros los parámetros a la propiedad Resize
.Sub Resize8()
Dim A As Variant
Dim R As Range
Worksheets("Hoja1").Range("A1").Select
Set R = Range("B11:E15")
A = R
n = R.Rows.Count
m = R.Columns.Count
Range("B4").Resize(n, m) = A
End Sub
Resize9
Genera una matriz de números aleatorios y la imprime en una posición inicial variable y con un tamaño variable.
Range(Cells(pf, pc), Cells(pf, pc)) .Resize(n, m) = A
Seguidamente se muestra el código de ejemplo utilizado para ilustrar la versatilidad de la propiedad
Resize
.Sub Resize9()
Dim A As Variant
Dim R As Range
Dim tf As Byte, tc As Byte, pf As Byte, pc As Byte
Worksheets("Hoja2").Activate
Range("E7:AQ45").Clear
Randomize
Range("A1").Select
tf = Int(Rnd() * 20) + 1 'tamaño:fila
tc = Int(Rnd() * 20) + 1 'tamaño: columna
pf = Int(Rnd() * 20) + 7 'posición inicial: fila
pc = Int(Rnd() * 20) + 5 'posición inicial: columna
[C6] = tf
[D6] = tc
[C5] = pf
[D5] = pc
Set R = Range(Cells(pf, pc), Cells(pf + tf - 1, pc + tc - 1))
R.Interior.Color = RGB(0, 255, 100)
A = R
n = R.Rows.Count
m = R.Columns.Count
ReDim A(n, m)
For i = 1 To n
For j = 1 To m
A(i, j) = Int(Rnd() * 100)
Next j
Next i
Range(Cells(pf, pc), Cells(pf, pc)).Resize(n, m) = A
End Sub
Veamos un GIF animado donde se aprecia que el rango varía en posición y tamaño de forma aleatoria.
Conviene ver cómo se resolvió en otros casos la necesidad de imprimir de golpe toda una matriz, incluso de gran tamaño. Recomiendo ver los siguientes enlaces a otros post publicados.
No hay comentarios:
Publicar un comentario