Café y Código

6. Rangos y Celdas con VBA

En esta lección aprenderás a:

  • Referenciar celdas con Range("A1") y Cells(fila, col).
  • Leer y escribir con .Value, insertar fórmulas con .Formula.
  • Cambiar colores con .Interior.Color y RGB().
  • Detectar la última fila con datos usando End(xlUp).

Range vs Cells

Vista tipo Excel: la primera fila muestra las letras de columna; la primera columna muestra los números de fila. En las celdas con fórmula (=...), cada referencia lleva un color distinto. Clic en la referencia: resalta solo esa celda. Clic en el resto de la celda (por ejemplo el = o los operadores): resalta todas las celdas citadas. Repetir el mismo gesto sobre lo ya resaltado lo oculta.

Formas de referenciar celdasResumen

Cells(3, 2) y Range("B3") apuntan exactamente a la misma celda B3.

ABC
1 FormaEjemploCuándo usarla
2Range("dirección")Range("B3")Cuando la dirección es fija o conocida
3Range("rango")Range("A1:C10")Para operar sobre un bloque de celdas
4Cells(fila, col)Cells(3, 2)En bucles donde fila o columna varían
5Sheets("Hoja").Range()Sheets("Ventas").Range("A1")Para acceder a una hoja específica

Leer y escribir: .Value, .Formula, .Text

PropiedadesCelda.bas
VBA
1 Range("A1").Value = 500 ' escribe el número 500
2 Range("B1").Value = "Laptop" ' escribe texto
3 Range("C1").Formula = "=A1*1.19" ' inserta una fórmula
4
5 Dim precio As Double
6 precio = Range("A1").Value ' lee el valor numérico
7
8 ' .Text lee el texto formateado visible (ej. "$500.00")
9 Dim texto As String
10 texto = Range("A1").Text

Formato: colores, negrita, alineación

FormatearEncabezado.bas
VBA
1 Sub FormatearEncabezado()
2 With Range("A1:D1")
3 .Interior.Color = RGB(29, 107, 68)
4 .Font.Color = RGB(255, 255, 255)
5 .Font.Bold = True
6 .Font.Size = 12
7 .HorizontalAlignment = xlCenter
8 End With
9 End Sub

Última fila con datos — End(xlUp)

ProcesarTabla.bas
VBA
1 Sub ProcesarTabla()
2 Dim ultimaFila As Long
3 Dim i As Long
4 ultimaFila = Cells(Rows.Count, 1).End(xlUp).Row
5
6 For i = 2 To ultimaFila
7 Cells(i, 3).Value = Cells(i, 1).Value & " - " & Cells(i, 2).Value
8 Next i
9 End Sub

Limpiar un rango

Vista tipo Excel: la primera fila muestra las letras de columna; la primera columna muestra los números de fila. En las celdas con fórmula (=...), cada referencia lleva un color distinto. Clic en la referencia: resalta solo esa celda. Clic en el resto de la celda (por ejemplo el = o los operadores): resalta todas las celdas citadas. Repetir el mismo gesto sobre lo ya resaltado lo oculta.

Métodos para limpiar celdasResumen

Usa ClearContents antes de re-generar un reporte para evitar datos residuales.

AB
1 MétodoQué hace
2Range("A1:C10").ClearContentsBorra el contenido pero conserva el formato
3Range("A1:C10").ClearFormatsBorra el formato pero conserva el contenido
4Range("A1:C10").ClearBorra contenido Y formato completamente
5Range("A1:C10").DeleteElimina las celdas y desplaza filas/columnas

Practica en Excel

Abre Excel (o copia los datos con el botón de la tabla), sigue los pasos y comprueba el resultado en tu hoja.

  1. Escribe nombres en A2:A10 y números en B2:B10. Ejecuta ProcesarTabla() y verifica C.
  2. Agrega FormatearEncabezado() y ejecútala.
  3. Borra valores del medio y vuelve a ejecutar ProcesarTabla() — debe detenerse en la última fila con datos.
  4. Usa ClearContents en A1:C20 y vuelve a ejecutar.

Ejercicios de práctica

Ejercicio 1 — Escribir en celda específica

Crea una Sub que escriba el texto "¡Hola desde VBA!" en la celda D5 usando Range, y el número 42 en E5 usando Cells.

Ver solución sugerida
EscribirCeldas.bas
VBA
1 Sub EscribirCeldas()
2 Range("D5").Value = "¡Hola desde VBA!"
3 Cells(5, 5).Value = 42
4 End Sub

Ejercicio 2 — Fórmula con .Formula

Escribe números en B2:B10. Usa .Formula para insertar la fórmula =SUMA(B2:B10) en la celda B11 y =PROMEDIO(B2:B10) en B12.

