VBA – Rango Dinámico

Written by

Editorial Team

Reviewed by

Steve Rynearson

Translated by

Dennis Madrid

Last updated on abril 6, 2022

Este artículo demostrará cómo crear un Rango Dinámico en Excel VBA.

Declarar un rango específico de celdas como una variable en Excel VBA nos limita a trabajar sólo con esas celdas en particular. Al declarar rangos dinámicos en Excel, ganamos mucha más flexibilidad sobre nuestro código y la funcionalidad que puede realizar.

Referenciando Rangos y Celdas

Cuando hacemos referencia al objeto Rango o Celda en Excel, normalmente nos referimos a ellos codificando la fila y las columnas que necesitamos.

Propiedad Range

Utilizando la propiedad Range, en las líneas de código de ejemplo que aparecen a continuación, podemos realizar acciones sobre este rango como cambiar el color de las celdas, o ponerlas en negrita.

Range("A1:A5").Font.Color = vbRed
Range("A1:A5").Font.Bold = True

Propiedad Cells

Del mismo modo, podemos utilizar la propiedad Cells para referirnos a un rango de celdas haciendo referencia directa a la fila y a la columna en la propiedad cells. La fila tiene que ser siempre un número, pero la columna puede ser un número o una letra entre comillas. Por ejemplo, la dirección de la celda A1 puede ser referenciada como

Cells(1,1)

O

Cells(1, "A")

Para utilizar la propiedad Cells para referenciar un rango de celdas, debemos indicar el inicio del rango y el final del mismo. Por ejemplo, para referenciar el rango A1: A6 podríamos utilizar esta sintaxis

