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

The ExcelMaster.ai Blog

VBA ThisWorkbook en Excel — por quĂ© no es lo mismo que ActiveWorkbook

VBA ThisWorkbook en Excel — por quĂ© no es lo mismo que ActiveWorkbook

ThisWorkbook siempre significa el Ășnico libro que contiene tu cĂłdigo, y no cambia nunca aunque el usuario haga clic en otra ventana, mientras que ActiveWorkbook es el que estĂĄ al frente en este momento. Esta guĂ­a explica la distinciĂłn entre lo fijo y lo voluble que decide si una macro edita el archivo correcto, por quĂ© un Range sin calificar es la primera causa de que una macro corrompa el libro equivocado, cĂłmo referenciar otro libro abierto por su nombre y por quĂ© ThisWorkbook deberĂ­a ser tu ancla por defecto.

Henry
VBA ActiveWorkbook y ActiveSheet en Excel — el objeto que toca el archivo equivocado

VBA ActiveWorkbook y ActiveSheet en Excel — el objeto que toca el archivo equivocado

ActiveWorkbook y ActiveSheet apuntan a lo que el usuario haya clicado por Ășltima vez, lo que los hace cĂłmodos y a la vez la mayor causa de que una macro toque el archivo equivocado. Esta guĂ­a explica por quĂ© el objeto activo es un blanco mĂłvil, el antipatrĂłn de Select y Activate que dejan las macros grabadas, cuĂĄndo actuar sobre el objeto activo es de verdad correcto, cĂłmo leer el objeto activo una sola vez en una variable en lugar de recurrir a Ă©l una y otra vez, y por quĂ© las referencias directas le ganan a seleccionar cada vez.

Henry
VBA Worksheets en Excel — referencia una hoja para que renombrar una pestaña no pueda romperla

VBA Worksheets en Excel — referencia una hoja para que renombrar una pestaña no pueda romperla

La colecciĂłn Worksheets es la forma de nombrar una hoja en cĂłdigo, y puedes direccionarla de tres maneras: por cadena de nombre, por nĂșmero de Ă­ndice o por CodeName. Esta guĂ­a explica por quĂ© el nombre se rompe en cuanto un usuario renombra una pestaña, por quĂ© el Ă­ndice se rompe cuando alguien reordena las pestañas, por quĂ© el CodeName no se rompe con ninguna de las dos, la diferencia real entre Worksheets y Sheets, y cĂłmo asignar una vez una variable de hoja calificada para que el resto de tu macro no vuelva a tocar una referencia frĂĄgil.

Henry
VBA Comment en Excel — comentar cĂłdigo, la regla del apĂłstrofo y por quĂ© nunca se ejecuta

VBA Comment en Excel — comentar cĂłdigo, la regla del apĂłstrofo y por quĂ© nunca se ejecuta

Un comentario de VBA es la Ășnica lĂ­nea que el compilador tiene garantizado ignorar, lo que lo convierte en tu maniobra de depuraciĂłn mĂĄs segura y en tu hĂĄbito de documentaciĂłn mĂĄs peligroso. Esta guĂ­a cubre el apĂłstrofo frente a Rem, cĂłmo comentar un bloque entero con la Edit toolbar oculta, por quĂ© un comentario no puede vivir dentro de una continuaciĂłn de lĂ­nea, la diferencia entre un comentario de cĂłdigo y un objeto Comment de celda, y los Ășnicos comentarios que de verdad merece la pena escribir.

Henry
VBA Option Explicit en Excel — convierte una errata silenciosa en un ruidoso error de compilación

VBA Option Explicit en Excel — convierte una errata silenciosa en un ruidoso error de compilación

Option Explicit es la línea de mayor rentabilidad de todo VBA, porque sin ella un nombre de variable mal escrito no es un error, sino una variable nueva y vacía que devuelve cero sin avisar. Esta guía muestra el bug de la errata silenciosa que elimina, por qué es por módulo y cómo el ajuste Require Variable Declaration lo añade por ti, qué hacer cuando Variable not defined aparece en código antiguo, y por qué obliga a declarar pero no a fijar tipos de datos.

Henry
VBA Line Continuation en Excel — el guion bajo, sus reglas y la trampa de las cadenas

VBA Line Continuation en Excel — el guion bajo, sus reglas y la trampa de las cadenas

La continuación de línea de VBA es un espacio seguido de un guion bajo que deja que una instrucción larga abarque varias líneas físicas, y el parser lo borra antes de compilar, así que solo cambia cómo se lee el código. Esta guía cubre el espacio obligatorio antes del guion bajo, por qué no puedes partir dentro de una cadena literal, por qué un comentario mata una continuación, cómo los dos puntos hacen lo contrario al unir instrucciones, y cuåndo recurrir a ella.

Henry
VBA Debug.Print en Excel — por quĂ© tu salida va a una ventana que no puedes ver

VBA Debug.Print en Excel — por quĂ© tu salida va a una ventana que no puedes ver

Debug.Print escribe una lĂ­nea en la Immediate Window y deja seguir la macro, asĂ­ que es la forma no bloqueante de ver un bucle transmitir sus valores en vez de ahogarte en ventanas de MsgBox. Esta guĂ­a explica por quĂ© Debug.Print parece no hacer nada hasta que abres la Immediate Window con Ctrl+G, por quĂ© el bĂșfer de unas 200 lĂ­neas descarta en silencio la salida mĂĄs temprana, por quĂ© imprimir una expresiĂłn puede disparar efectos secundarios reales, en quĂ© se diferencia de MsgBox, y cuĂĄndo dejar de registrar en la ventana y escribir en un archivo.

Henry
VBA Immediate Window en Excel — la consola que ejecuta código cuando se lo pides

VBA Immediate Window en Excel — la consola que ejecuta código cuando se lo pides