Ver solución sugerida
InsertarFormulas.bas
VBA
1 Sub InsertarFormulas()
2 Range("B11").Formula = "=SUM(B2:B10)"
3 Range("B12").Formula = "=AVERAGE(B2:B10)"
4 End Sub

Ejercicio 3 — Formatear encabezado azul

Crea una Sub que formatee A1:E1 con fondo azul oscuro (RGB(13, 71, 161)), letra blanca, negrita y alineación centrada usando With.

Ver solución sugerida
EncabezadoAzul.bas
VBA
1 Sub EncabezadoAzul()
2 With Range("A1:E1")
3 .Interior.Color = RGB(13, 71, 161)
4 .Font.Color = RGB(255, 255, 255)
5 .Font.Bold = True
6 .HorizontalAlignment = xlCenter
7 End With
8 End Sub

Ejercicio 4 — Última fila de la col B

Crea una Sub que encuentre la última fila con datos en la columna B usando End(xlUp) y muestre el número de fila con MsgBox.

Ver solución sugerida
UltilaFila.bas
VBA
1 Sub UltimaFilaB()
2 Dim uf As Long
3 uf = Cells(Rows.Count, 2).End(xlUp).Row
4 MsgBox "Última fila con datos en col B: " & uf
5 End Sub

Ejercicio 5 — Limpiar y llenar

Crea una Sub que: (1) limpie el rango A1:C10 con ClearContents, (2) escriba "Producto", "Precio", "Stock" como encabezados en la fila 1.

Ver solución sugerida
LimpiarYLlenar.bas
VBA
1 Sub LimpiarYLlenar()
2 Range("A1:C10").ClearContents
3 Range("A1").Value = "Producto"
4 Range("B1").Value = "Precio"
5 Range("C1").Value = "Stock"
6 End Sub

Ejercicio 6 — Copiar valor a rango ⭐⭐

Escribe un valor en A1. Usa un bucle For i = 2 To 10 para copiar ese mismo valor en A2:A10.

Ver solución sugerida
CopiarValor.bas
VBA
1 Sub CopiarValor()
2 Dim valor As Variant
3 Dim i As Integer
4 valor = Range("A1").Value
5 For i = 2 To 10
6 Cells(i, 1).Value = valor
7 Next i
8 End Sub

Ejercicio 7 — Formato de moneda ⭐⭐

Escribe números en B2:B20. Crea una Sub que aplique el formato de moneda "$#,##0.00" a ese rango usando NumberFormat.

Ver solución sugerida
FormatoMoneda.bas
VBA
1 Sub FormatoMoneda()
2 Range("B2:B20").NumberFormat = "$#,##0.00"
3 End Sub

Ejercicio 8 — Verificar si tiene fórmula ⭐⭐

Selecciona una celda antes de ejecutar la macro. Crea una Sub que use ActiveCell.HasFormula para verificar si la celda activa contiene una fórmula y muestre el resultado con MsgBox.

Ver solución sugerida
TieneFormula.bas
VBA
1 Sub TieneFormula()
2 If ActiveCell.HasFormula Then
3 MsgBox "La celda " & ActiveCell.Address & " contiene una fórmula."
4 Else
5 MsgBox "La celda " & ActiveCell.Address & " NO tiene fórmula."
6 End If
7 End Sub

Ejercicio 9 — Longitud de texto en col B ⭐⭐

Escribe textos en A1:A15. Usa un bucle For para escribir en B la longitud (Len()) de cada texto de la columna A.

Ver solución sugerida
LongitudTexto.bas
VBA
1 Sub LongitudTexto()
2 Dim i As Integer
3 For i = 1 To 15
4 If Cells(i, 1).Value <> "" Then
5 Cells(i, 2).Value = Len(Cells(i, 1).Value)
6 End If
7 Next i
8 End Sub

Ejercicio 10 — Usar Offset ⭐⭐

Selecciona cualquier celda antes de ejecutar. Crea una Sub que use ActiveCell.Offset(0, 1) para escribir "Celda vecina" en la celda a la derecha de la activa, y Offset(1, 0) para escribir "Celda abajo" en la celda debajo.

Ver solución sugerida
UsarOffset.bas
VBA
1 Sub UsarOffset()
2 ActiveCell.Offset(0, 1).Value = "Celda vecina"
3 ActiveCell.Offset(1, 0).Value = "Celda abajo"
4 End Sub

Ejercicio 11 — Ocultar filas ⭐⭐⭐

Crea una Sub que oculte las filas 3, 5 y 7 usando Rows("3:3").Hidden = True. Crea otra Sub MostrarFilas que las vuelva a mostrar con Hidden = False.

