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

The ExcelMaster.ai Blog

VBA DoEvents en Excel — evita que Excel se quede en «No responde» (y por quĂ© deja que tu macro corra dos veces)

VBA DoEvents en Excel — evita que Excel se quede en «No responde» (y por quĂ© deja que tu macro corra dos veces)

DoEvents pausa tu macro por un instante y deja que Excel procese los clics, las pulsaciones de teclas y los repintados que se amontonaron mientras corría tu código, que es lo que evita que la ventana se ponga gris en «No responde» y lo que hace posible un botón de cancelar que funcione. Pero la misma cesión que mantiene vivo a Excel también le devuelve el control al usuario a mitad de macro, así que puede pulsar el mismo botón otra vez y arrancar una segunda copia de tu macro dentro de la primera. Esa reentrada, no el rendimiento, es el verdadero peligro. Aprende dónde colocar DoEvents, cómo protegerte de la reentrada con un flag de ejecución, por qué debes moderar su frecuencia, y por qué no es multihilo.

Henry
VBA StatusBar en Excel — muestra el progreso de la macro sin un UserForm (y el mensaje que se queda pegado para siempre)

VBA StatusBar en Excel — muestra el progreso de la macro sin un UserForm (y el mensaje que se queda pegado para siempre)

Application.StatusBar te deja escribir tu propio texto en la barra a lo largo de la parte inferior de la ventana de Excel, que es la forma mĂĄs ligera de mostrar el progreso de una macro en marcha, sin UserForm y sin parpadeo. La Ășnica lĂ­nea que todo el mundo olvida es la de restablecer. El Ășltimo texto que escribiste se queda ahĂ­ clavado despuĂ©s de que la macro termina, porque Excel no recupera la barra hasta que pones Application.StatusBar igual a False. Y no se actualizarĂĄ de forma visible dentro de un bucle apretado a menos que Excel tenga un momento para repintar, que es donde entra DoEvents. Aprende el patrĂłn de escribir y restablecer, por quĂ© False gana a una cadena vacĂ­a, el modismo del porcentaje de progreso, y cuĂĄndo una barra de progreso de verdad vale el trabajo extra.

Henry
VBA DisplayAlerts en Excel — silencia los avisos de confirmaciĂłn de las macros desatendidas (y por quĂ© auto-confirma las peligrosas)

VBA DisplayAlerts en Excel — silencia los avisos de confirmaciĂłn de las macros desatendidas (y por quĂ© auto-confirma las peligrosas)

Application.DisplayAlerts igual a False le dice a Excel que deje de mostrar sus cuadros de confirmación y advertencia mientras corre tu macro, para que una macro desatendida no se quede parada esperando a que alguien pulse Aceptar. Pero no silencia el aviso tanto como lo responde por ti con la respuesta por defecto de Excel, y ante avisos como borrar esta hoja o sobrescribir este archivo, la respuesta por defecto es que sí. Se restablece solo a True cuando la macro termina, así que la verdadera trampa no es dejarlo apagado para siempre sino silenciar un aviso que te estaba protegiendo. Aprende dónde ayuda, la regla de la ventana estrecha, por qué no es lo mismo que el manejo de errores, y cómo se empareja con ScreenUpdating y Calculation.

Henry
VBA ScreenUpdating en Excel — detĂ©n el parpadeo y acelera tus macros (y por quĂ© no arreglarĂĄ una lenta)

VBA ScreenUpdating en Excel — detĂ©n el parpadeo y acelera tus macros (y por quĂ© no arreglarĂĄ una lenta)

Application.ScreenUpdating igual a False le dice a Excel que deje de repintar la pantalla mientras corre tu macro y la redibuje una sola vez al final, lo que elimina el parpadeo y da una mejora de velocidad modesta. Pero solo ayuda cuando tu cĂłdigo escribe, selecciona o se desplaza — pĂ©galo a una macro limitada por el cĂĄlculo y no ganas nada. La regla que te salva es que un fallo puede dejar la pantalla congelada y gris, asĂ­ que la restauras en un manejador de errores, nunca confiando en que se reinicie sola. Aprende dĂłnde ayuda, dĂłnde no, la trampa de parpadeo del restaurado anidado, y el patrĂłn CleanExit que la empareja con Calculation y EnableEvents.

Henry
VBA Calculation en Excel — pon el cálculo en Manual para ganar velocidad (y la trampa silenciosa de dejarlo así)

VBA Calculation en Excel — pon el cálculo en Manual para ganar velocidad (y la trampa silenciosa de dejarlo así)

Application.Calculation igual a xlCalculationManual le dice a Excel que deje de recalcular tras cada escritura y lo aplace todo a una sola pasada, que es la mejora de velocidad de verdad en libros cargados de fĂłrmulas. Pero es el interruptor mĂĄs peligroso de VBA porque su fallo es silencioso — dĂ©jalo en Manual y las fĂłrmulas dejan de actualizarse sin ninguna señal visible, asĂ­ que los totales quedan obsoletos y nadie se da cuenta. La regla que te salva es guardar el estado de cĂĄlculo, forzar un recĂĄlculo con Application.Calculate cuando un paso posterior necesita un resultado, y restaurar el estado guardado en un manejador de errores en vez de fijar Automatic a lo bruto. Aprende las trampas del modo manual, el error 1004 cuando no hay ningĂșn libro abierto, y el patrĂłn CleanExit.