La Immediate Window son dos herramientas en una: el lugar donde aterriza la salida de Debug.Print y una consola en vivo donde tecleas una lĂ­nea de VBA y la ejecutas al instante. Esta guĂ­a muestra cĂłmo el atajo ? evalĂșa cualquier expresiĂłn, por quĂ© escribir ? delante de una funciĂłn la ejecuta de verdad con sus efectos secundarios, por quĂ© tus variables locales se leen vacĂ­as salvo que la macro estĂ© pausada en break mode, cĂłmo llamar a un Sub o un bucle de una lĂ­nea a mano, y cuĂĄndo la consola ya ha hecho su trabajo y la lĂłgica pertenece a un mĂłdulo.

Henry
VBA Breakpoint en Excel — congela una macro y recórrela línea a línea

VBA Breakpoint en Excel — congela una macro y recórrela línea a línea

Un breakpoint congela una macro en una línea antes de que se ejecute y te deja en break mode, donde puedes leer cada valor en vivo y luego recorrer el código línea a línea con F8. Esta guía cubre cómo poner breakpoints con F9, la diferencia entre Step Into y Step Over, por qué los breakpoints desaparecen al cerrar el libro, por qué una instrucción Stop nunca debe llegar a los usuarios, cómo Debug.Assert te da un breakpoint condicional que se ignora en tiempo de ejecución, y cuåndo recorrer paso a paso le gana a salpicar Debug.Print por el código.

Henry
VBA IsNumeric en Excel — por quĂ© dice que sĂ­ a cosas que no son nĂșmeros

VBA IsNumeric en Excel — por quĂ© dice que sĂ­ a cosas que no son nĂșmeros

IsNumeric no pregunta si una cadena es un nĂșmero: pregunta si VBA podrĂ­a convertirla en uno, y VBA lo intenta con ganas. Esta guĂ­a muestra por quĂ© IsNumeric devuelve True con la notaciĂłn cientĂ­fica, un literal hexadecimal, un separador de miles, una cadena rellena de espacios e incluso un valor con signo final, por quĂ© eso cuela datos malos por tu validaciĂłn, por quĂ© depende de la configuraciĂłn regional lo bastante como para corromper datos entre equipos, y cuĂĄndo dejar de fiarte de Ă©l y fijar la forma con el operador Like en su lugar.

Henry
El operador Like de VBA en Excel — coincidencia con comodines y la trampa de la cadena entera

El operador Like de VBA en Excel — coincidencia con comodines y la trampa de la cadena entera

El operador Like de VBA responde una sola pregunta booleana: Âżencaja toda la cadena en esta forma con comodines? Esta guĂ­a cubre los cinco comodines (asterisco, interrogaciĂłn, almohadilla y las formas [list] y [!list]), por quĂ© Like comprueba la cadena entera y por eso necesitas asteriscos alrededor de una subcadena, por quĂ© su distinciĂłn de mayĂșsculas es un interruptor Option Compare de todo el mĂłdulo sin anulaciĂłn por llamada, cĂłmo coincidir con un asterisco literal usando corchetes, y cuĂĄndo Like le gana tanto a InStr como a una expresiĂłn regular completa.

Henry
VBA Regex en Excel — el objeto RegExp y por quĂ© tu coincidencia vuelve vacĂ­a

VBA Regex en Excel — el objeto RegExp y por quĂ© tu coincidencia vuelve vacĂ­a

Regex en VBA no es una palabra clave: es el objeto VBScript RegExp que tĂș creas, y no hace nada Ăștil hasta que fijas tres interruptores y eliges la salida correcta. Esta guĂ­a cubre el enlace tardĂ­o frente a añadir la referencia, por quĂ© Global vale False por defecto y asĂ­ solo obtienes la primera coincidencia, la diferencia entre Test, Replace y Execute, por quĂ© extraer implica ir mĂĄs allĂĄ de Match.Value hasta SubMatches, y el sabor de patrones de VBScript con sus retrorreferencias con signo de dĂłlar.

Henry
VBA Filter en Excel — subconjunto de un array en una sola llamada, y por quĂ© no es AutoFilter

VBA Filter en Excel — subconjunto de un array en una sola llamada, y por quĂ© no es AutoFilter

La funciĂłn Filter de VBA toma un array de cadenas unidimensional y devuelve un array nuevo y mĂĄs pequeño que contiene solo los elementos que incluyen la subcadena que nombras — es la prima en arrays de InStr, y nunca toca una celda. Esta guĂ­a deshace la confusiĂłn constante con AutoFilter (un mĂ©todo de hoja que oculta filas) y luego cubre las tres trampas que hacen que Filter parezca roto: coincide con subcadenas y no con valores enteros, distingue mayĂșsculas por defecto hasta que pasas vbTextCompare, y devuelve un array de base cero cuyo UBound es menos uno cuando nada coincide.

Henry
VBA Join en Excel — de array a cadena, el inverso exacto de Split

VBA Join en Excel — de array a cadena, el inverso exacto de Split

La funciĂłn Join de VBA pega un array unidimensional de vuelta en una sola cadena, colocando un delimitador entre cada elemento — es el inverso exacto de Split, y la cura en una lĂ­nea para el bucle de concatenaciĂłn que siempre deja un separador de mĂĄs al final. Esta guĂ­a muestra por quĂ© Join solo acepta un array de 1 dimensiĂłn (asĂ­ que Range.Value falla hasta que lo aplanas), por quĂ© el delimitador es un espacio por defecto en vez de nada, cĂłmo cada elemento se convierte a texto, y la tuberĂ­a Split-Filter-Join que reemplaza un bucle de quince lĂ­neas con una sola expresiĂłn.

Henry
VBA Transpose en Excel — remodela un array y aplana una columna a 1-D

VBA Transpose en Excel — remodela un array y aplana una columna a 1-D

