🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →

The ExcelMaster.ai Blog

VBA Font en Excel — cómo dar color, negrita y tamaño desde código (y la trampa de ColorIndex)

VBA Font en Excel — cómo dar color, negrita y tamaño desde código (y la trampa de ColorIndex)

El objeto Font es la capa de texto de una celda en Excel VBA — color, negrita, cursiva, tamaño y nombre, y nada de eso toca el valor que hay debajo. La pega está en el color. Hay tres formas de fijarlo y usan espacios numéricos distintos. Range.Font.Color toma un número RGB de 24 bits, Range.Font.ColorIndex toma un índice de paleta de 1 a 56, y los dos no son intercambiables. Aprende cuál usar, cómo poner en negrita o cambiar el tamaño de parte de una celda con Characters, por qué colorear según el valor es cosa del Formato condicional, y cómo leer de vuelta un color de fuente sin llevarte el número equivocado.

Henry
VBA Color de celda en Excel — cómo poner el relleno de fondo desde código (y por qué el color no es dato)

VBA Color de celda en Excel — cómo poner el relleno de fondo desde código (y por qué el color no es dato)

Range.Interior es la capa de relleno de una celda en Excel VBA — la pintura que hay detrás del texto. Fíjalo con Interior.Color y RGB, bórralo poniendo Interior.ColorIndex a xlNone, y ten claro que un relleno blanco no es lo mismo que sin relleno. La idea de fondo es que una celda con color no lleva ningún dato. SUM y SUMIF la ignoran, así que si usas el color para categorizar estás escondiendo información donde las fórmulas no la pueden leer. Aprende las propiedades de color, cómo resaltar por condición sin un bucle que se queda obsoleto, y cómo rellenar muchos rangos rápido.

Henry
VBA NumberFormat en Excel — cambia cómo se muestra un número sin cambiar su valor

VBA NumberFormat en Excel — cambia cómo se muestra un número sin cambiar su valor

Range.NumberFormat es la capa de visualización de una celda en Excel VBA. Cambia cómo se lee en pantalla un número guardado y nunca cambia el número en sí, así que formatear una celda para que muestre 5 mientras contiene 5.4999 no es redondear y la suma sigue usando 5.4999. Aquí es donde la apariencia frente al valor te muerde de verdad, porque una fecha en realidad es un número de serie disfrazado. Aprende el lenguaje de los códigos de formato, en qué se diferencia NumberFormat de la función Format, la trampa de configuración regional con NumberFormatLocal, y cuándo necesitas Round en su lugar.

Henry
VBA WorksheetFunction en Excel — llama a las propias funciones de Excel desde código (y las dos formas en que fallan)

VBA WorksheetFunction en Excel — llama a las propias funciones de Excel desde código (y las dos formas en que fallan)

Application.WorksheetFunction permite a VBA tomar prestadas las más de 450 funciones integradas de Excel en lugar de reescribir SUM, VLOOKUP o COUNTIF como un bucle. El truco es que hay dos formas de llamarlas y fallan de manera distinta. WorksheetFunction.X lanza un error de ejecución cuando no hay coincidencia, mientras que Application.X devuelve un valor de error que compruebas con IsError. Aprende qué estilo de llamada usar, por qué el resultado debe ser un Variant, qué funciones no deberías llamar así y cuándo pasar un rango entero en vez de recorrer celda a celda.

Henry
VBA eliminar duplicados en Excel — desduplica en una línea (y por qué elimina sin deshacer)

VBA eliminar duplicados en Excel — desduplica en una línea (y por qué elimina sin deshacer)

Range.RemoveDuplicates es el botón Quitar duplicados de Excel en una sola línea de código, pero es destructivo de formas en que un bucle no lo es. Elimina filas en su sitio, conserva la primera aparición y no se puede deshacer después de que una macro se ejecuta. El argumento que hace tropezar a todos es Columns, cuyos números son desfases dentro del rango, no letras de columna de la hoja. Aprende la trampa del desfase del rango, por qué importa Header xlYes, cómo conservar la última fila en lugar de la primera, y cuándo recurrir a Filtro avanzado o a un Dictionary.

Henry
VBA Filtro avanzado en Excel — extrae valores únicos y filtra a un rango nuevo (sin un bucle)

VBA Filtro avanzado en Excel — extrae valores únicos y filtra a un rango nuevo (sin un bucle)