Ver solución sugerida
OcultarFilas.bas
VBA
1 Sub OcultarFilas()
2 Rows("3:3").Hidden = True
3 Rows("5:5").Hidden = True
4 Rows("7:7").Hidden = True
5 End Sub
6
7 Sub MostrarFilas()
8 Rows("3:3").Hidden = False
9 Rows("5:5").Hidden = False
10 Rows("7:7").Hidden = False
11 End Sub

Ejercicio 12 — Resaltar duplicados ⭐⭐⭐

Escribe nombres en A1:A20 con algunos repetidos. Usa dos bucles For anidados para comparar cada celda con las demás; si encuentra un duplicado, colorea ambas en amarillo.

Ver solución sugerida
ResaltarDuplicados.bas
VBA
1 Sub ResaltarDuplicados()
2 Dim i As Integer
3 Dim j As Integer
4 For i = 1 To 20
5 For j = i + 1 To 20
6 If Cells(i, 1).Value <> "" And _
7 Cells(i, 1).Value = Cells(j, 1).Value Then
8 Cells(i, 1).Interior.Color = RGB(255, 255, 150)
9 Cells(j, 1).Interior.Color = RGB(255, 255, 150)
10 End If
11 Next j
12 Next i
13 End Sub

Ejercicio 13 — Ancho de columna automático ⭐⭐⭐

Escribe datos en A1:E10. Crea una Sub que ajuste automáticamente el ancho de las columnas A a E usando Columns("A:E").AutoFit. Luego establece un ancho mínimo de 15 con ColumnWidth para cualquier columna más angosta.

Ver solución sugerida
AjustarColumnas.bas
VBA
1 Sub AjustarColumnas()
2 Dim i As Integer
3 Columns("A:E").AutoFit
4 For i = 1 To 5
5 If Columns(i).ColumnWidth < 15 Then
6 Columns(i).ColumnWidth = 15
7 End If
8 Next i
9 End Sub

Ejercicio 14 — Buscar y marcar ⭐⭐⭐

Escribe productos en A1:A20. Pide al usuario con InputBox el nombre de un producto a buscar. Recorre con For Each y si lo encuentra, colorea la celda en verde y muestra la dirección; si no existe, muestra "No encontrado".

Ver solución sugerida
BuscarYMarcar.bas
VBA
1 Sub BuscarYMarcar()
2 Dim buscar As String
3 Dim celda As Range
4 Dim encontrado As Boolean
5 buscar = InputBox("¿Qué producto buscas?")
6 encontrado = False
7
8 For Each celda In Range("A1:A20")
9 If LCase(celda.Value) = LCase(buscar) Then
10 celda.Interior.Color = RGB(150, 255, 150)
11 encontrado = True
12 End If
13 Next celda
14
15 If Not encontrado Then
16 MsgBox "Producto '" & buscar & "' no encontrado."
17 End If
18 End Sub

Ejercicio 15 — Tabla con formato completo ⭐⭐⭐

Crea una Sub GenerarTablaFormateada que: (1) limpie A1:C11, (2) escriba encabezados en A1:C1 con fondo oscuro y letra blanca, (3) llene 10 filas con datos de ejemplo, (4) aplique bordes a toda la tabla con Borders(xlEdgeBottom).LineStyle = xlContinuous, y (5) ajuste el ancho de columnas con AutoFit.

Ver solución sugerida
TablaFormateada.bas
VBA
1 Sub GenerarTablaFormateada()
2 ' 1. Limpiar
3 Range("A1:C11").Clear
4
5 ' 2. Encabezados
6 With Range("A1:C1")
7 .Value = Array("Producto", "Precio", "Stock") ' truco: asignar array
8 .Interior.Color = RGB(29, 107, 68)
9 .Font.Color = RGB(255, 255, 255)
10 .Font.Bold = True
11 End With
12 Range("A1").Value = "Producto"
13 Range("B1").Value = "Precio"
14 Range("C1").Value = "Stock"
15
16 ' 3. Datos de ejemplo
17 Dim i As Integer
18 For i = 2 To 11
19 Cells(i, 1).Value = "Producto " & (i - 1)
20 Cells(i, 2).Value = (i - 1) * 10.5
21 Cells(i, 3).Value = (i - 1) * 5
22 Next i
23
24 ' 4. Bordes
25 With Range("A1:C11").Borders
26 .LineStyle = xlContinuous
27 .Weight = xlThin
28 End With
29
30 ' 5. AutoFit
31 Columns("A:C").AutoFit
32 End Sub

Pon a prueba tus conocimientos

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.