Henry
VBA EnableEvents en Excel — evita que tu macro dispare sus propios eventos (y por quĂ© un fallo los deja muertos)

VBA EnableEvents en Excel — evita que tu macro dispare sus propios eventos (y por quĂ© un fallo los deja muertos)

Application.EnableEvents igual a False impide que las escrituras de tu macro disparen manejadores de eventos como Worksheet_Change, que es lo que rompe el bucle infinito donde un manejador edita una celda y se vuelve a disparar a sĂ­ mismo. Es un interruptor de correcciĂłn, no de velocidad. La regla que te salva es que EnableEvents es una propiedad a nivel de aplicaciĂłn que no se reinicia sola, asĂ­ que un fallo con ella en False deja muertos todos los eventos de todos los libros abiertos hasta que reinicies Excel — que es por lo que la gente reporta que sus botones dejaron de funcionar. Aprende el arreglo del Worksheet_Change recursivo, el restaurado con CleanExit, y por quĂ© este interruptor importa aĂșn mĂĄs que los otros.

Henry
VBA SpecialCells en Excel — seleccionar celdas en blanco, visibles y constantes (y por quĂ© lanza un error cuando no encuentra ninguna)

VBA SpecialCells en Excel — seleccionar celdas en blanco, visibles y constantes (y por quĂ© lanza un error cuando no encuentra ninguna)

SpecialCells deja que Excel elija las celdas por ti segĂșn su tipo en lugar de por su direcciĂłn — todas las celdas en blanco, todas las filas visibles, todas las fĂłrmulas, todas las constantes. Es el gemelo en cĂłdigo de Ir a Especial. La regla que te salva es que SpecialCells lanza error 1004 cuando no encuentra absolutamente nada, asĂ­ que una llamada a secas es una bomba de relojerĂ­a; la forma madura siempre es On Error Resume Next mĂĄs If Not resultado Is Nothing. Aprende los tipos de celda que importan, los patrones para rellenar celdas en blanco y para copiar solo las filas visibles, y por quĂ© el resultado es una referencia de mĂșltiples ĂĄreas.

Henry
VBA Union en Excel — combinar rangos no adyacentes en una sola referencia (y por quĂ© no elimina duplicados)

VBA Union en Excel — combinar rangos no adyacentes en una sola referencia (y por quĂ© no elimina duplicados)

Union pega rectĂĄngulos dispersos en una sola referencia para que puedas dar color, borrar o copiar varios bloques no adyacentes en una sola operaciĂłn — la versiĂłn en cĂłdigo de hacer Ctrl+clic en varias ĂĄreas. La regla que hace tropezar a todo el mundo es que Union concatena, no elimina duplicados; las celdas solapadas se cuentan dos veces, asĂ­ que .Count miente y Union es una lista por lotes, no una uniĂłn de conjuntos. Aprende el patrĂłn de acumulaciĂłn que evita el error de hacer Union de Nothing, por quĂ© es una operaciĂłn por referencia en vez de un bucle celda a celda, y en quĂ© se diferencia Union de Intersect.

Henry
VBA Intersect en Excel — encuentra dónde se solapan dos rangos (y la guarda de Worksheet_Change que todo el mundo usa)

VBA Intersect en Excel — encuentra dónde se solapan dos rangos (y la guarda de Worksheet_Change que todo el mundo usa)

Intersect devuelve solo las celdas que dos rangos comparten, y devuelve Nothing cuando no se tocan — y ese Nothing es justo lo importante. Su uso nĂșmero uno es la guarda de Worksheet_Change, If Not Intersect(Target, Range) Is Nothing, que evita que un evento se dispare en cada ediciĂłn de la hoja. La regla que te salva es que sin solapamiento se devuelve Nothing, asĂ­ que cualquier acceso a una propiedad sin comprobar Is Nothing falla con error 91. Aprende la guarda de evento completa con EnableEvents, cĂłmo acotar una macro a un ĂĄrea concreta, y en quĂ© se diferencia Intersect de Union.

Henry
VBA Cells frente a Range en Excel — referenciar celdas por nĂșmero (y por quĂ© Cells(1, 2) es B1, no A2)

VBA Cells frente a Range en Excel — referenciar celdas por nĂșmero (y por quĂ© Cells(1, 2) es B1, no A2)

Cells es Range direccionado por nĂșmero. Range(A1) apunta a una celda con una cadena en el orden en que la lees, letra de columna y luego fila; Cells(fila, columna) apunta a una celda con dos enteros en el orden en que Excel la guarda, primero la fila y luego la columna. Por eso Cells(1, 2) es B1, no A2. Aprende cuĂĄndo usar Cells frente a Range, cĂłmo construir un bloque a partir de esquinas calculadas con Range(Cells, Cells) y por quĂ© conviene cualificar Cells con una hoja.