Range.AdvancedFilter es el único filtro que produce datos en lugar de una vista. Puede sacar una lista única o un conjunto de filas que cumplen un criterio a otra ubicación en una sola llamada, sin un bucle y sin eliminar nada. La parte que resulta extraña es que su cláusula WHERE vive en celdas, un rango de criterios cuya cabecera debe coincidir con los datos exactamente. Aprende xlFilterInPlace frente a xlFilterCopy, cómo funciona el rango de criterios, cómo Unique True desduplica sin destruir, la trampa de la coincidencia de cabeceras que devuelve una salida vacía, y en qué se diferencia de AutoFilter y Quitar duplicados.

Henry
VBA Find en Excel — buscar celdas de la forma correcta (devuelve un Range, no una posición)

VBA Find en Excel — buscar celdas de la forma correcta (devuelve un Range, no una posición)

El método Range.Find de VBA es el Ctrl+F de Excel para código, y hace tropezar a la gente porque devuelve un objeto Range (o Nothing cuando no hay coincidencia) en lugar de un número. Aprende la única comprobación que evita el fallo del error 91, la trampa de los argumentos pegajosos que hace que Find se comporte distinto en cada ejecución, cómo LookAt xlWhole frente a xlPart decide entre celda completa y contiene, y cómo recorrer FindNext para obtener cada coincidencia sin un bucle infinito.

Henry
VBA AutoFilter en Excel — filtrar filas en código (y por qué oculto no es eliminado)

VBA AutoFilter en Excel — filtrar filas en código (y por qué oculto no es eliminado)

El método AutoFilter de VBA filtra una tabla en código, pero las filas que oculta siguen ahí — siguen contando en SUM, se siguen copiando y siguen ocupando tu rango. Aprende el modelo mental que evita los errores clásicos, por qué debes pasar por SpecialCells xlCellTypeVisible para tocar solo las filas visibles, cómo funcionan los criterios y los operadores, la trampa del interruptor que apaga tu filtro en la segunda ejecución y el rápido patrón de filtrar y luego eliminar para quitar filas en masa.

Henry
VBA Sort en Excel — Range.Sort frente al objeto Sort (y cómo recuperar el orden original)

VBA Sort en Excel — Range.Sort frente al objeto Sort (y cómo recuperar el orden original)

Ordenar en VBA es una reordenación permanente sin Ctrl+Z, así que la primera regla es proteger el orden original antes de tocarlo. Aprende el modelo mental que separa una vista de una mutación, por qué Header xlYes importa o tus títulos acaban entre los datos, la diferencia entre el rápido Range.Sort y el ilimitado objeto Sort, la trampa de SortFields.Clear que hereda claves de ordenación antiguas, y por qué los números guardados como texto se ordenan en el orden equivocado.

Henry
VBA eliminar filas en Excel — eliminar filas, filas en blanco y filas por condición (¡recorre el bucle hacia atrás!)

VBA eliminar filas en Excel — eliminar filas, filas en blanco y filas por condición (¡recorre el bucle hacia atrás!)

Eliminar una fila en VBA es una edición estructural, no un borrado —cada fila de debajo sube para tapar el hueco, y por eso un bucle hacia delante se salta filas. Aprende la única regla que lo arregla (recorrer de abajo arriba, o eliminar con una sola Union), en qué se diferencia EntireRow.Delete de vaciar una celda, la forma rápida de quitar filas en blanco y cómo eliminar filas por condición sin corromper tus datos ni tus fórmulas de referencia.

Henry
VBA insertar filas y columnas en Excel — desplaza la cuadrícula en la dirección correcta (e inserta en un bucle sin caos)

VBA insertar filas y columnas en Excel — desplaza la cuadrícula en la dirección correcta (e inserta en un bucle sin caos)

Insertar es el reflejo de eliminar —empuja las filas existentes hacia abajo (o las columnas a la derecha) para hacer sitio, así que el mismo desplazamiento que rompe un bucle de eliminación rompe también uno de inserción. Aprende EntireRow.Insert frente a un rango parcial con el argumento Shift, por qué CopyOrigin decide de qué vecino hereda el formato la nueva fila, la dirección segura para insertar dentro de un bucle y la forma de añadir muchas filas de una sola llamada.

Henry
VBA ocultar columnas y filas en Excel — ocultar no es eliminar (y por qué tus totales no cambian)

VBA ocultar columnas y filas en Excel — ocultar no es eliminar (y por qué tus totales no cambian)

