Lección 29 de 37Automatización con Macros

Editar macros: VBA básico

Personaliza y mejora macros grabadas con código.

15 minutos

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:

  1. Atajo de teclado: Alt+F11 (la forma más rápida)
  2. Desde cinta: Desarrollador > Visual Basic
  3. 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 Set para 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 .Select innecesarios usando With para codigo mas eficiente
  • Las variables almacenan datos; usa Dim para declararlas y Set para objetos
  • MsgBox muestra mensajes; InputBox solicita datos al usuario
  • Desactiva ScreenUpdating para macros mas rapidas
  • Usa On Error GoTo para 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

  1. ¿Qué atajo de teclado abre el Editor de VBA?
  2. ¿Por qué es ineficiente usar .Select en el código de macros?
  3. ¿Qué palabra clave se usa para declarar variables en VBA?
  4. ¿Qué hace Application.ScreenUpdating = False?
  5. ¿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.