Range(Cells(1,1), Cells(1,6)

A continuación podemos utilizar la propiedad Cells para realizar acciones sobre el rango según las líneas de código de ejemplo que aparecen a continuación:

Range(Cells(2, 2), Cells(6, 2)).Font.Color = vbRed
Range(Cells(2, 2), Cells(6, 2)).Font.Bold = True

Rangos Dinámicos con Variables

A medida que el tamaño de nuestros datos cambia en Excel (es decir, utilizamos más filas y columnas que los rangos que hemos codificado), sería útil que los rangos a los que nos referimos en nuestro código también cambiaran. Utilizando el objeto Range anterior podemos crear variables para almacenar los números máximos de fila y columna del área de la hoja de cálculo de Excel que estamos utilizando, y utilizar estas variables para ajustar dinámicamente el objeto Range mientras se ejecuta el código.

Por ejemplo

Dim ultimaFila as integer
Dim ultimaColumna as integer
ultimaFila = Range("A1048576").End(xlUp).Row
ultimaColumna = Range("XFD1").End(xlToLeft).Column

Última fila de la columna

Como hay 1048576 filas en una hoja de trabajo, la variable ultimaFila irá al fondo de la hoja y luego utilizará la combinación especial de la tecla .End(xlUp) para ir a la última fila utilizada en la hoja de trabajo – esto nos dará el número de la fila que necesitamos en nuestro rango.

Última Columna en la Fila

De manera similar, la ultimaColumna se moverá a la Columna XFD que es la última columna en una hoja de trabajo, y luego usará la combinación especial de la tecla .End(xlToLeft) para ir a la última columna usada en la hoja de trabajo – esto nos dará el número de la columna que necesitamos en nuestro rango. Por lo tanto, para obtener todo el rango que se utiliza en la hoja de trabajo, podemos ejecutar el siguiente código:

Sub ObtenerRango()
  Dim ultimaFila As Integer
  Dim ultimaColumna As Integer
  Dim rng As Range

'utilizar la ultimaFila para ayudar a encontrar la última fila del rango
  ultimaFila = Range("A1048576").End(xlUp).Row
'utilizar la ultimaColumna para ayudar a encontrar la última columna del rango
  ultimaColumna = Range("XFD" & ultimaFila).End(xlToLeft).Column
  Set rng = Range(Cells(1, 1), Cells(ultimaFila, ultimaColumna))
'msgbox para mostrarnos el rango
  MsgBox "Rango es: " & rng.Address
  
End Sub

SpecialCells – Última Celda

También podemos utilizar el método SpecialCells del objeto Range para obtener la  última fila y columna utilizadas en una hoja de cálculo.

Sub UsarCeldasEspeciales()
  Dim ultimaFila As Integer
  Dim ultimaColumna As Integer
  Dim rng As Range
  Dim rngBegin As Range
  Set rngBegin = Range("A1")
  ultimaFila = rngBegin.SpecialCells(xlCellTypeLastCell).Row
  ultimaColumna = rngBegin.SpecialCells(xlCellTypeLastCell).Column
  Set rng = Range(Cells(1, 1), Cells(ultimaFila, ultimaColumna))
'msgbox para mostrarnos el rango
  MsgBox "Rango es: " & rng.Address
End Sub

UsedRange

El método Used Range incluye todas las celdas que tienen valores en ellas en la hoja de trabajo actual.

Sub RangoUsado()
  Dim rng As Range
  Set rng = ActiveSheet.UsedRange
'msgbox para mostrarnos el rango
  MsgBox "Rango es: " & rng.Address
End Sub

CurrentRegion

La región actual difiere de UsedRange en que mira las celdas que rodean a una celda que hemos declarado como rango inicial (es decir, la variable rngBegin en el ejemplo de abajo), y luego mira todas las celdas que están ‘adjuntas’ o asociadas a esa celda declarada. Si se produce una celda en blanco en una fila o columna, entonces la CurrentRegion dejará de buscar más celdas.

Sub RegionActual()
  Dim rng As Range
  Dim rngBegin As Range
  Set rngBegin = Range("A1")
  Set rng = rngBegin.CurrentRegion
'msgbox para mostrarnos el rango
  MsgBox "Rango es: " & rng.Address
End Sub

Si utilizamos este método, tenemos que asegurarnos de que todas las celdas del rango que necesitamos están conectadas sin que haya filas o columnas en blanco entre ellas.

Rango Nombrado

También podemos hacer referencia a los Rangos Nombrados en nuestro código. Los Rangos Nombrados pueden ser dinámicos en la medida en que cuando se actualizan o insertan datos, el Nombre del Rango puede cambiar para incluir los nuevos datos. Este ejemplo cambiará la fuente a negrita para el nombre del rango «Enero»

Sub RangoNombrado()
  Dim rng As Range
  Set rng = Range("Enero")
  rng.Font.Bold = True
End Sub

Como verá en la imagen siguiente, si se añade una fila en el nombre del rango, entonces el nombre del rango se actualiza automáticamente para incluir esa fila.

Rango nombrado

Si volvemos a ejecutar el código de ejemplo, el rango afectado por el código sería C5:C9 mientras que en el primer caso habría sido C5:C8.

Tablas

Podemos hacer referencia a las tablas (haga clic para obtener más información sobre la creación y manipulación de tablas en VBA) en nuestro código. Cuando los datos de una tabla en Excel se actualizan o cambian, el código que hace referencia a la tabla se referirá a los datos actualizados de la tabla. Esto es particularmente útil cuando se hace referencia a tablas dinámicas que están conectadas a una fuente de datos externa.

Referencia tabla1

Utilizando esta tabla en nuestro código, podemos referirnos a las columnas de la tabla por los encabezados de cada columna, y realizar acciones sobre la columna según su nombre. A medida que las filas de la tabla aumentan o disminuyen según los datos, el rango de la tabla se ajustará en consecuencia y nuestro código seguirá funcionando para toda la columna de la tabla. Por ejemplo:

Sub EliminarColumnaDeTabla()
  ActiveWorkbook.Worksheets("Hoja1").ListObjects("Tabla1").ListColumns("Octubre").Delete
End Sub
vba-free-addin

Complemento de Ejemplos de Código de VBA

Acceda fácilmente a todos los ejemplos de código que se encuentran en nuestro sitio.

Simplemente navegue al menú, haga clic y el código se insertará directamente en su módulo. Complemento .xlam.

(¡No se requiere instalación!)

Descarga gratuita

Return to VBA Code Examples