Ocultar una columna en VBA no es eliminarla ni filtrarla —los datos siguen ahí, siguen en cada SUM, se siguen copiando al copiar el rango, solo que con un ancho de visualización de cero. Aprende por qué .Hidden vive en EntireColumn y EntireRow, por qué las celdas ocultas siguen contando en las fórmulas, la línea de mostrar todo que rescata una hoja atascada y en qué se diferencian las filas ocultas a mano de las ocultas por AutoFilter cuando recorres un bucle.

Henry
VBA Worksheet_BeforeDoubleClick en Excel — convierte un doble clic en una acción (y suprime el modo edición)

VBA Worksheet_BeforeDoubleClick en Excel — convierte un doble clic en una acción (y suprime el modo edición)

Worksheet_BeforeDoubleClick es el evento que Excel dispara en el instante en que haces doble clic en una celda, antes de que entre en modo edición, y te entrega la celda Target más un indicador Cancel. Pon Cancel en True para suprimir el modo edición y ejecutar tu propia acción en su lugar, alternar una marca, dar una fila por hecha o bajar al detalle. Aprende a acotarlo a una sola columna con Intersect, por qué olvidar Cancel deja la celda en modo edición, y dónde debe vivir el código.

Henry
VBA Worksheet_BeforeRightClick en Excel — reemplaza el menú del clic derecho (y por qué desactivarlo no es seguridad)

VBA Worksheet_BeforeRightClick en Excel — reemplaza el menú del clic derecho (y por qué desactivarlo no es seguridad)

Worksheet_BeforeRightClick es el evento que Excel dispara en el instante en que haces clic derecho en una celda, antes de que aparezca el menú contextual, y te entrega la celda Target más un indicador Cancel. Pon Cancel en True para suprimir el menú integrado y ejecutar tu propia acción o mostrar un menú personalizado en su lugar. Aprende a acotarlo con Intersect para no lisiar Copiar y Pegar, por qué desactivar el clic derecho es UX y no protección, y dónde debe vivir el código.

Henry
VBA Workbook_BeforePrint en Excel — bloquea una impresión, sella un encabezado y la pega de la vista previa

VBA Workbook_BeforePrint en Excel — bloquea una impresión, sella un encabezado y la pega de la vista previa

Workbook_BeforePrint es el evento que Excel dispara antes de que se imprima nada del libro, y te entrega un indicador Cancel. Pon Cancel en True y la impresión se bloquea, valida antes de imprimir o frena que salga un borrador. Aprende por qué el evento también se dispara con la Vista preliminar (así que el trabajo pesado hace que la vista previa se arrastre), por qué se ejecuta una sola vez para todo el libro en lugar de por hoja, por qué un Cancel silencioso es un bug, y dónde debe vivir el código.

Henry
VBA Workbook_BeforeClose en Excel — cancela el cierre, pide guardar y dónde debe vivir el código

VBA Workbook_BeforeClose en Excel — cancela el cierre, pide guardar y dónde debe vivir el código

Workbook_BeforeClose es el evento que Excel dispara en el instante en que alguien intenta cerrar el archivo, antes de que nada se desmonte, y te entrega un indicador Cancel. Pon Cancel en True y el cierre se aborta. Aprende a ejecutar limpieza al cerrar, cómo evitar que Excel pida guardar dos veces con la propiedad Saved, por qué nunca se dispara ante un fallo, y dónde debe vivir el código.

Henry
VBA Workbook_BeforeSave en Excel — valida o bloquea un guardado, y qué te dice de verdad SaveAsUI

VBA Workbook_BeforeSave en Excel — valida o bloquea un guardado, y qué te dice de verdad SaveAsUI

Workbook_BeforeSave es el evento que Excel dispara en el momento en que se solicita un guardado, antes de que nada se escriba en disco, y te entrega dos indicadores, SaveAsUI y Cancel. Aprende a bloquear un guardado cuando una celda obligatoria está vacía, a sellar automáticamente quién guardó y cuándo, por qué llamar a Save dentro del manejador entra en bucle infinito, y cómo SaveAsUI te permite imponer un nombre de archivo.

Henry
VBA Worksheet_Activate y Deactivate en Excel — ejecuta código al cambiar de hoja (y por qué no puedes cancelar una salida)

VBA Worksheet_Activate y Deactivate en Excel — ejecuta código al cambiar de hoja (y por qué no puedes cancelar una salida)

