Imagina que cada lunes tienes que mandar a tu equipo el informe de ventas del mes en PDF. Si lo haces a mano —Archivo > Guardar como, elegir PDF, la carpeta, el nombre— son cinco clics por hoja y siempre se te olvida una. Con VBA automatizas esa rutina: una vez escrita, la lanzas con un atajo y Excel solo guarda el PDF, lo nombra con la fecha o el nombre del cliente y, si quieres, lo abre en tu visor. Este tutorial te lleva, paso a paso, desde abrir el editor de VBA hasta crear un PDF por alumno con un bucle, abrirlo con un comando del sistema y arreglar los cuatro errores que de verdad pasan al guardar. Funciona en Excel 2007 y posterior, también en Excel para la web y en Mac; la grabadora de macros y ExportAsFixedFormat están disponibles en todas esas versiones.
Qué es el PDF en Excel y por qué aprender a manejarlo con VBA
Un PDF es un archivo de imagen fija: lo que ves en pantalla queda tal cual en el documento, sin que dependa del Excel o la impresora de quien lo abra. Por eso es el formato ideal para distribuir una hoja de cálculo terminada (un informe, un presupuesto, un boletín de notas) sin que nadie toque tus fórmulas ni rompa un dato. El caso típico es el informe mensual que tu equipo espera cada lunes: lo abres, exportas a PDF, lo subes a la carpeta compartida y te vas a desayunar.
Con VBA el "exportar a PDF" deja de ser un trámite manual. En lugar de hacer clic en cada hoja, escribes una macro que recorre el libro, llama al método ExportAsFixedFormat y genera el archivo por ti. Cuando lo dominas, ese mismo esquema sirve para enviar un PDF por correo, archivarlo con la fecha en el nombre o imprimir varios informes en lote. La curva de aprendizaje es corta: el editor de VBA, una propiedad de fórmula, un bucle For y el cuadro de diálogo GetSaveAsFilename cubren el 90% de lo que harás en el día a día.
El editor de VBA y la grabadora de macros
VBA (Visual Basic for Applications) es el lenguaje de programación que llevan todas las aplicaciones de Office desde los años noventa. Dentro de Excel, VBA puede leer y escribir celdas, mover hojas, abrir archivos, enviar correos y, como verás aquí, generar PDFs. Todo el código VBA de un libro vive en módulos: pequeñas ventanas de texto donde escribes las instrucciones que Excel ejecutará cuando llames a la macro.
La forma más rápida de aprender VBA no es leer manuales: es usar la grabadora de macros (Programador > Grabar macro). Pulsas Grabar, haces la acción a mano (por ejemplo, exportar una hoja a PDF) y Excel traduce cada clic a su instrucción VBA. Al parar la grabación tienes el código hecho y solo te queda leerlo, entenderlo y adaptarlo.
Activar la pestaña Programador
La pestaña Programador viene oculta por defecto. Para mostrarla:
- Clic en
Archivo > Opciones > Personalizar cinta de opciones. - En la columna derecha "Pestañas principales" busca Programador y marca su casilla.
- Pulsa
Aceptar. La pestaña aparece a la derecha de Vista.
Abrir el editor con Alt+F11 y crear un módulo
Pulsa Alt+F11 y se abre la ventana del editor de Visual Basic: a la izquierda, el árbol de proyectos con tus libros; a la derecha, la zona en blanco donde escribirás el código. Para añadir un módulo:
- En el menú del editor,
Insertar > Módulo. - Aparece una página en blanco con las palabras
Option Explicitarriba (a veces) y debajo dos líneas:Sub NombreDeLaMacro()yEnd Sub.
Sub Saludo()
Range("A1").Value = "Hola"
MsgBox "Listo"
End Sub
Todo lo que va entre Sub y End Sub se ejecuta cuando lanzas la macro (Alt+F8 desde Excel, eliges el nombre y Ejecutar).
La grabadora de macros y el código que escribe
Con Programador > Grabar macro, nombre corto y Aceptar, Excel empieza a traducir lo que haces. Ve a Archivo > Guardar como > PDF, elige la carpeta y guarda. Pulsa Detener grabación en la misma pestaña Programador. Vuelve al editor (Alt+F11), abre el módulo que creó la grabadora y verás algo como:
Sub ExportarPDF()
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
FileName:="C:\Informes\Enero.pdf", _
Quality:=xlQualityStandard
End Sub
Esa línea ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF … es la misma que usaremos en todo el tutorial. La grabadora es tu diccionario: te dice cómo se llama cada cosa en VBA.
Las cuatro propiedades de fórmula de Range
Range es un objeto que representa una celda o un grupo de celdas. Tiene cuatro propiedades para leer o escribir la fórmula que contiene:
| Propiedad | Estilo de referencia | Idioma de las funciones | Separador |
|---|---|---|---|
Formula |
A1 | Inglés (SUM, VLOOKUP) | Coma |
FormulaR1C1 |
R1C1 (fila/columna) | Inglés | Coma |
FormulaLocal |
A1 | Español del usuario (SUMA, BUSCARV) | Punto y coma |
FormulaR1C1Local |
R1C1 | Español del usuario | Punto y coma |
La regla de oro: si el código VBA lo escribes tú y quieres que funcione en un Excel en español, usa FormulaLocal; si lo copias de una página en inglés o quieres que funcione en cualquier idioma, usa Formula.
Formula en inglés con comas frente a FormulaLocal en español con punto y coma
Range("D2").Formula = "=SUM(A2:B2)"
Range("D2").FormulaLocal = "=SUMA(A2:B2)"
=SUM(A2,B2) y =SUMA(A2,B2).FormulaR1C1: referencias por fila y columna
R1C1 describe la celda por la distancia a la celda actual: R[-2]C[1] significa "dos filas arriba y una columna a la derecha". Es perfecto para escribir la misma fórmula en un rango arrastrando con un bucle.
Sub PonerFormula()
Range("D2").FormulaR1C1 = "=R[-2]C[1]"
End Sub
En D3 la fórmula aparece como =B2 (porque apunta a la celda dos filas arriba y una columna a la derecha de D3).
Exportar una hoja de Excel a PDF desde VBA
El libro que usaremos se llama Informes.xlsx y tiene una hoja llamada Enero con las ventas del mes. Empezamos exportando esa hoja tal cual.
El método ExportAsFixedFormat y sus argumentos
ExportAsFixedFormat convierte una hoja, un rango o una selección a PDF (también a XPS) sin abrir el cuadro "Guardar como". La sintaxis es:
| Argumento | Qué hace | Valores |
|---|---|---|
Type |
Tipo de archivo | xlTypePDF o xlTypeXPS |
FileName |
Ruta completa del PDF | Cadena de texto |
Quality |
Calidad del PDF | xlQualityStandard (imagen) o xlQualityMinimum (texto seleccionable) |
IncludeDocProperties |
Si se incluyen las propiedades | True o False |
OpenAfterPublish |
Abre el PDF al terminar | True o False |
IgnorePrintAreas |
Ignora las áreas definidas | True o False |
Sub ExportarEnero()
Worksheets("Enero").ExportAsFixedFormat _
Type:=xlTypePDF, _
FileName:=ThisWorkbook.Path & "\Enero.pdf", _
Quality:=xlQualityStandard, _
OpenAfterPublish:=True
End Sub
ThisWorkbook.Path devuelve la carpeta donde está guardado el libro, así que el PDF se crea al lado del .xlsx sin tener que escribir la ruta a mano.
Exportar varias hojas en un solo PDF
Para meter dos o más hojas en el mismo archivo se pasa un Array con sus nombres. El PDF lleva tantas páginas como hojas, en el orden del array.
Sub ExportarDosMeses()
Worksheets(Array("Enero", "Febrero")).ExportAsFixedFormat _
Type:=xlTypePDF, _
FileName:=ThisWorkbook.Path & "\Enero-Febrero.pdf"
End Sub
C:\Informes\Enero-Febrero.pdf (7 páginas: las 3 de Enero + las 4 de Febrero)
Si en lugar de Worksheets(Array(...)) usas Selection, solo entra en el PDF lo que el usuario tenga seleccionado con el ratón: útil para exportar un rango concreto.
Elegir la carpeta de destino con un cuadro de diálogo
Para que el usuario decida dónde guardar, usa Application.GetSaveAsFilename, que abre el mismo cuadro que Archivo > Guardar como y devuelve la ruta elegida (o False si cancela).
Sub ExportarConDialogo()
Dim ruta As Variant
ruta = Application.GetSaveAsFilename( _
InitialFileName:="Informe", _
FileFilter:="PDF (*.pdf), *.pdf")
If ruta <> False Then
Worksheets("Enero").ExportAsFixedFormat _
Type:=xlTypePDF, FileName:=CStr(ruta)
End If
End Sub
Crear un PDF desde cero con un bucle en VBA
Ahora subimos el listón: el libro Notas.xlsx tiene la hoja Alumnos con los nombres y las notas del trimestre. La macro generará un PDF por alumno.
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Alumno | Nota1 | Nota2 | Promedio |
| 2 | Ana | 7,5 | 8,0 | 7,75 |
| 3 | Bruno | 4,0 | 5,5 | 4,75 |
| 4 | Carla | 9,0 | 9,5 | 9,25 |
| 5 | David | 6,0 | 7,0 | 6,50 |
Recorrer filas con Cells(fila, columna)
Cells(fila, columna) toma la fila y la columna como números: Cells(2, 1) es A2, Cells(5, 3) es C5. Combinado con un For, recorre el rango.
Sub RecorrerAlumnos()
Dim i As Long
For i = 2 To 5
Cells(i, 4).Value = (Cells(i, 2).Value + Cells(i, 3).Value) / 2
Next i
End Sub
Escribir la fórmula en la hoja temporal con FormulaLocal
Para el PDF, en lugar de calcular a mano, mejor escribir =PROMEDIO(B2:C2) con FormulaLocal. La fórmula queda en la celda y se evalúa sola al abrir el PDF.
Sub PonerPromedio()
Range("D2:D5").FormulaLocal = "=PROMEDIO(B2:C2)"
End Sub
=PROMEDIO(B2:C2)
Nombrar el PDF con el nombre del alumno
La macro completa crea una hoja temporal, copia la fila del alumno, le añade el promedio y la exporta con el nombre del alumno:
Sub PDFporAlumno()
Dim i As Long
Dim wsTemp As Worksheet
Set wsTemp = Worksheets.Add
wsTemp.Name = "Temporal"
Worksheets("Alumnos").Rows(1).Copy wsTemp.Rows(1)
For i = 2 To 5
Worksheets("Alumnos").Rows(i).Copy wsTemp.Rows(2)
wsTemp.Range("D2").FormulaLocal = "=PROMEDIO(B2:C2)"
wsTemp.ExportAsFixedFormat _
Type:=xlTypePDF, _
FileName:=ThisWorkbook.Path & "\" & Cells(i, 1).Value & ".pdf"
Next i
Application.DisplayAlerts = False
wsTemp.Delete
Application.DisplayAlerts = True
End Sub
Ana.pdf, Bruno.pdf, Carla.pdf y David.pdf, cada uno con el nombre y las dos notas del alumno.Abrir un PDF desde Excel con VBA y los comandos de Shell
Una vez creado el PDF, lo natural es abrirlo en el visor del sistema para revisarlo.
Shell frente a FollowHyperlink: el método
Shell ejecuta un programa del sistema; ShellExecute (de la librería Shell32) abre cualquier archivo con su programa asociado (Acrobat para un PDF, el navegador para un HTML).
Sub AbrirPDF()
CreateObject("Shell.Application").ShellExecute _
ThisWorkbook.Path & "\Ana.pdf"
End Sub
Shell "ruta", vbNormalFocus se usa cuando quieres lanzar un programa concreto (Shell "notepad.exe", vbNormalFocus); ShellExecute es mejor para abrir un archivo con su programa asociado.
Comprobar que el PDF existe antes de abrirlo
Dir(ruta) devuelve la cadena vacía "" si el archivo no existe. Comprobarlo evita el error 53 ("Archivo no encontrado").
Sub AbrirSiExiste()
Dim ruta As String
ruta = ThisWorkbook.Path & "\Ana.pdf"
If Dir(ruta) <> "" Then
CreateObject("Shell.Application").ShellExecute ruta
Else
MsgBox "El PDF no existe todavía."
End If
End Sub
(ruta) -> "C:\Informes\Ana.pdf" si existe
(ruta) -> "" si no existe
Los errores que de verdad pasan al guardar PDF con VBA
"Se ha producido el error '1004' en tiempo de ejecución" al usar .Formula
La fórmula se asignó en español o con punto y coma en .Formula, que solo entiende inglés con comas. La macro peta en cuanto llega a esa línea.
Range("D2").Formula = "=SUMA(A2:B2)" ' ← peta con error 1004
Solución: traducir la función o cambiar a FormulaLocal.
=SUM(A2:B2)
El PDF sale en blanco o con la hoja equivocada
La hoja activa no era la que querías exportar, o el rango seleccionado estaba vacío. La macro no avisa: el PDF se crea igual pero sin datos.
Worksheets("Enero").Select ' 1. selecciona la hoja
Worksheets("Enero").Range("A1:D20").ExportAsFixedFormat _
Type:=xlTypePDF, FileName:=ThisWorkbook.Path & "\Enero.pdf"
"El archivo está abierto por otro usuario" al guardar
El PDF ya está abierto en Acrobat o en otra pestaña. Excel no puede escribir encima. La solución más limpia: cerrar el visor antes de ejecutar la macro, o generar el nombre con sello de hora:
FileName:=ThisWorkbook.Path & "\Enero_" & Format(Now, "yyyymmdd_hhnnss") & ".pdf"
Las macros no se guardan al cerrar el libro
Guardaste el archivo como .xlsx y Excel te avisó de que iba a perder las macros. La próxima vez que abras el libro, los módulos están vacíos.
Archivo > Guardar como.- En "Tipo" elige *Libro de Excel habilitado para macros (.xlsm)**.
Guardar.
.xlsx y se borraron las macros, no se pueden recuperar con gusto: toca volver a escribirlas.Lo que VBA no puede hacer con un PDF
VBA es muy potente con Excel, pero con PDFs se queda corto: no abre un PDF ya hecho para leer su texto, buscar palabras, rellenar campos ni cambiar una página. El modelo de objetos de Excel (el árbol de Workbook, Worksheet, Range…) entiende libros, hojas y celdas, no PDFs.
Si necesitas eso, las opciones son:
- Power Query (Datos > Obtener datos > De un archivo > De PDF) puede leer tablas dentro de un PDF y traerlas a una hoja. Desde Excel 2016.
- Bibliotecas externas como las que se usan en otros lenguajes: con VBA puro no son cómodas, pero existen soluciones que llaman a utilidades externas.
- Acrobat Pro o Adobe Acrobat Reader con su plugin de automatización: permiten extraer texto y datos, pero es otra herramienta, no VBA.
Lo que ya sabes hacer con VBA y los PDF en Excel
- Abrir el editor con Alt+F11, crear un módulo y lanzar una macro con Alt+F8.
- Usar la grabadora para descubrir cómo se llama en VBA cada acción que haces a mano.
- Escribir fórmulas con
FormulaLocal(español, punto y coma) yFormulaR1C1(para bucles). - Exportar una hoja, varias hojas o un rango a PDF con
ExportAsFixedFormat Type:=xlTypePDF. - Crear un PDF por alumno recorriendo filas con
For…NextyCells(fila, columna). - Abrir el PDF con
ShellExecutetras comprobar que existe conDir().
El siguiente paso natural: combinar el bucle que ya tienes con Outlook.Application para enviar cada PDF como adjunto al alumno correspondiente, en lugar de dejarlo solo en la carpeta.
Dudas al usar VBA para guardar y abrir PDF en Excel
Dudas al enviar un PDF por correo desde VBA
[other queries]
[other queries]
Dudas al usar VBA para guardar y abrir PDF en Excel
1. ¿Dónde encuentro la documentación oficial de VBA en Excel?
La documentación oficial está en learn.microsoft.com, dentro de la sección Office VBA. Ahí encuentras la referencia completa del modelo de objetos de Excel, con la sintaxis, los argumentos y ejemplos de cada propiedad y método que puedes usar en tus macros.
2. ¿Hay alguna forma sencilla de empezar con VBA en Excel si no tengo experiencia?
Sí, empezando por grabar una macro con Vista > Macros > Grabar macro y luego abrir el editor (Alt+F11) para ver el código que se generó. Eso te permite ver cómo Excel traduce tus acciones a instrucciones VBA y modificar pequeñas partes hasta entender cómo funciona.
3. ¿Qué son exactamente las macros en Excel?
Una macro es un conjunto de instrucciones que Excel ejecuta de forma automática al pedírselo, normalmente escritas en VBA. Sirve para repetir tareas con un solo clic, como aplicar un formato, copiar datos o, en este caso, guardar la hoja activa como PDF.
4. ¿Cómo consigo el archivo xlsm con macros para Excel?
No hace falta descargar nada: crea un libro nuevo en Excel y guárdalo con Archivo > Guardar como, eligiendo el tipo Libro de Excel habilitado para macros (*.xlsm). A partir de ahí, todo archivo con extensión .xlsm puede contener macros VBA listas para ejecutarse.
5. ¿Merece la pena hacer un curso de VBA?
Si vas a automatizar tareas en Excel de forma habitual, sí: un curso te enseña a leer el modelo de objetos, depurar errores y estructurar el código, que es lo que marca la diferencia entre copiar una macro y crear una que sirva de verdad. Microsoft Learn tiene rutas gratuitas en español que cubren desde lo básico hasta la automatización de informes.
6. ¿Existe un compilador para VBA?
No, VBA es un lenguaje interpretado que ejecuta el propio Excel al abrir la macro; no genera un archivo .exe ni necesita compilarse. Para distribuir el código se guarda el libro como .xlsm y se ejecuta desde el editor con F5 o con el botón asignado.
7. ¿Las macros de Excel funcionan en WPS Office?
WPS Office trae su propio entorno de macros basado en VBA, así que muchas macros de Excel se abren y se ejecutan sin cambios, aunque no todas las funciones del modelo de objetos de Microsoft están disponibles. La biblioteca oficial de soporte la mantiene WPS en su web, en el apartado de macros y scripts.
Fuentes
- MicrosoftGetting started with VBA in Office | Microsoft Learnconsultado el 06/10/2026
- MicrosoftEl editor de VBA y la primera macro — documentación oficialconsultado el 06/10/2026
- MicrosoftLAMBDA — documentación oficialconsultado el 06/10/2026
- MicrosoftRange.Formula, FormulaLocal, FormulaR1C1 y FormulaR1C1Local — documentación oficialconsultado el 06/10/2026
- MicrosoftAtajos que funcionan igual en cualquier idioma — documentación oficialconsultado el 06/10/2026