Application.Transpose intercambia las filas y las columnas de un array, pero su verdadero trabajo cotidiano en VBA es mĂĄs discreto: transponer un rango de una sola columna lo colapsa en el array unidimensional que Join y Filter necesitan ambos. Esta guĂ­a cubre el truco de aplanar, por quĂ© es Application.Transpose y nunca un Transpose a secas, el techo silencioso de 65 536 elementos que te traiciona con datos grandes, y los errores que lanza con cadenas de mĂĄs de 255 caracteres o arrays que contienen un valor de error — para que sepas exactamente dĂłnde se detiene la remodelaciĂłn y empieza un bucle de verdad.

Henry
VBA Pivot Table en Excel — crear, refrescar, y por quĂ© muestra nĂșmeros viejos

VBA Pivot Table en Excel — crear, refrescar, y por quĂ© muestra nĂșmeros viejos

Una tabla dinĂĄmica en Excel VBA no lee tus celdas; lee un PivotCache, una instantĂĄnea congelada del origen tomada cuando se construyĂł la tabla, y ese Ășnico hecho explica la queja nĂșmero uno sobre tablas dinĂĄmicas: cambias los datos y la tabla sigue mostrando los totales de ayer hasta que llamas a RefreshTable. Esta guĂ­a cubre la construcciĂłn moderna en dos pasos con PivotCaches.Create y CreatePivotTable, la distribuciĂłn de campos con los cuatro valores de Orientation, añadir campos de datos con la funciĂłn de resumen correcta, la trampa del refresco, y la trampa del rango de origen que resuelves apuntando el cachĂ© a una Table para que la tabla crezca sola.

Henry
VBA Table (ListObject) en Excel — añade filas y deja de perseguir la Ășltima fila

VBA Table (ListObject) en Excel — añade filas y deja de perseguir la Ășltima fila

Una tabla de Excel en VBA es un ListObject, un rango que conoce su propio encabezado, su cuerpo de datos y sus bordes, y se autoexpande cuando escribes en Ă©l, que es justo por lo que acaba con la tarea de macro mĂĄs comĂșn: buscar la Ășltima fila con End(xlUp). Esta guĂ­a cubre convertir un rango con ListObjects.Add, direccionar las partes por nombre (HeaderRowRange, DataBodyRange, ListColumns), añadir filas de la forma fiable con ListRows.Add, la trampa de que DataBodyRange es Nothing en una tabla vacĂ­a, y escribir fĂłrmulas con referencias estructuradas que sobreviven a las inserciones.

Henry
VBA Chart en Excel — crea un grĂĄfico en cĂłdigo y por quĂ© dibuja los datos equivocados

VBA Chart en Excel — crea un grĂĄfico en cĂłdigo y por quĂ© dibuja los datos equivocados

Un grĂĄfico en Excel VBA no guarda datos; guarda una referencia a un Range, porque cada serie almacena sus valores como una fĂłrmula del tipo =Sheet1!$B$2:$B$13, y ese Ășnico hecho explica por quĂ© un grĂĄfico dibuja en silencio las celdas equivocadas en cuanto su origen se mueve. Esta guĂ­a cubre la divisiĂłn en dos contenedores con la que tropieza toda macro de grĂĄficos (los ChartObjects incrustados frente a las hojas de grĂĄfico), crear un grĂĄfico y enlazar los datos de una sola vez con SetSourceData, añadir series a mano con SeriesCollection.NewSeries, la trampa del grĂĄfico duplicado al reejecutar, y enlazar el origen a una Table para que el grĂĄfico siga a los datos en lugar de a una direcciĂłn congelada.

Henry
VBA Named Range en Excel — Names.Add, RefersTo, y por quĂ© tu referencia se desvĂ­a

VBA Named Range en Excel — Names.Add, RefersTo, y por quĂ© tu referencia se desvĂ­a

Un named range en Excel VBA no es un apodo para una celda, es una fĂłrmula almacenada que Excel resuelve cada vez que usas el nombre, y ese Ășnico hecho explica todas las sorpresas con nombres que te vas a encontrar. Es la razĂłn de que RefersTo necesite un signo igual inicial, de que los signos de dĂłlar decidan si el nombre es absoluto o se desvĂ­a con la celda activa, de que un nombre tenga un ĂĄmbito que es o bien todo el libro o bien una sola hoja, y de que borrar las celdas bajo un nombre lo deje apuntando a un error #REF! permanente. Esta guĂ­a cubre Names.Add y el atajo de una lĂ­nea Range.Name, el ĂĄmbito de libro frente al de hoja, cĂłmo leer el valor al que apunta un nombre, y cĂłmo limpiar los nombres rotos que inflan un libro.

Henry
VBA AutoFill en Excel — rellena una serie o una fórmula sin la trampa de Destination

VBA AutoFill en Excel — rellena una serie o una fórmula sin la trampa de Destination

AutoFill en Excel VBA es un motor de patrones, no un comando de copia, y tener clara esa distinción es lo que evita que te sorprenda. Range.AutoFill toma una pequeña semilla y la extiende por un destino mås grande, continuando una serie como 1, 2, 3 o los meses del año en lugar de solo repetir la semilla, que es a la vez todo el objetivo y toda la trampa. Esta guía cubre la regla del destino que provoca el error de tiempo de ejecución 1004 con el que todos tropiezan, el Type que decide si obtienes una serie o una copia, cómo rellenar una fórmula hacia abajo por una columna para que sus referencias se ajusten por fila, y por qué los mås sencillos FillDown y FillRight suelen ser la mejor herramienta cuando solo quieres una copia simple.

Henry
VBA Clear en Excel — ClearContents vs Clear vs Delete, y la trampa de la cadena vacía

VBA Clear en Excel — ClearContents vs Clear vs Delete, y la trampa de la cadena vacía

Borrar una celda en Excel VBA es un menĂș, no un Ășnico comando, y elegir la opciĂłn equivocada es como las macros destrozan en silencio una plantilla o desplazan las celdas de las que dependen otras fĂłrmulas. Una celda es una pila de capas: el valor y la fĂłrmula, el formato de nĂșmero, la fuente y el relleno, los bordes, la validaciĂłn y los comentarios, y cada mĂ©todo de borrado limpia un subconjunto elegido mientras el resto sobrevive. Esta guĂ­a cubre ClearContents frente a Clear frente a ClearFormats, por quĂ© poner una celda a una cadena vacĂ­a no es lo mismo que dejarla en blanco, la diferencia crucial entre Clear y Delete que cambia cada direcciĂłn por debajo de ella, y cĂłmo borrar todo un rango usado en una sola llamada rĂĄpida.

Henry
VBA Cell Value en Excel — leer y escribir .Value y el truco de rango a matriz

VBA Cell Value en Excel — leer y escribir .Value y el truco de rango a matriz

Leer y escribir una celda en Excel VBA pasa por la propiedad .Value de Range, y lo mås importante es lo que ocurre con mås de una celda: un rango de varias celdas te devuelve una matriz Variant bidimensional de base 1, y asignar una matriz de vuelta escribe todo el bloque en una sola llamada. Esa es la diferencia entre una macro que termina al instante y otra que se arrastra, porque cada acceso a Cells(i, j).Value cruza la frontera de VBA a Excel. Esta guía cubre .Value en una celda frente a un rango, el viaje de ida y vuelta con matrices que acelera las lecturas y escrituras masivas, por qué la matriz es 2D incluso para una sola columna, y el atajo de la propiedad por defecto en el que no deberías apoyarte.

Henry
VBA Formula en Excel — escribe fórmulas en código con .Formula y .FormulaR1C1

VBA Formula en Excel — escribe fórmulas en código con .Formula y .FormulaR1C1

Escribir una fĂłrmula desde Excel VBA significa asignar una cadena a la propiedad .Formula de Range, y la regla que sorprende a todos es que .Formula habla un Ășnico dialecto fijo: nombres de funciĂłn en inglĂ©s de EE. UU. y comas como separador, sin importar el idioma ni la configuraciĂłn regional del usuario. Asignar =SUM(A1:A10) funciona en cualquier mĂĄquina y Excel localiza la visualizaciĂłn; asignar el alemĂĄn =SUMME(A1;A10) lanza el error de tiempo de ejecuciĂłn 1004. Esta guĂ­a cubre .Formula frente a la versiĂłn localizada .FormulaLocal, .FormulaR1C1 para estampar fĂłrmulas relativas por todo un rango, por quĂ© el signo igual inicial es obligatorio, cĂłmo duplicar las comillas dentro de una fĂłrmula, y cĂłmo leer una fĂłrmula de vuelta con .HasFormula.

Henry
VBA Value vs Value2 vs Text en Excel — cuál lee la celda correctamente

VBA Value vs Value2 vs Text en Excel — cuál lee la celda correctamente

Una celda en Excel VBA tiene mĂĄs de una cara, y leer la equivocada es un error silencioso: .Value2 te da el nĂșmero guardado en bruto, .Value te da ese nĂșmero convertido al tipo de VBA que corresponde (una celda con formato de fecha devuelve un Date, una de moneda devuelve un Currency), y .Text te da la cadena con formato que se ve en pantalla, de solo lectura. Leer .Text para hacer cuentas te devuelve una cadena como $1,235 o incluso ### cuando la columna es estrecha; leer .Value en una celda de moneda puede redondear un nĂșmero grande; .Value2 es el valor por defecto rĂĄpido y sin pĂ©rdidas. Esta guĂ­a explica las tres caras de lectura, cuĂĄndo la conversiĂłn a Currency y Date pierde precisiĂłn, por quĂ© .Text es de solo visualizaciĂłn y no se le puede asignar, y quĂ© cara elegir en cada caso.

Henry
VBA Shell en Excel — ejecuta un programa externo, y por quĂ© tu cĂłdigo no espera

VBA Shell en Excel — ejecuta un programa externo, y por quĂ© tu cĂłdigo no espera

La funciĂłn Shell de VBA lanza un programa externo y se marcha al instante — es fire-and-forget, dispara y se olvida. Shell devuelve un ID de tarea, no el cĂłdigo de salida del programa, ni su salida de texto, ni una señal de Ă©xito, y la siguiente lĂ­nea de tu macro se ejecuta mientras el programa todavĂ­a estĂĄ arrancando. Ese es el bug detrĂĄs de casi todo el cĂłdigo con Shell: lanzas un conversor con Shell y luego intentas abrir un archivo que aĂșn no ha escrito. Esta guĂ­a explica por quĂ© Shell no espera, cĂłmo entrecomillar rutas que contienen espacios, por quĂ© Shell lanza ejecutables pero no puede abrir por sĂ­ solo un PDF ni una URL, y cuĂĄndo abandonar Shell por WScript.Shell Run o Exec para poder de verdad esperar al programa y leer lo que produjo.

Henry
VBA Environ en Excel — lee rutas de Windows sin codificar a fuego una carpeta de usuario

VBA Environ en Excel — lee rutas de Windows sin codificar a fuego una carpeta de usuario

La funciĂłn Environ de VBA lee las variables de entorno que Windows entrega a cada programa — USERPROFILE, TEMP, USERNAME, APPDATA — para que construyas rutas especĂ­ficas del usuario sin codificar a fuego C:\Users\John, que se rompe en cualquier otra mĂĄquina. Su trampa caracterĂ­stica es silenciosa: una variable que falta o estĂĄ mal escrita devuelve una cadena vacĂ­a, no un error, asĂ­ que Environ de TMEP entrega calladamente una cadena vacĂ­a y tu ruta acaba en la raĂ­z del disco. Esta guĂ­a cubre por quĂ© Environ es la herramienta de rutas portables, por quĂ© debes tratar cada resultado como posiblemente vacĂ­o, las dos formas de llamada (por nombre frente a por Ă­ndice numĂ©rico), la instantĂĄnea que Environ toma cuando Excel arranca, y lo que Environ no puede hacer — fijar variables o leer las que cambiaron despuĂ©s del arranque.