Worksheet_Activate se dispara cuando una hoja pasa a ser la activa y Worksheet_Deactivate se dispara justo al abandonarla, los eventos de llegada y salida de una hoja. La pega que los define, a diferencia de BeforeClose y BeforeSave, ninguno te da un Cancel, así que puedes observar un cambio de hoja pero no puedes bloquearlo. Aprende el patrón de refrescar al mirar, el truco del rebote, y los manejadores a nivel de hoja frente a nivel de libro.

Henry
VBA Class Module en Excel — construye tu propio objeto (plano frente a instancia, y la trampa de As New)

VBA Class Module en Excel — construye tu propio objeto (plano frente a instancia, y la trampa de As New)

Un class module de VBA te deja definir tu propio tipo de objeto —un plano que agrupa datos y comportamiento— y luego crear instancias independientes con New. La trampa que pilla a todo el mundo es que los objetos son tipos de referencia, así que Set b = a hace que ambos nombres apunten a la misma instancia, y Dim x As New esconde una trampa de instanciación perezosa. Aprende cómo el nombre del módulo se convierte en el nombre del tipo, cuándo una clase gana a un Type y cómo evitar los errores clásicos con New.

Henry
VBA Type en Excel — agrupa campos relacionados en una sola variable (tipos definidos por el usuario frente a una clase)

VBA Type en Excel — agrupa campos relacionados en una sola variable (tipos definidos por el usuario frente a una clase)

Un Type de VBA —un tipo definido por el usuario declarado con Type ... End Type— agrupa varios campos relacionados en una sola variable, así Name, Age y Salary viajan juntos en lugar de como tres arrays paralelos. Es un tipo de valor, lo que significa que asignar una variable Type a otra copia todos los campos, al contrario que los objetos, que comparten. Aprende dónde debe vivir la declaración, por qué copiar en vez de compartir importa y el punto exacto en el que deberías recurrir a un class module.

Henry
VBA Property en Excel — Get, Let y Set (acceso controlado a los campos de una clase)

VBA Property en Excel — Get, Let y Set (acceso controlado a los campos de una clase)

Property Get, Let y Set convierten un campo de clase en una puerta —un pequeño procedimiento que ejecuta tu código cada vez que el exterior lo lee o lo escribe—, así puedes validar la entrada, calcular valores al vuelo o hacer un campo de solo lectura. La distinción que pilla a todo el mundo es Let frente a Set —Let asigna un valor, Set asigna un objeto— y usar el que no toca es un error de compilación o de tiempo de ejecución. Aprende el patrón del campo de respaldo, cuándo una simple variable Public es la elección honesta y cómo construir una propiedad de solo lectura.

Henry
VBA ActiveCell en Excel — la única celda con el cursor (ActiveCell frente a Selection, y cuándo falla)

VBA ActiveCell en Excel — la única celda con el cursor (ActiveCell frente a Selection, y cuándo falla)

ActiveCell es un puntero vivo a la única celda que tiene el cursor ahora mismo — siempre exactamente una celda, en la hoja activa, dentro de la Selection actual. Aprende en qué se diferencia de Selection, cómo leerlo y escribirlo con .Value y .Offset, y la razón número uno por la que falla — sigue a la hoja y el cursor que el usuario dejó atrás, así que es la herramienta equivocada para código que no trata de dónde está el usuario.

Henry
VBA Selection en Excel — trabaja con lo que está resaltado (y por qué no siempre es un Range)

VBA Selection en Excel — trabaja con lo que está resaltado (y por qué no siempre es un Range)

Selection es un puntero vivo a lo que esté resaltado ahora mismo — normalmente un rango de celdas, pero también puede ser un gráfico, una forma o nada en absoluto. Por eso el código que da por hecho que Selection es un rango se rompe en cuanto se selecciona un gráfico. Aprende a recorrer las celdas seleccionadas, a manejar selecciones de varias áreas con .Areas, a protegerte con TypeName y cuándo saltarte Selection por completo y nombrar tu rango.

Henry
VBA Select frente a Activate en Excel — rompe el hábito de .Select de la grabadora de macros

VBA Select frente a Activate en Excel — rompe el hábito de .Select de la grabadora de macros