Henry
VBA Resize en Excel — redimensionar un rango desde su ancla (y por quĂ© es un recuento, no un incremento)

VBA Resize en Excel — redimensionar un rango desde su ancla (y por quĂ© es un recuento, no un incremento)

Resize fija el ancla superior izquierda de un rango y vuelve a dibujar el rectĂĄngulo con un tamaño nuevo. No mueve la referencia como hace Offset y no selecciona nada — devuelve un rango nuevo que empieza en la misma esquina. La regla que pilla a todos es que Resize(rows, columns) es un recuento absoluto, con base 1, del tamaño final, no un incremento que sumar, asĂ­ que Range(A1).Resize(5, 3) es A1:C5 y Resize(0) lanza el error 1004. Aprende a omitir un argumento para dejar una dimensiĂłn sin tocar, por quĂ© el ancla es siempre la superior izquierda y los dos patrones que valen la pena — quitar un encabezado con Offset mĂĄs Resize y escribir una matriz en un bloque que la ajuste.

Henry
VBA CurrentRegion en Excel — toma todo el bloque de datos en una lĂ­nea (y quĂ© le hace una fila en blanco)

VBA CurrentRegion en Excel — toma todo el bloque de datos en una lĂ­nea (y quĂ© le hace una fila en blanco)

CurrentRegion es el bloque contiguo de celdas alrededor de una celda. Excel empieza en tu celda y se expande hacia afuera hasta topar con una fila totalmente en blanco y una columna totalmente en blanco, y devuelve el rectĂĄngulo mĂĄs pequeño que encierra esa isla ininterrumpida — justo lo que selecciona Ctrl+MayĂșs+asterisco. TĂș no calculas los bordes; Excel los encuentra. La trampa es que una sola fila o columna totalmente en blanco es un muro que parte el bloque sin avisar, asĂ­ que obtienes la mitad de tus datos sin ningĂșn error. Aprende por quĂ© CurrentRegion incluye el encabezado y cĂłmo quitarlo con Offset y Resize, en quĂ© se diferencia de UsedRange y de End(xlUp), y cuĂĄndo usar en su lugar una Tabla de verdad.

Henry
VBA Borders en Excel — dibuja bordes de celda desde cĂłdigo (y por quĂ© se encuadrĂł todo el bloque)

VBA Borders en Excel — dibuja bordes de celda desde cĂłdigo (y por quĂ© se encuadrĂł todo el bloque)

Un borde en Excel VBA es una propiedad de una arista, no un interruptor de la celda. Un rango tiene ocho bordes direccionables — cuatro lados exteriores, dos juegos de lĂ­neas de cuadrĂ­cula interiores y dos diagonales — y la colecciĂłn Range.Borders a secas significa todos ellos a la vez. Por eso Range.Borders.LineStyle = xlContinuous encuadra cada una de las celdas en vez de dibujar un solo contorno. Aprende cuĂĄndo usar BorderAround para solo el marco, cĂłmo se combinan LineStyle, Weight y Color, cĂłmo fijar un Ășnico lado con xlEdgeBottom, y cĂłmo borrar los bordes con xlLineStyleNone.

Henry
VBA Merge Cells en Excel — combinar y separar celdas desde cĂłdigo (y por quĂ© normalmente no deberĂ­as)

VBA Merge Cells en Excel — combinar y separar celdas desde cĂłdigo (y por quĂ© normalmente no deberĂ­as)

Combinar celdas en Excel VBA no es formato — es un cambio estructural de la cuadrĂ­cula. Range(A1:C1).Merge funde tres celdas en una que abarca tres columnas, y solo sobrevive el valor de arriba a la izquierda mientras los demĂĄs se borran. Por eso las celdas combinadas rompen en silencio la ordenaciĂłn, la aritmĂ©tica con Range, la inserciĂłn de columnas y los bucles. Aprende Merge, UnMerge, MergeCells y MergeArea, por quĂ© los expertos echan mano de Centrar en la selecciĂłn en su lugar, y cĂłmo encontrar y limpiar celdas combinadas de forma segura en cĂłdigo.

Henry
VBA Column Width y Row Height en Excel — redimensionar y AutoFit desde código (y las unidades que te hacen tropezar)

VBA Column Width y Row Height en Excel — redimensionar y AutoFit desde código (y las unidades que te hacen tropezar)

Dimensionar celdas en Excel VBA actĂșa sobre la columna o la fila entera, y las dos dimensiones usan unidades distintas — ColumnWidth se mide en caracteres de la fuente Normal, RowHeight se mide en puntos. Ese desajuste es la razĂłn de que un ancho de 10 y un alto de 10 no se parezcan en nada. AutoFit es la otra trampa. Solo se ejecuta sobre una columna o una fila entera, y mide el texto mostrado, asĂ­ que ignora en silencio las celdas combinadas. Aprende ColumnWidth frente al Width de solo lectura, RowHeight y el ajuste de texto, EntireColumn.AutoFit, y por quĂ© poner el ancho a cero es la forma equivocada de ocultar una columna.

Henry
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