Henry
VBA CreateObject en Excel — enlace tardĂ­o, GetObject y por quĂ© Outlook se queda abierto

VBA CreateObject en Excel — enlace tardĂ­o, GetObject y por quĂ© Outlook se queda abierto

CreateObject es la llave maestra de VBA a todo lo que estĂĄ fuera de Excel — inicia cualquier aplicaciĂłn COM por su cadena ProgID: Scripting.FileSystemObject, Scripting.Dictionary, Outlook.Application, WScript.Shell, Word.Application. Esa bĂșsqueda por cadena es enlace tardĂ­o: el compilador no sabe nada del objeto, asĂ­ que un ProgID equivocado o una app que no estĂĄ instalada falla solo en tiempo de ejecuciĂłn con el error 429. Esta guĂ­a explica la decisiĂłn de verdad entre enlace tardĂ­o y enlace temprano (portabilidad frente a IntelliSense), por quĂ© CreateObject siempre inicia una instancia nueva mientras que GetObject se engancha a una que ya se ejecuta, y por quĂ© un proceso headless de Outlook o Excel se queda colgado en el Administrador de tareas cuando olvidas hacer Quit de la app y poner el objeto a Nothing.

Henry
VBA Now, Date y Time en Excel — leer el reloj, y por quĂ© Date tambiĂ©n es una instrucciĂłn

VBA Now, Date y Time en Excel — leer el reloj, y por quĂ© Date tambiĂ©n es una instrucciĂłn

Una fecha de VBA es un Double — la parte entera cuenta los dĂ­as desde el 30/12/1899 y la fracciĂłn es la hora del dĂ­a, asĂ­ que Now, Date y Time son tres lecturas del mismo reloj. Now devuelve fecha y hora, Date devuelve hoy a medianoche, Time devuelve solo la hora. El bug que rompe la mayorĂ­a del cĂłdigo es comparar un valor guardado de Now con Date y no coincidir nunca, porque Now arrastra una fracciĂłn de hora que Date no tiene. Peor aĂșn, Date y Time tambiĂ©n son instrucciones que reajustan el reloj del sistema. Esta guĂ­a muestra quĂ© es de verdad ese Double, por quĂ© falla la igualdad, cĂłmo quitar la hora con Int o DateValue, y por quĂ© Now es hora local y no UTC.

Henry
VBA DateAdd y DateDiff en Excel — aritmĂ©tica de fechas sin el bug de la longitud del mes

VBA DateAdd y DateDiff en Excel — aritmĂ©tica de fechas sin el bug de la longitud del mes

Como una fecha de VBA es un Double, sumar 1 avanza un dĂ­a y la aritmĂ©tica simple es correcta — para dĂ­as. Se rompe en cuanto tratas un mes como 30 dĂ­as o un año como 365, porque los meses y los años bisiestos no tienen longitud fija. DateAdd conoce el calendario, asĂ­ que sumar un mes al 31 de enero devuelve el 28 de febrero en lugar de un imposible dĂ­a 31. DateDiff cuenta las fronteras cruzadas, no el tiempo transcurrido, asĂ­ que del 31 de diciembre al 1 de enero hay un año aunque solo pase un dĂ­a. DateSerial construye una fecha a partir del año, el mes y el dĂ­a sin ambigĂŒedad regional y normaliza el desbordamiento, lo que da el idiom limpio del Ășltimo dĂ­a del mes. Esta guĂ­a muestra cuĂĄndo basta con el mĂĄs simple, los cĂłdigos de intervalo que hacen tropezar, y por quĂ© DateDiff es un conteo de fronteras.

Henry
VBA Weekday y DatePart en Excel — extraer partes de una fecha, y por quĂ© el lunes no es 1

VBA Weekday y DatePart en Excel — extraer partes de una fecha, y por quĂ© el lunes no es 1

Year, Month, Day, Hour, Minute y Second sacan cada uno un entero de una fecha — ese Double en el que ya puedes ver dentro — y son tan simples como parecen. Weekday es la que muerde — devuelve de 1 a 7, pero la numeraciĂłn depende de un segundo argumento que por defecto es domingo igual a 1, asĂ­ que en una llamada normal el lunes es 2, no 1, y toda prueba de fin de semana construida sobre un nĂșmero fijo estĂĄ silenciosamente mal. DatePart es el extractor general con los mismos cĂłdigos de intervalo que DateAdd, y alcanza partes que no tienen funciĂłn propia como el nĂșmero de semana y el trimestre, aunque su regla de semana no es ISO 8601 por defecto. WeekdayName y MonthName devuelven nombres en el idioma de la mĂĄquina, buenos para mostrar pero no para volver a leer. Esta guĂ­a muestra cĂłmo extraer cada parte y por quĂ© el lunes no es 1.

Henry
VBA FreeFile y la instrucciĂłn Open en Excel — obtĂ©n un nĂșmero de archivo, abre un archivo de texto (no un libro)

VBA FreeFile y la instrucciĂłn Open en Excel — obtĂ©n un nĂșmero de archivo, abre un archivo de texto (no un libro)

En el VBA built-in un archivo de texto se alcanza a travĂ©s de un canal numerado — escribes la instrucciĂłn Open con el modo For Output y un nĂșmero de canal que debes tomar de FreeFile en lugar de elegirlo a mano. Fija a fuego el nĂșmero uno y en cuanto haya dos archivos abiertos te topas con el error 55 File already open; abre For Output sobre un archivo que ya tiene datos y queda truncado a vacĂ­o; olvida Close y el archivo permanece bloqueado hasta que Excel se cierra. Esta guĂ­a muestra por quĂ© FreeFile te entrega un nĂșmero de canal para capturar en una variable, la diferencia entre For Output, For Append y For Input, por quĂ© la instrucciĂłn Open no es Workbooks.Open, y el patrĂłn de limpieza que siempre cierra el canal.

Henry
VBA Print # vs Write # en Excel — escribe un archivo de texto o CSV (y por quĂ© el tuyo tiene comillas alrededor de todo)

VBA Print # vs Write # en Excel — escribe un archivo de texto o CSV (y por quĂ© el tuyo tiene comillas alrededor de todo)

Las instrucciones Print y Write dan respuestas opuestas a quĂ© aspecto deben tener los bytes en disco. Print escribe el texto exactamente como aparece — sin comillas, sin comas, tĂș construyes la disposiciĂłn — asĂ­ que es lo correcto para un informe o un CSV hecho a mano. Write escribe formato mĂĄquina — cada cadena envuelta en comillas, comas entre valores, fechas entre almohadillas — diseñado para que lo relea Input, no un humano ni Excel. Esta guĂ­a muestra por quĂ© Write es la razĂłn de que tu CSV estĂ© lleno de comillas, por quĂ© una coma en una lista de Print inserta zonas de impresiĂłn en lugar de comas de CSV, cĂłmo For Output trunca mientras For Append añade, la trampa regional de la coma decimal, y por quĂ© la escritura built-in es ANSI en vez de UTF-8.

Henry
VBA leer un archivo de texto en Excel — Line Input vs Input #, y el bucle EOF que no pierde filas

VBA leer un archivo de texto en Excel — Line Input vs Input #, y el bucle EOF que no pierde filas

Leer un archivo de texto en VBA tiene tres herramientas y elegir la equivocada desordena tus datos. Line Input lee una lĂ­nea cruda en una cadena y la divides tĂș mismo, lo cual es predecible. Input parsea los campos delimitados directamente en variables — rĂĄpido para un archivo que produjo Write, pero se atraganta con comas sin comillas y comillas sueltas. La funciĂłn Input con LOF engulle el archivo entero en una sola cadena. Esta guĂ­a muestra el bucle EOF que lee cada fila exactamente una vez, por quĂ© Input es el gemelo de Write y Line Input el gemelo de Print, cĂłmo evitar el error de uno en uno que lanza el error 62, y cuĂĄndo es mejor abrir un CSV como libro que parsearlo a mano.

Henry
VBA MkDir en Excel — crea una carpeta, y por quĂ© no puede crear una ruta anidada

VBA MkDir en Excel — crea una carpeta, y por quĂ© no puede crear una ruta anidada

La instrucciĂłn MkDir de VBA crea exactamente un nivel de carpeta, no una ruta entera — MkDir sobre una ruta cuyo padre no existe lanza el error 76, y MkDir sobre una carpeta que ya existe lanza el error 75 en lugar de no hacer nada. AsĂ­ que la tarea cotidiana de crear esta carpeta es en realidad crear cada nivel que falta, y solo donde no estĂĄ. Esta guĂ­a muestra por quĂ© MkDir crea solo un nivel, por quĂ© FileSystemObject.CreateFolder tampoco recursa, el bucle protegido por comprobaciĂłn de existencia que construye una ruta completa de forma segura, y por quĂ© un nombre de carpeta desnudo aterriza bajo CurDir en lugar de la carpeta de tu libro.

Henry
VBA RmDir en Excel — borra una carpeta, pero solo si está vacía

VBA RmDir en Excel — borra una carpeta, pero solo si está vacía

La instrucciĂłn RmDir de VBA borra una carpeta solo cuando estĂĄ completamente vacĂ­a — apĂșntala a una carpeta que todavĂ­a contiene archivos o subcarpetas y lanza el error 75, la imagen especular exacta de Kill, que borra cualquier archivo sin piedad. AsĂ­ que borrar esta carpeta es en realidad vaciarla primero, y luego eliminarla. Esta guĂ­a muestra por quĂ© RmDir rechaza una carpeta no vacĂ­a, por quĂ© borra carpetas pero nunca archivos, cĂłmo vaciar una carpeta con Kill antes de RmDir, y cuĂĄndo FileSystemObject.DeleteFolder arrasa un ĂĄrbol entero en una sola llamada — sin Papelera de reciclaje y sin deshacer.

Henry
VBA CurDir & ChDir in Excel — por quĂ© una ruta relativa aterriza en la carpeta equivocada

VBA CurDir & ChDir in Excel — por quĂ© una ruta relativa aterriza en la carpeta equivocada

En VBA una ruta relativa no tiene significado hasta que se resuelve contra CurDir, el directorio de trabajo actual — y en Excel ese directorio es un ajuste itinerante que no controlas, no la carpeta donde estĂĄ guardado tu libro. AsĂ­ que MkDir Reports u Open data.csv pueden aterrizar en un sitio distinto en cada ejecuciĂłn, porque un diĂĄlogo de Abrir archivo mueve CurDir en silencio. Esta guĂ­a muestra por quĂ© CurDir no es ThisWorkbook.Path, por quĂ© ChDir no puede cambiar la unidad sin ChDrive, y el Ășnico hĂĄbito que elimina toda la clase de bugs de carpeta equivocada — ancla cada ruta a ThisWorkbook.Path.

Henry
VBA Copiar Archivo en Excel — FileCopy, FileSystemObject.CopyFile, y por quĂ© no puede copiar un libro abierto

VBA Copiar Archivo en Excel — FileCopy, FileSystemObject.CopyFile, y por quĂ© no puede copiar un libro abierto

Copiar un archivo en VBA es una sola lĂ­nea, pero cuĂĄl lĂ­nea depende de si el archivo estĂĄ abierto. FileCopy es el built-in sin ninguna referencia que añadir, y sobrescribe el destino en silencio, pero no puede copiar un archivo que estĂĄ abierto y lanza el error 70 Permission denied justo en el libro que mĂĄs quieres respaldar. Esta guĂ­a traza la lĂ­nea entre tres herramientas de copia para tres situaciones — FileCopy para archivos cerrados en disco, FileSystemObject.CopyFile para comodines y un flag de sobrescritura explĂ­cito, y SaveCopyAs para el libro que estĂĄ abierto ahora mismo — y muestra por quĂ© el destino debe ser una ruta completa que incluya el nombre del archivo, por quĂ© la carpeta de destino debe existir ya, y cĂłmo copiar-y-luego-borrar se convierte en mover.

Henry
VBA Borrar Archivo en Excel — Kill, FileSystemObject.DeleteFile, y por quĂ© no hay deshacer

VBA Borrar Archivo en Excel — Kill, FileSystemObject.DeleteFile, y por quĂ© no hay deshacer

La instrucciĂłn Kill de VBA borra un archivo de forma permanente — sin Papelera de reciclaje, sin confirmaciĂłn, sin deshacer. Ese Ășnico hecho es a la vez todo el sentido y todo el peligro, y cada otra regla sobre borrar archivos es una forma de proteger esa lĂ­nea irreversible. Esta guĂ­a muestra por quĂ© Kill da error en lugar de no hacer nada cuando un archivo falta o estĂĄ abierto, cĂłmo un comodĂ­n como Kill C dos puntos barra invertida Temp barra invertida asterisco punto tmp borra cada coincidencia de una vez sin ningĂșn aviso, por quĂ© Kill no puede eliminar una carpeta y cĂłmo RmDir y DeleteFolder reparten ese trabajo, y cuĂĄndo FileSystemObject.DeleteFile con su flag Force es la opciĂłn mĂĄs segura para archivos de solo lectura.

Henry
VBA Renombrar Archivo en Excel — la instrucciĂłn Name que tambiĂ©n mueve archivos (y se niega a sobrescribir)

VBA Renombrar Archivo en Excel — la instrucciĂłn Name que tambiĂ©n mueve archivos (y se niega a sobrescribir)

La instrucciĂłn Name de VBA renombra un archivo, pero en realidad es una instrucciĂłn de renombrar-y-mover — apunta la nueva ruta a una carpeta distinta y VBA mueve el archivo allĂ­ en lugar de renombrarlo en su sitio. Y a diferencia de casi todo lo demĂĄs en el disco, Name se niega a sobrescribir, lanzando el error 58 cuando el destino ya existe, justo lo contrario de FileCopy que sobrescribe en silencio. Esta guĂ­a muestra por quĂ© Name mueve ademĂĄs de renombrar, por quĂ© no cruza unidades y cĂłmo FileCopy mĂĄs Kill o FileSystemObject.MoveFile maneja ese caso, y por quĂ© debes proteger el destino para que un error sobre un archivo existente no detenga una macro desatendida.

Henry
VBA Dir en Excel — recorre los archivos de una carpeta, y el iterador con estado que te muerde

VBA Dir en Excel — recorre los archivos de una carpeta, y el iterador con estado que te muerde

Dir parece una funciĂłn pero se comporta como un iterador con memoria oculta — Dir(path) devuelve el nombre del primer archivo que coincide, luego Dir() sin argumentos devuelve el siguiente, y una cadena vacĂ­a cuando la carpeta se agota. La Ășnica regla que te salva es no volver a llamar a Dir nunca en mitad de un bucle Dir, porque un segundo Dir inicia una bĂșsqueda nueva y reinicia la primera — la causa nĂșmero uno de archivos saltados y bucles infinitos. Aprende a recorrer cada .xlsx de una carpeta, por quĂ© Dir devuelve solo el nombre y no la ruta, por quĂ© no puede entrar en subcarpetas, y cuĂĄndo reunir los nombres en un array antes de tocar los archivos.

Henry
VBA FileSystemObject en Excel — CreateObject frente a referencia, subcarpetas y por quĂ© no abre libros

VBA FileSystemObject en Excel — CreateObject frente a referencia, subcarpetas y por quĂ© no abre libros

El FileSystemObject convierte el disco en un modelo de objetos — carpetas y archivos que recorres con For Each y de los que lees propiedades, en lugar del Ășnico cursor oculto de Dir. La decisiĂłn que te salva es CreateObject(Scripting.FileSystemObject) frente a Dim fso As New FileSystemObject, porque el enlace tardĂ­o no necesita ninguna referencia y corre en cualquier mĂĄquina, mientras que la versiĂłn de enlace temprano no compila en cuanto aterriza en un PC sin la casilla del Microsoft Scripting Runtime marcada. Aprende cuĂĄndo FSO le gana a Dir, cĂłmo entrar de forma recursiva en las subcarpetas que su colecciĂłn SubFolders vuelve triviales, cĂłmo leer Size y DateLastModified, y por quĂ© FSO abre archivos de texto pero nunca abre un libro de Excel.

Henry
VBA Comprobar si un Archivo Existe — Dir frente a FileSystemObject.FileExists (y la trampa dentro de un bucle Dir)

VBA Comprobar si un Archivo Existe — Dir frente a FileSystemObject.FileExists (y la trampa dentro de un bucle Dir)

Hay dos formas correctas de comprobar si un archivo existe en VBA y un reflejo equivocado. El reflejo es simplemente abrirlo y atrapar el error, que es lento y esconde fallos de verdad. Las respuestas correctas son Dir(path) (una lĂ­nea con el built-in) y fso.FileExists(path) (sin estado y mĂĄs claro) — y la regla que te salva es no usar nunca la comprobaciĂłn con Dir dentro de un bucle Dir, porque Dir comparte un Ășnico cursor oculto y la prueba de existencia reinicia tu enumeraciĂłn de archivos en silencio. Aprende por quĂ© FileExists es el valor por defecto mĂĄs seguro, cĂłmo Dir maneja mal una ruta de carpeta o una barra invertida final, y por quĂ© comprobar y luego abrir todavĂ­a necesita una protecciĂłn de errores.

Henry
VBA Abrir Libro en Excel — Workbooks.Open, captura el valor de retorno y por quĂ© no es Workbook_Open

VBA Abrir Libro en Excel — Workbooks.Open, captura el valor de retorno y por quĂ© no es Workbook_Open