La grabadora de macros escribe lo que hace tu ratón — Select una hoja, Select una celda, actúa sobre la Selection — porque así trabaja una persona, no como debería hacerlo el código. Aprende la diferencia real entre Select (resaltar una o varias celdas) y Activate (fijar la única celda activa), por qué casi todo .Select es un rodeo lento y frágil que puedes borrar, las raras veces en que de verdad necesitas seleccionar, y cómo refactorizar el código de la grabadora para actuar directamente sobre referencias de rango cualificadas.

Henry
VBA Workbook_Open en Excel — ejecuta una macro automáticamente al abrir el archivo (y dónde debe vivir el código)

VBA Workbook_Open en Excel — ejecuta una macro automáticamente al abrir el archivo (y dónde debe vivir el código)

Workbook_Open es el evento que Excel dispara en el instante en que tu archivo termina de abrirse — código que se ejecuta solo, sin necesidad de botón. Pero solo se dispara si vive en el objeto ThisWorkbook (no en un Module estándar) y el usuario tiene las macros habilitadas. Aprende dónde debe ir el código, por qué a veces nunca se ejecuta en silencio, Workbook_Open frente a Auto_Open, y cómo mantenerlo rápido y a prueba de fallos.

Henry
VBA Worksheet_Change en Excel — ejecuta código cuando se edita una celda (y el bucle infinito que hay que evitar)

VBA Worksheet_Change en Excel — ejecuta código cuando se edita una celda (y el bucle infinito que hay que evitar)

Worksheet_Change es el evento que Excel dispara cada vez que un usuario edita una celda de la hoja, entregándote la celda modificada como Target. La trampa que atrapa a todo el mundo: tu manejador escribe en una celda, esa escritura vuelve a disparar el evento, y Excel entra en bucle infinito. Aprende el arreglo con Application.EnableEvents, cómo acotarlo con Intersect, por qué ignora los recálculos de fórmulas, y dónde debe vivir el código.

Henry
VBA Worksheet_SelectionChange en Excel — ejecuta código cuando se mueve el cursor (resalta la fila activa sin retardos)

VBA Worksheet_SelectionChange en Excel — ejecuta código cuando se mueve el cursor (resalta la fila activa sin retardos)

Worksheet_SelectionChange es el evento que Excel dispara cada vez que el cursor se mueve — un clic, una tecla de flecha, un Enter. Te entrega la nueva selección como Target, lo que hace posibles trucos de seguimiento del cursor como resaltar la fila activa. Pero se dispara constantemente, así que el código pesado hace que toda la hoja vaya con retardo. Aprende el patrón de resaltar la fila activa bien hecho, por qué puede entrar en bucle, y cómo mantenerlo ligerísimo.

Henry
VBA For Each en Excel — recorre una colección sin tocar un índice (y las trampas que esconde)

VBA For Each en Excel — recorre una colección sin tocar un índice (y las trampas que esconde)

For Each dice «haz esto con cada elemento» y deja que VBA gestione el orden y los límites — sin contador, sin desfases por uno. Pero esa comodidad esconde tres reglas duras; la variable de bucle debe ser un objeto o un Variant, recorrer una matriz es de solo lectura y nunca debes eliminar de una colección que estás recorriendo. Aprende cuándo For Each gana a For…Next y cuándo te traiciona sin avisar.

Henry
VBA Collection en Excel — la lista ordenada que crece (y por qué no es un Dictionary)

VBA Collection en Excel — la lista ordenada que crece (y por qué no es un Dictionary)

Una VBA Collection es una lista ordenada que crece según le haces Add — sin ReDim, sin adivinar el tamaño. Pero tiene cuatro aristas con las que los principiantes se cortan siempre; es base 1 y no base 0, no puedes sobrescribir un elemento (solo Add/Remove), las claves duplicadas lanzan el error 457 y no trae ninguna comprobación Exists. Aprende cuándo una Collection gana a un Array o a un Dictionary, y cuándo te sale cara sin avisar.

Henry
VBA With en Excel — nombra el objeto una sola vez (y el punto inicial del que todo depende)

VBA With en Excel — nombra el objeto una sola vez (y el punto inicial del que todo depende)

La instrucción With nombra un objeto una vez y te deja alcanzar sus miembros con un punto inicial a secas — menos tecleo, código más rápido, bloques más limpios. Pero todo se juega en ese punto inicial; olvídalo y .Font se convierte en Font, que se enlaza en silencio con la hoja activa en vez de con tu objeto. Aprende qué optimiza With de verdad, la trampa del punto que falta y cómo With se combina con For Each.

Henry