Trabajando con Rangos
Desliza para mostrar el menú
Selección de rangos
Esto se utiliza durante la exploración; el código en producción evita .Select y prefiere referenciar rangos directamente:
ws.Range("A1:I1").Select ' fine for exploring
ws.Range("A1:I1").Font.Bold = True ' better — skips Select entirely
Offset
Desplaza una referencia relativa a sí misma — se lee como (filas hacia abajo, columnas hacia la derecha), con números negativos moviéndose hacia arriba o a la izquierda:
Dim orderCell As Range
Set orderCell = ws.Range("A2") ' ORD1001
Debug.Print orderCell.Offset(1, 0).Value ' one row down → ORD1002
Debug.Print orderCell.Offset(0, 2).Value ' two columns right → Acme Corp
Debug.Print orderCell.Offset(-1, 0).Value ' one row up → the header, "Order ID"
Cambiar tamaño
Modifica cuántas filas o columnas abarca un rango, manteniendo fija su esquina superior izquierda:
Dim headerRow As Range
Set headerRow = ws.Range("A1")
Set headerRow = headerRow.Resize(1, 9) ' now covers A1:I1, the full header
Combina Offset y Resize para capturar "todo lo que está debajo de la cabecera" sin conocer de antemano la cantidad de filas:
Dim dataRange As Range
Set dataRange = ws.Range("A1").CurrentRegion
Set dataRange = dataRange.Offset(1, 0).Resize(dataRange.Rows.Count - 1)
' dataRange now covers A2:I6 — every order, no header
Rangos con nombre
Asigna a un rango un nombre descriptivo en inglés que puedas usar como referencia en lugar de una dirección:
ThisWorkbook.Names.Add Name:="OrdersTable", RefersTo:=ws.Range("A1:I6")
Debug.Print ws.Range("OrdersTable").Rows.Count
Tarea
- Comenzando desde Range("A2") (ORD1001), utiliza
Offsetpara imprimir el Producto y el Total del pedido que está dos filas debajo (ORD1003), sin escribir nunca "A4", "D4" o "H4". - Usa
CurrentRegion,OffsetyResizejuntos para seleccionar solo las filas de datos (sin la cabecera) e imprime cuántas filas contiene ese rango. - Crea un rango con nombre llamado
OrdersDataque abarque el mismo rango solo de datos y confirma que puedes referenciarlo por nombre en la Ventana Inmediata.
1. Uso de Offset desde A2 para llegar a ORD1003
- Comenzar estableciendo una variable
RangeenA2, que es la celda de referencia, exactamente como en el ejemplo trabajado del capítulo. - "Dos filas abajo" y "misma columna" significa que el primer argumento de
Offset(filas) es 2 y el segundo (columnas) es 0, para la columna Product. - Total es una columna diferente pero la misma fila, por lo que solo cambia el número de desplazamiento de columna entre las dos llamadas a
Offset, no el de fila. - Contar las columnas desde la posición de A2: Product está 3 columnas a la derecha de Order ID; Total está 7 columnas a la derecha.
2. Combinando CurrentRegion, Offset y Resize
CurrentRegionenA1proporciona toda la tabla, incluyendo el encabezado.Offset(1, 0)desplaza todo ese bloque una fila hacia abajo, suficiente para eliminar el encabezado de la parte superior.Resizedebe reducir la cantidad de filas exactamente en la misma cantidad que se desplazó, de lo contrario el borde inferior se extenderá una fila más allá de los datos reales.
3. Creación y prueba de un rango con nombre
- Los rangos con nombre se agregan mediante
ThisWorkbook.Names.Add, asignándole unName:=y unRefersTo:=. Se puede reutilizar la misma expresión de rango del consejo 2 en lugar de construirla de nuevo desde cero. - Para hacer referencia a este rango después, usar
Range("OrdersData"); el nombre se convierte en una cadena de texto simple, no en una variable.
Sub NavigateWithoutHardcoding()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Orders")
' --- 1. Offset from A2 to reach ORD1003 ---
Dim orderCell As Range
Set orderCell = ws.Range("A2")
Debug.Print orderCell.Offset(2, 3).Value ' Product
Debug.Print orderCell.Offset(2, 7).Value ' Total
' --- 2. CurrentRegion + Offset + Resize ---
Dim dataRange As Range
Set dataRange = ws.Range("A1").CurrentRegion
Set dataRange = dataRange.Offset(1, 0).Resize(dataRange.Rows.Count - 1)
Debug.Print "Data rows: " & dataRange.Rows.Count
' --- 3. Named range ---
ThisWorkbook.Names.Add Name:="OrdersData", RefersTo:=dataRange
End Sub
Ejecutar la Sub (F5), luego en la ventana Inmediata (Ctrl+G) escribir:
?Range("OrdersData").Rows.Count
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla