Editar macros: VBA básico
Personaliza y mejora macros grabadas con código.
Grabar macros es útil, pero el verdadero poder viene cuando aprendes a editar el código. En esta lección, descubrirás los fundamentos de VBA (Visual Basic for Applications) y cómo modificar tus macros para hacerlas más inteligentes y flexibles.
Introducción al Editor de VBA
El Editor de Visual Basic (VBE) es donde vive el código de tus macros. Es tu taller de trabajo para automatización avanzada.
Abrir el Editor de VBA
Tienes tres formas de acceder:
- Atajo de teclado: Alt+F11 (la forma más rápida)
- Desde cinta: Desarrollador > Visual Basic
- Desde macro: Desarrollador > Macros > seleccionar macro > Editar
Componentes del Editor
| Componente | Ubicación | Función |
|---|---|---|
| Explorador de proyectos | Panel izquierdo superior | Muestra todos los libros y módulos abiertos |
| Ventana de propiedades | Panel izquierdo inferior | Propiedades del objeto seleccionado |
| Ventana de código | Panel central | Donde escribes y editas código |
| Ventana Inmediato | Panel inferior | Pruebas rápidas y depuración |
Consejo: Si no ves algún panel, actívalo desde el menú Ver.
Estructura de un proyecto VBA
VBAProject (TuArchivo.xlsm)
├── Microsoft Excel Objetos
│ ├── ThisWorkbook (el libro)
│ ├── Hoja1 (Hoja1)
│ └── Hoja2 (Hoja2)
├── Módulos
│ └── Módulo1 (tus macros grabadas)
└── Formularios (si existen)
Entender el código grabado
Veamos una macro grabada y entendamos cada línea.
Ejemplo de macro grabada
Sub FormatearReporte()
'
' FormatearReporte Macro
' Aplica formato estándar al reporte semanal
'
' Acceso directo: Ctrl+Shift+R
'
Range("A1:E1").Select
Selection.Font.Bold = True
Selection.Font.Size = 14
Selection.Interior.Color = RGB(0, 112, 192)
Selection.Font.Color = RGB(255, 255, 255)
Columns("A:E").AutoFit
End Sub
Anatomía del código
| Línea | Significado |
|---|---|
Sub FormatearReporte() |
Inicio de la macro (Sub = Subrutina) |
' texto |
Comentario (Excel lo ignora) |
Range("A1:E1").Select |
Selecciona el rango A1:E1 |
Selection.Font.Bold = True |
Aplica negrita a la selección |
End Sub |
Fin de la macro |
Estructura básica de una macro
Sub NombreDeMacro()
' Comentarios explicativos
' Código que se ejecuta
instruccion1
instruccion2
End Sub
Mejorar código grabado
El código grabado funciona, pero suele ser ineficiente. Veamos cómo mejorarlo.
Problema: Select innecesario
El grabador usa .Select constantemente, pero rara vez es necesario.
Código grabado (ineficiente):
Sub FormatearIneficiente()
Range("A1:E1").Select
Selection.Font.Bold = True
Selection.Font.Size = 14
End Sub
Código mejorado (eficiente):
Sub FormatearEficiente()
With Range("A1:E1")
.Font.Bold = True
.Font.Size = 14
End With
End Sub
La instrucción With
With te permite aplicar múltiples propiedades a un objeto sin repetirlo:
Sub EjemploWith()
With Range("A1:E1")
.Font.Bold = True
.Font.Size = 14
.Font.Color = RGB(255, 255, 255)
.Interior.Color = RGB(0, 112, 192)
.HorizontalAlignment = xlCenter
End With
End Sub
Variables en VBA
Las variables almacenan datos que puedes usar y modificar durante la ejecución.
Declarar variables
Sub EjemploVariables()
' Declarar variables con Dim
Dim nombreReporte As String
Dim totalVentas As Double
Dim cantidadFilas As Integer
Dim estaActivo As Boolean
' Asignar valores
nombreReporte = "Reporte Mensual"
totalVentas = 15750.50
cantidadFilas = 100
estaActivo = True
End Sub
Tipos de datos comunes
| Tipo | Uso | Ejemplo |
|---|---|---|
| String | Texto | "Hola mundo" |
| Integer | Números enteros pequeños | 100 |
| Long | Números enteros grandes | 1000000 |
| Double | Números decimales | 3.14159 |
| Boolean | Verdadero/Falso | True, False |
| Date | Fechas | #01/15/2026# |
| Variant | Cualquier tipo (flexible) | Cualquier valor |
Variables de objeto
Para trabajar con objetos de Excel:
Sub VariablesObjeto()
Dim ws As Worksheet
Dim rng As Range
Dim wb As Workbook
' Asignar con Set (obligatorio para objetos)
Set ws = ThisWorkbook.Sheets("Datos")
Set rng = ws.Range("A1:D100")
Set wb = ThisWorkbook
End Sub
Importante: Siempre usa
Setpara asignar objetos.
MsgBox: Interactuar con el usuario
MsgBox muestra mensajes y puede pedir confirmación.
Mensaje simple
Sub MensajeSimple()
MsgBox "La macro ha terminado exitosamente."
End Sub
Mensaje con título
Sub MensajeConTitulo()
MsgBox "Se procesaron 150 registros.", vbInformation, "Proceso Completado"
End Sub
Tipos de iconos
| Constante | Icono | Uso |
|---|---|---|
| vbInformation | i azul | Información general |
| vbExclamation | ! amarillo | Advertencia |
| vbCritical | X roja | Error |
| vbQuestion | ? | Pregunta |
Pedir confirmación
Sub PedirConfirmacion()
Dim respuesta As VbMsgBoxResult
respuesta = MsgBox("¿Desea continuar con el proceso?", _
vbYesNo + vbQuestion, "Confirmar")
If respuesta = vbYes Then
MsgBox "Procesando...", vbInformation
' Aquí va el código del proceso
Else
MsgBox "Operación cancelada.", vbExclamation
End If
End Sub
Combinaciones de botones
| Constante | Botones |
|---|---|
| vbOKOnly | Aceptar |
| vbOKCancel | Aceptar, Cancelar |
| vbYesNo | Sí, No |
| vbYesNoCancel | Sí, No, Cancelar |
| vbRetryCancel | Reintentar, Cancelar |
InputBox: Solicitar datos
InputBox permite que el usuario ingrese información.
Sub SolicitarDatos()
Dim nombreUsuario As String
Dim cantidadMeses As Integer
nombreUsuario = InputBox("Ingrese su nombre:", "Identificación")
cantidadMeses = InputBox("¿Cuántos meses desea analizar?", "Parámetros")
MsgBox "Hola " & nombreUsuario & ", analizaremos " & cantidadMeses & " meses."
End Sub
Patrones comunes de VBA
Patrón 1: Recorrer un rango
Sub RecorrerRango()
Dim celda As Range
Dim rango As Range
Set rango = Range("A1:A100")
For Each celda In rango
If celda.Value > 1000 Then
celda.Interior.Color = RGB(0, 255, 0) ' Verde
End If
Next celda
End Sub
Patrón 2: Última fila con datos
Sub EncontrarUltimaFila()
Dim ultimaFila As Long
' Método más confiable
ultimaFila = Cells(Rows.Count, "A").End(xlUp).Row
MsgBox "La última fila con datos es: " & ultimaFila
End Sub
Patrón 3: Limpiar rango
Sub LimpiarDatos()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Datos")
' Limpiar contenido (mantiene formato)
ws.Range("A2:E1000").ClearContents
' Limpiar todo (contenido + formato)
' ws.Range("A2:E1000").Clear
End Sub
Patrón 4: Copiar datos entre hojas
Sub CopiarDatos()
Dim origen As Worksheet
Dim destino As Worksheet
Dim ultimaFila As Long
Set origen = ThisWorkbook.Sheets("Datos")
Set destino = ThisWorkbook.Sheets("Reporte")
ultimaFila = origen.Cells(Rows.Count, "A").End(xlUp).Row
origen.Range("A1:E" & ultimaFila).Copy
destino.Range("A1").PasteSpecial xlPasteValues
Application.CutCopyMode = False ' Limpia el portapapeles
End Sub
Patrón 5: Desactivar actualizaciones de pantalla
Sub ProcesoRapido()
' Desactivar para mayor velocidad
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' Tu código aquí
' (proceso pesado)
' Reactivar al terminar
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Manejo de errores básico
Evita que tu macro se detenga por errores inesperados.
Sub MacroConManejo()
On Error GoTo ManejarError
' Código que podría fallar
Dim valor As Double
valor = Range("A1").Value / Range("B1").Value
MsgBox "Resultado: " & valor
Exit Sub
ManejarError:
MsgBox "Error: " & Err.Description, vbCritical, "Error"
End Sub
Ejercicio práctico: Mejorar una macro grabada
Macro original grabada
Sub ReporteOriginal()
Range("A1").Select
Selection.Font.Bold = True
Range("A1:D1").Select
Selection.Interior.Color = 12611584
Selection.Font.Color = 16777215
Columns("A:D").Select
Selection.AutoFit
End Sub
Macro mejorada
Sub ReporteMejorado()
' Desactivar actualizaciones para velocidad
Application.ScreenUpdating = False
' Formatear encabezado sin usar Select
With Range("A1:D1")
.Font.Bold = True
.Interior.Color = RGB(192, 0, 0)
.Font.Color = RGB(255, 255, 255)
End With
' Ajustar columnas
Columns("A:D").AutoFit
' Reactivar actualizaciones
Application.ScreenUpdating = True
' Confirmar al usuario
MsgBox "Reporte formateado correctamente.", vbInformation, "Completado"
End Sub
Depuración básica
Herramientas de depuración
| Tecla | Acción |
|---|---|
| F8 | Ejecutar línea por línea |
| F5 | Ejecutar hasta el final o próximo breakpoint |
| F9 | Agregar/quitar punto de interrupción |
| Ctrl+G | Abrir ventana Inmediato |
Usar la ventana Inmediato
En la ventana Inmediato puedes:
' Imprimir valores para debug
Debug.Print "El valor es: " & miVariable
' Ejecutar código directamente
?Range("A1").Value
?ActiveSheet.Name
Puntos clave de esta leccion
- El Editor de VBA (Alt+F11) es donde editas y mejoras tus macros
- Elimina
.Selectinnecesarios usandoWithpara codigo mas eficiente - Las variables almacenan datos; usa
Dimpara declararlas ySetpara objetos MsgBoxmuestra mensajes;InputBoxsolicita datos al usuario- Desactiva
ScreenUpdatingpara macros mas rapidas - Usa
On Error GoTopara manejar errores sin que la macro se detenga
Próxima lección
En la siguiente lección, aprenderás a crear botones que ejecuten tus macros y diseñaremos un flujo completo de automatización de reportes. Transformarás tus macros en herramientas profesionales que cualquier usuario puede utilizar.
Quiz de comprensión
- ¿Qué atajo de teclado abre el Editor de VBA?
- ¿Por qué es ineficiente usar
.Selecten el código de macros? - ¿Qué palabra clave se usa para declarar variables en VBA?
- ¿Qué hace
Application.ScreenUpdating = False? - ¿Cómo se asigna un objeto a una variable en VBA?
¿Completaste esta lección?
Marca esta lección como completada. Tu progreso se guardará en tu navegador.