Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Trabajando con Rangos | Trabajando con datos de Excel
Excel VBA para Automatización Empresarial

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"
Figura 3.3

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

  1. Comenzando desde Range("A2") (ORD1001), utiliza Offset para imprimir el Producto y el Total del pedido que está dos filas debajo (ORD1003), sin escribir nunca "A4", "D4" o "H4".
  2. Usa CurrentRegion, Offset y Resize juntos para seleccionar solo las filas de datos (sin la cabecera) e imprime cuántas filas contiene ese rango.
  3. Crea un rango con nombre llamado OrdersData que abarque el mismo rango solo de datos y confirma que puedes referenciarlo por nombre en la Ventana Inmediata.
Pista
expand arrow

1. Uso de Offset desde A2 para llegar a ORD1003

  • Comenzar estableciendo una variable Range en A2, 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

  • CurrentRegion en A1 proporciona 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.
  • Resize debe 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 un Name:= y un RefersTo:=. 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.
Solución
expand arrow
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
¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 3

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Sección 3. Capítulo 3
some-alt