Aprende. Practica. Avanza.
Tema de Excel · Tres niveles

Macros de Excel: empezar con VBA y entender cada paso

Automatiza el formato y el cálculo de una hoja de práctica con tres ejemplos de VBA explicados.

Qué es y para qué sirve

Una macro ejecuta una secuencia de instrucciones. VBA es el lenguaje clásico de automatización en Excel de escritorio; una macro puede cambiar datos, así que debe quedar claro qué libro, hoja y rango utiliza. Empieza en una copia de práctica con una tarea pequeña. La grabadora enseña qué acciones captura Excel, pero conviene revisar el código y evitar depender de la celda seleccionada.

Antes de empezar

Excel de escritorio y una copia de práctica. Crea una hoja llamada Practica, sin tilde, y conserva el archivo original.

Compatibilidad: VBA requiere Excel de escritorio; Excel para la web no crea, ejecuta ni edita macros VBA. Guarda el ejercicio como .xlsm. Estos ejemplos no se han ejecutado en Excel nativo.

Datos para reproducir el ejemplo

Usa una hoja nueva y copia los valores en estas posiciones. Cada nivel indica qué cambios necesitas conservar o restaurar.

Datos del ejemplo
FilaABCD
1ArtículoUnidadesPrecioImporte
2Teclado225
3Ratón310
4Cable45
Fácil

Da formato a un encabezado conocido

Aplicar negrita únicamente a A1:D1 de la hoja Practica.

  1. Crea la hoja Practica con los datos indicados. Desde Programador o Desarrollador abre Visual Basic e inserta un módulo estándar en este libro.
  2. Pega el código y lee su referencia: ThisWorkbook es el libro que contiene la macro; Worksheets("Practica") identifica una hoja concreta.
  3. Vuelve a Excel, abre Macros, selecciona EncabezadoPractica y ejecútala en tu archivo de prueba. Habilita solo código propio que hayas revisado, según las opciones de tu instalación.
Sub EncabezadoPractica()
    ThisWorkbook.Worksheets("Practica").Range("A1:D1").Font.Bold = True
End Sub
Resultado que debes comprobar

A1:D1 queda en negrita; los valores de la tabla no cambian.

Comprueba que lo has entendido

¿Qué sucede si la hoja se llama Práctica, con tilde?

Ver respuesta explicada

El nombre no coincide y la macro falla. Renombra la hoja o ajusta literalmente el nombre del código.

Medio

Escribe fórmulas en un rango explícito

Calcular los tres importes sin depender de qué hoja esté activa.

  1. En el mismo módulo añade ImportesPractica. La variable ws apunta a la hoja de práctica del libro que contiene el código.
  2. FormulaR1C1 usa referencias relativas: desde D, RC[-2] es la columna B de la misma fila y RC[-1] es C. No usa nombres de funciones traducidos.
  3. Ejecuta la macro y revisa D2, D3 y D4 en la barra de fórmulas. Cambia B2 a 3: el importe debe recalcularse porque contiene una fórmula, no un valor copiado.
Sub ImportesPractica()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Practica")
    ws.Range("D2:D4").FormulaR1C1 = "=RC[-2]*RC[-1]"
End Sub
Resultado que debes comprobar

D2 = 50, D3 = 30 y D4 = 20. Al cambiar B2 a 3, D2 = 75.

Comprueba que lo has entendido

¿Escribe esta macro importes en D5 si añades otro artículo?

Ver respuesta explicada

No: el rango es D2:D4. El ejemplo delimita tres registros y no busca automáticamente el final de la tabla.

Avanzado

Revisa todas las entradas antes de escribir

Detener el cálculo si hay un error, una celda vacía o una cantidad negativa en B2:C4.

  1. Restaura los datos originales y añade el código ValidarYCalcular. La primera parte recorre cada celda de B2:C4; todavía no escribe resultados.
  2. Cada comprobación se separa para que un error de celda no llegue a una conversión numérica. IsNumeric acepta también ciertos textos numéricos según la configuración: este ejemplo no exige estrictamente tipo número.
  3. Prueba un valor negativo en B3. La macro muestra un aviso y sale antes de tocar D2:D4; los resultados anteriores, si existían, permanecen y pueden estar desactualizados.
  4. Restaura B3 a 3 y vuelve a ejecutar. Solo después de validar todas las entradas asigna las tres fórmulas. No cubre cantidades máximas, unidades enteras ni filas fuera del rango.
Sub ValidarYCalcular()
    Dim ws As Worksheet
    Dim celda As Range
    Set ws = ThisWorkbook.Worksheets("Practica")
    For Each celda In ws.Range("B2:C4")
        If IsError(celda.Value) Then GoTo DatoInvalido
        If Len(Trim(CStr(celda.Value))) = 0 Then GoTo DatoInvalido
        If Not IsNumeric(celda.Value) Then GoTo DatoInvalido
        If CDbl(celda.Value) < 0 Then GoTo DatoInvalido
    Next celda
    ws.Range("D2:D4").FormulaR1C1 = "=RC[-2]*RC[-1]"
    Exit Sub
DatoInvalido:
    MsgBox "Revisa " & celda.Address & ": usa un valor numérico no negativo."
End Sub
Resultado que debes comprobar

Con datos válidos: 50, 30 y 20. Con una entrada inválida: aviso y ninguna escritura nueva en D2:D4.

Comprueba que lo has entendido

¿Por qué validar y escribir en dos fases?

Ver respuesta explicada

Si escribieses fila a fila, podrías cambiar unas filas y detenerte en otra, dejando una actualización parcial.

Errores que conviene revisar

  • Guarda como .xlsm para conservar VBA; .xlsx no almacena las macros.
  • No actives globalmente todas las macros para seguir un tutorial. Revisa el origen y el código.
  • Este ejemplo escribe en D2:D4: usa exclusivamente la hoja de práctica y conserva una copia.

Funciones para seguir practicando

Fuentes y revisión

Revisión documental: 2026-10-10. Casos con datos ficticios y resultados de referencia. Las instrucciones de interfaz y VBA no se han ejecutado en Microsoft Excel durante esta revisión.

Tu privacidad, tú decides

Puedes aprender y practicar con cualquier elección. El progreso se guarda en este navegador para que puedas continuar; no se sincroniza entre dispositivos.

Si aceptas, Google Analytics nos ayuda a entender qué lecciones se consultan y qué ejercicios funcionan. No enviamos las fórmulas ni los datos que escribes.

Puedes cambiar o retirar tu elección desde Preferencias de privacidad. El progreso de aprendizaje se gestiona por separado en Tu progreso. Consulta cómo tratamos los datos.