Workbooks.Open es una funciĂłn que devuelve el libro que acaba de abrir, asĂ­ que la Ășnica regla que te salva es Set wb = Workbooks.Open(path) — captura ese valor de retorno y hĂĄblale a wb, nunca a ActiveWorkbook, que cambia en cuanto algo roba el foco. Aprende la diferencia entre Workbooks.Open (un mĂ©todo que llamas) y Workbook_Open (un evento que se ejecuta solo), cĂłmo proteger una ruta que no existe para recibir un mensaje en vez del error 1004 en tiempo de ejecuciĂłn, cĂłmo manejar un archivo que ya estĂĄ abierto, y quĂ© parĂĄmetros abren en silencio un cuadro de diĂĄlogo y cuelgan una macro desatendida.

Henry
VBA Guardar Libro en Excel — Save frente a SaveAs, la trampa de FileFormat y por quĂ© desaparecen tus macros

VBA Guardar Libro en Excel — Save frente a SaveAs, la trampa de FileFormat y por quĂ© desaparecen tus macros

Save sobrescribe el archivo que ya tienes, en el sitio y sin ningĂșn cuadro de diĂĄlogo. SaveAs escribe un archivo nuevo o un tipo nuevo, y el nĂșmero de FileFormat es la trampa — guarda un libro con macros como xlOpenXMLWorkbook (51, el formato xlsx) y Excel descarta en silencio hasta la Ășltima lĂ­nea de tu VBA; necesitas xlOpenXMLWorkbookMacroEnabled (52) para el xlsm. Aprende cuĂĄndo usar Save, SaveAs y SaveCopyAs, por quĂ© Save sobre un libro reciĂ©n creado abre el cuadro Guardar como y cuelga una macro desatendida, cĂłmo DisplayAlerts convierte el aviso de sobrescritura en una preaprobaciĂłn, y por quĂ© wb.Saved = True marca el libro como limpio sin escribir nada.

Henry
VBA Cerrar Libro en Excel — SaveChanges, el aviso que cuelga tu macro y cómo cerrar sin guardar

VBA Cerrar Libro en Excel — SaveChanges, el aviso que cuelga tu macro y cómo cerrar sin guardar

wb.Close sobre un libro con cambios sin guardar lanza el cuadro de diĂĄlogo modal que pregunta si quieres guardar los cambios, y en una macro desatendida ese cuadro espera para siempre. Lo respondes desde el cĂłdigo con el argumento SaveChanges — wb.Close SaveChanges:=False descarta, SaveChanges:=True guarda primero, y omitirlo hace que aparezca el aviso. Aprende por quĂ© cerrar sin el argumento es la razĂłn nĂșmero uno de que una macro programada nunca termine, por quĂ© la variable de objeto queda muerta en el instante en que cierras, en quĂ© se diferencia Close de Application.Quit, y por quĂ© cerrar el Ășltimo libro puede dejar un EXCEL.EXE invisible en marcha.

Henry
VBA Wait en Excel — Application.Wait, por quĂ© congela Excel y cuĂĄndo usar Sleep en su lugar

VBA Wait en Excel — Application.Wait, por quĂ© congela Excel y cuĂĄndo usar Sleep en su lugar

Application.Wait es un despertador, no un cronĂłmetro. Le das un momento del reloj al que despertar, no un nĂșmero de segundos que descontar, y por eso Application.Wait 5 no hace casi nada y la lĂ­nea correcta es Application.Wait Now + TimeValue("0:00:05"). Solo distingue segundos enteros y congela Excel por completo mientras espera, asĂ­ que no puede repintar la pantalla, actualizar una barra de estado ni dejar que el usuario cancele. Aprende el modelo del despertador, el argumento de tiempo absoluto con el que todo el mundo tropieza, por quĂ© las pausas por debajo del segundo necesitan Sleep, y por quĂ© una pausa en la que Excel debe seguir vivo es un bucle DoEvents en su lugar.

Henry
VBA Sleep en Excel — la llamada a la API de Windows, la trampa PtrSafe de 64 bits y Wait frente a Sleep

VBA Sleep en Excel — la llamada a la API de Windows, la trampa PtrSafe de 64 bits y Wait frente a Sleep

Sleep no es una palabra clave de VBA. Es una funciĂłn de kernel32 de Windows que tomas prestada con una instrucciĂłn Declare para pausar tu macro un nĂșmero de milisegundos, y por eso te da la precisiĂłn por debajo del segundo que Application.Wait no alcanza. La trampa es la propia declaraciĂłn. Las viejas lĂ­neas Declare Sub Sleep copiadas y pegadas lanzan un error de compilaciĂłn en Excel de 64 bits hasta que añades el atributo PtrSafe dentro de una guarda de compilaciĂłn condicional VBA7. Aprende el modelo de la API prestada, el arreglo exacto para 64 bits, por quĂ© los milisegundos no son precisos, y por quĂ© Sleep aĂșn congela Excel, asĂ­ que una pausa receptiva es un bucle DoEvents en su lugar.

Henry
VBA Timer en Excel — mide cuĂĄnto tarda tu macro (y por quĂ© no es un programador de tareas)

VBA Timer en Excel — mide cuĂĄnto tarda tu macro (y por quĂ© no es un programador de tareas)

La funciĂłn Timer de VBA es un cronĂłmetro, no una cuenta atrĂĄs. A pesar del nombre nunca hace que ocurra nada despuĂ©s de N segundos y nunca pausa tu cĂłdigo. Solo devuelve el nĂșmero de segundos transcurridos desde medianoche, y lo lees dos veces para medir cuĂĄnto tardĂł un bloque de cĂłdigo. Eso lo convierte en la herramienta que demuestra que ScreenUpdating igual a False de verdad hizo tu macro mĂĄs rĂĄpida, en vez de adivinar. Aprende el modelo del cronĂłmetro, por quĂ© quien busca un temporizador suele querer Application.OnTime en su lugar, el bug del reinicio a medianoche que produce tiempos transcurridos negativos, y su resoluciĂłn de una centĂ©sima de segundo.

Henry
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