DOMINA-BACH Básico cheat sheet
DOMINA-BACH Básico · Keep the key ideas within reach.
Fundamentos del lenguaje y estructura de una macro
Un módulo estándar contiene procedimientos Sub y Function; los módulos de objeto (ThisWorkbook, hojas) contienen código de eventos y no deben alojar macros de uso general.
Sub nombre() ... End Sub define un procedimiento que se ejecuta pero no devuelve valor; Function nombre(...) As Tipo ... End Function sí devuelve valor.
Option Explicit en la cabecera del módulo obliga a declarar toda variable; sin ella, las variables no declaradas son Variant y se crean al asignarlas.
Los comentarios empiezan con apóstrofo (') o con Rem; la línea continúa con un espacio seguido de guion bajo ( _) y no puede partir una cadena entre comillas.
Application.Run "NombreMacro" permite invocar una macro por nombre en tiempo de ejecución, útil para llamadas dinámicas entre libros.
Una macro se puede disparar desde Alt+F8, un botón de formulario, un control ActiveX, un atajo Ctrl+letra asignado en el cuadro de macros o un evento.
La instrucción With objeto ... End With fija un objeto de referencia y evita repetir el nombre del objeto en cada propiedad o método.
Un procedimiento puede declararse Private (visible solo en su módulo) o Public (visible desde otros módulos del mismo proyecto).
Referencias, rangos y objetos de Excel
Range("A1:B10") usa notación A1; Cells(fila, columna) usa índices numéricos; Range(Cells(1,1), Cells(10,2)) combina ambos enfoques.
Offset(filas, columnas) desplaza una referencia relativa; Resize(filas, columnas) cambia su tamaño; ninguno mueve el rango original.
Rows.Count y Columns.Count devuelven el total de la hoja (1.048.576 y 16.384 en formato xlsx); para el último dato real use Cells(Rows.Count, "A").End(xlUp).Row.
La jerarquía de objetos es Application > Workbook > Worksheet > Range; omitir referencias usa el objeto activo (ActiveSheet, ActiveCell, Selection).
Value2 devuelve el valor subyacente sin formato de moneda ni fecha; Value aplica el tipo de dato de Excel; Text devuelve la cadena mostrada.
WorksheetFunction expone funciones de Excel desde VBA, por ejemplo Application.WorksheetFunction.VLookup(...); si la función falla, se produce un error capturable.
Intersect y Union combinan o cruzan rangos; si Intersect no encuentra celdas comunes devuelve Nothing y debe comprobarse antes de usar el resultado.
Range("A1").CurrentRegion devuelve el bloque contiguo delimitado por filas y columnas vacías, útil para recorrer tablas sin conocer su tamaño.
Variables, tipos de datos y constantes
Tipos numéricos: Byte (0-255), Integer (-32.768 a 32.767), Long (aprox. ±2.147 millones), Single y Double para decimales, Currency para importes con 4 decimales fijos.
String puede ser de longitud variable o fija (Dim s As String * 10); Boolean es True/False; Date almacena fecha y hora como número de serie.
Variant es el tipo por defecto y puede contener cualquier valor, incluidos Empty, Null y Error; su uso indiscriminado penaliza rendimiento y claridad.
Dim declara a nivel de procedimiento; Private a nivel de módulo; Public o Global a nivel de proyecto; Static conserva el valor entre llamadas al procedimiento.
Const PI As Double = 3.14159 declara una constante; no puede reasignarse en tiempo de ejecución y debe inicializarse en la declaración.
La conversión implícita puede redondear (Integer recibe 2,5 como 2 por redondeo bancario); use CLng, CInt, CDbl, CStr, CDate o CCur para controlar la conversión.
IsEmpty comprueba si una Variant no se ha inicializado; IsNull comprueba Null; Nothing solo se compara con variables de objeto (Set obj = Nothing).
Las variables de módulo conservan su valor mientras el proyecto esté cargado; las locales se reinician al terminar el procedimiento salvo que se declaren Static.
Estructuras de control y bucles
If condicion Then ... ElseIf ... Else ... End If admite condiciones múltiples; la forma de una línea (If x Then y) no permite ElseIf ni End If.
Select Case expresion ... Case valor1 ... Case Is > 10 ... Case Else ... End Select evalúa una sola expresión y sale al primer Case coincidente.
For i = inicio To fin [Step n] ... Next i repite un número conocido de veces; Step -1 recorre en orden descendente.
For Each elemento In coleccion ... Next recorre colecciones y arrays sin conocer índices; el elemento debe ser Variant u Object según la colección.
Do While condicion ... Loop comprueba antes de ejecutar; Do ... Loop While condicion comprueba después y garantiza al menos una ejecución.
Do Until condicion ... Loop se ejecuta mientras la condición sea False; es el complemento lógico de Do While.
Exit For y Exit Do abandonan el bucle inmediatamente; Exit Sub y Exit Function abandonan el procedimiento completo.
GoTo etiqueta salta a una línea marcada con etiqueta:; su uso se limita a la gestión de errores o salidas de emergencia, no a la lógica normal.
Procedimientos, funciones y paso de argumentos
ByRef es el paso por defecto: el procedimiento puede modificar la variable original del llamador; ByVal pasa una copia y protege el valor original.
Optional permite omitir un argumento; debe declararse al final de la lista y comprobarse con IsMissing antes de usarlo.
ParamArray args() As Variant acepta un número variable de argumentos y debe ser el último parámetro de la firma.
Una Function puede devolver un array o un objeto si se declara como Variant o como el tipo de objeto correspondiente; para objetos use Set NombreFuncion = objeto.
El nombre del procedimiento es la variable de retorno en una Function; asignarle valor antes de End Function establece el resultado.
Application.Run y Call nombre(argumentos) invocan procedimientos; con Call los argumentos van entre paréntesis, sin Call se omiten.
Un procedimiento Private no aparece en el cuadro de macros Alt+F8; un Sub Public sin argumentos sí aparece.
Pasar un argumento ByRef a un procedimiento que no lo modifica sigue siendo visible para el llamador; declare ByVal cuando no necesite devolver cambios.
Manejo de errores y depuración
On Error GoTo etiqueta desvía la ejecución a un manejador; On Error Resume Next ignora el error y continúa en la línea siguiente; On Error GoTo 0 restaura el manejo normal.
En el manejador, Err.Number identifica el error, Err.Description lo describe y Err.Source indica el proyecto; Err.Clear o Resume limpian el objeto Err.
Resume reejecuta la línea que falló; Resume Next continúa en la siguiente; Resume etiqueta salta a una etiqueta concreta.
La estructura recomendada es: On Error GoTo Salida, código, Salida: mostrar mensaje, limpiar recursos y salir del procedimiento.
Err.Raise numero, origen, descripcion permite generar errores personalizados; los números personalizados suelen empezar en vbObjectError + 513.
La ventana Inmediato (Ctrl+G) ejecuta instrucciones sueltas y muestra Debug.Print; es la herramienta básica de inspección sin interrumpir el flujo.
F8 ejecuta paso a paso, F5 continúa, Shift+F8 avanza sobre la llamada; los puntos de interrupción (F9) detienen la ejecución en una línea concreta.
La ventana Locals muestra las variables del procedimiento actual; Watch permite vigilar una expresión y detenerse cuando cambia su valor.
Interacción con el usuario y eventos básicos
MsgBox(prompt, botones, titulo) devuelve un valor vbYes, vbNo, vbOK, vbCancel, vbRetry o vbIgnore según el botón pulsado.
InputBox(prompt, titulo, valorPredeterminado) devuelve una cadena; si el usuario cancela devuelve una cadena vacía, no un error.
Application.InputBox con Type:=1 fuerza la entrada numérica y devuelve False si se cancela; Type:=8 permite seleccionar un rango.
Los eventos de hoja incluyen Worksheet_Change (tras modificar una celda), Worksheet_SelectionChange (al cambiar la selección) y Worksheet_BeforeDoubleClick.
El evento Workbook_Open se ejecuta al abrir el libro; Workbook_BeforeClose permite cancelar el cierre con Cancel = True.
Application.EnableEvents = False evita que un evento se dispare a sí mismo al modificar celdas desde código; restáurelo a True al terminar.
Target en un evento es el rango afectado; If Not Intersect(Target, Range("A1:A10")) Is Nothing Then limita la acción a un área concreta.
UserForm.Show abre un formulario modal por defecto; UserForm.Show vbModeless lo abre sin bloquear la hoja, y Unload Me lo cierra desde su propio código.