Traducir el blog
Rendimiento de las macros VBA
🔝To translate this blog post to your language, select it in the top left Google box.
Mientras diseño un mapa del mundo me he encontrado con la tarea de calcular la localización de cada país en el mapa mundial.
Cada vez que cambia el zoom o el scroll del mapa tengo que recalcular la posición de los países, por lo que el algoritmo de cálculo debe ser eficiente y con un rendimiento máximo para que ese cálculo no interfiera en el manejo del mapa.
Explicaré por qué utilizar una matriz para recopilar datos de las formas de lo países y escribir en la matriz en lugar de escribir directamente en un rango de celdas de la hoja de trabajo.
En estos artículos encontrarás más información de las matrices (array) y de las formas (shapes):
Este consejo de optimización del código VBA permite mejorar el rendimiento, reduciendo el tiempo de ejecución entre 10 y 100 veces.
Este artículo en inglés es muy relevante:
Chip Pearson comenta que:
La transferencia de datos entre celdas de la hoja de cálculo y variables de VBA es una operación costosa en tiempo de ejecución, por lo que debe reducirse lo más posible. Puede aumentar considerablemente el rendimiento de su aplicación Excel pasando matrices de datos a la hoja de cálculo, y viceversa, en una sola operación en lugar de una celda cada vez. Si necesita realizar cálculos extensos sobre datos en VBA, debe transferir todos los valores de la hoja de trabajo a una matriz, hacer los cálculos en la matriz y luego escribir la matriz nuevamente en la hoja de trabajo. Esto mantiene al mínimo la cantidad de veces que se transfieren datos entre la hoja de trabajo y VBA. Es mucho más eficaz transferir en una única instrucción una matriz de 100 valores a la hoja de cálculo que transferir cada uno de los 100 elementos separadamente en una celda diferente.
Con esta técnica de cargar la matriz y escribirla en las celdas una sola vez, he conseguido tiempos de ejecución de menos de medio segundo, cuando un bucle para escribir separadamente en las celdas no baja de 60 segundos.
Como se aprende practicando, os dejo un ejemplo con las dos macros, la lenta y la rápida.
El problema es que en la hoja 'Mapa' hay formas (shapes) de 240 países que hay que guardar en una tabla de la hoja 'Fronteras', para lo que hace falta una macro que escriba en la tabla algunas de las propiedades de las 240 formas, lo que se hace con un bucle de dos maneras diferentes.
Las propiedades de las formas se guardan en la tabla "TablaFronteras" en las 5 primeras columnas, el resto de columnas se calculan con fórmulas que hay que mantener.
Normalmente se programa la macro lenta si no se conoce la técnica de la macro rápida, que mejora el rendimiento al usar matrices (arrays). A continuación explicaré la diferencia principal entre estas dos macros.
Se escribe cada celda dentro de un bucle a la vez que se leen las propiedades de cada una de las formas (shapes) de cada país del mapa. Este método es ineficiente pues consume mucho tiempo escribir celdas individualmente, pues las macros VBA y Excel son dos mundos separados y el interfaz de conexión entre ellos no está optimizado internamente.
Con un bucle se escriben las propiedades de cada forma (shape) de los países en una matriz (array) bidimensional, que se copia en el rango de celdas de la tabla con una única instrucción, lo que mejora su rendimiento pues es el método más eficiente.
La única instrucción que copia la matriz en el rango está optimizada internamente para pasar valores entre VBA y la hoja de cálculo.
En este vídeo explico cómo usar las dos macros y calcular su rendimiento.
Descarga la versión 2.0 desde uno de estos enlaces:
- Microsoft OneDrive: Rendimiento de las macros - PW2.xlsm
- Sites Google Drive: Rendimiento de las macros - PW2.xlsm
Las macros del archivo descargado están bloqueadas por defecto. Para desbloquear las macros debes modificar las Propiedades del archivo siguiendo estas instrucciones:
Las macros de Internet están bloqueadas de forma predeterminada en Office - Deploy Office | Microsoft Learn
Abre el archivo y presiona el botón: Habilitar edición cuando aparezca el aviso de VISTA PROTEGIDA.
Presiona el botón: Habilitar contenido cuando aparezca la ADVERTENCIA DE SEGURIDAD Las macros se han deshabilitado o se deshabilitó parte del contenido activo.
Las hojas no están protegidas, y no está protegido el proyecto VBA, por lo que puedes estudiar y analizar el código de las macros.
ATENCIÓN: Se puede modificar este libro de Excel respetando esta licencia:
Creative Commons — Atribución-NoComercial-CompartirIgual 3.0 No portada — CC BY-NC-SA 3.0
Con el archivo descargado los tiempos de ejecución son mucho más rápidos que en el vídeo pues es un ejemplo reducido.
- Macro lenta: >0,6 segundos
- Macro rápida: <0,05 segundos
El rendimiento es de más de 1 a 10 con matrices.
Los tiempos en el vídeo son con el archivo que estoy diseñando ¡es el caso real!:
- Macro lenta: >60 segundos
- Macro rápida: <0,5 segundos
El rendimiento es de más de 1 a 100 con matrices.
La macro lenta se ejecuta en 0,6 segundos en un archivo reducido, pero ese tiempo es de 60 segundos en el archivo real del vídeo. El escalado empeora el tiempo en un factor de 100.
La macro rápida se ejecuta en 0,05 segundos en un archivo reducido, y en 0,5 segundos en el archivo real del vídeo. El escalado solo empeora el tiempo en un factor de 10, siendo razonables los 0,5 segundos que es mejor tiempo para la macro rápida que el mejor tiempo de la macro lenta en un archivo reducido.
A veces no tenemos en cuenta que el rendimiento de los algoritmos no optimizados empeora con el escalado de las aplicaciones.
Una macro que parece rápida y eficaz se vuelve lenta y torpe cuando las hojas de cálculo crecen, pues no están optimizadas para el escalado y el rendimiento óptimo, que hay que tener en cuenta desde la primera versión del algoritmo si no queremos encontrarnos sorpresas desagradables cuando el proyecto crezca.
Para la aplicación que estoy desarrollando de un Mapa del mundo es importante que funcione en todo tipo de máquinas, también en las lentas con versiones antiguas de Excel.
Los tiempos de la macro rápida en mi viejo portátil con Excel 2010 corriendo en Windows 7 son similares a los de mi nuevo portátil con Excel para Microsoft 365 en Windows 11. La macro lenta tiene un rendimiento un 100% inferior en el viejo portátil.
En la versión 2.0 he incluido varias macros más de este hilo:
Me ayudaron desinteresadamente los grandes maestros Héctor Miguel y Macro Antonio a mejorar el rendimiento de las macros:
- GuardarFronterasLento en el MóduloFronteras por Pedro Wave.
- Mejor tiempo: 0,53 segundos.
- En un bucle recorre cada forma (shape) y guarda sus propiedades en la tabla.
- getShapesListInWorksheet en el MóduloHM por Héctor Miguel Orozco Díaz.
- Mejor tiempo: 0,21 segundos.
- La UDF getShapePropertie se copia en la tabla y se pegan sus valores.
- No usa bucles, ya que son sustituidos por: With Worksheets("Fronteras").[A2].Resize(n)
- GuardarFronterasMA en el MóduloMA por Macro Antonio.
- Mejor tiempo: 0,24 segundos.
- Guarda en una matriz (array) las propiedades de las formas (shapes).
- Redimensiona la matriz con todas las columnas de la tabla, incluidas las que tienen fórmulas.
- Cambia el tamaño de la tabla y copia las fórmulas en las 4 columnas de la derecha.
- Es lenta porque tiene que desproteger la hoja 'Fronteras' y volver a protegerla.
- GuardarFronterasRápido en el MóduloFronteras por Pedro Wave.
- Mejor tiempo: 0,03 segundos.
- Guarda en una matriz (array) las propiedades de las formas (shapes).
- Copia la matriz en la tabla con una sola instrucción.
- GuardarFronteras en el MóduloFronteras por Macro Antonio.
- Mejor tiempo: 0,01 segundos.
- Guarda en una matriz (array) las propiedades de las formas (shapes).
- Copia la matriz en la tabla con una sola instrucción.
- La macro está muy optimizada para reducir al máximo el tiempo de ejecución.
Todas las adaptaciones y cambios de macros son de mi responsabilidad si, por alguna circunstancia que se me escapa, empeoraron su rendimiento.
Esta última macro es óptima pues mejora el rendimiento hasta 1.000 veces en el prototipo real de un mapa mundial que publicaré próximamente.
Pronto publicaré un mapa completo del mundo con todas las funciones y características que voy publicando estas últimas semanas aquí:
Mi lista de blogs
-
Nueva Función TRIMRANGE y Nuevo Operador de Rango - Hoy vengo con novedades emocionantes en Excel: Microsoft ha liberado una nueva función llamada TRIMRANGE y ha introducido un nuevo […] The post Nueva Fun...Hace 1 día
-
Divisor propio mayor que la raíz cuadrada - Explorando por OEIS, encontré un tipo de números en https://oeis.org/A332269 y me ha apetecido desarrollar el tema mediante nuestras funciones en hoja ...Hace 1 día
-
PASAR DATOS A FILAS SEGÚN ELEMENTOS ENTRE GUIONES UTILIZANDO POWER QUERY - Hola a todos! Después del post anterior (aquí) en el que realizábamos una tarea utilizando VBA, me gustaría replicar el mismo trabajo pero usando Power …...Hace 3 días
-
3DFrame-py; with non-linear analysis - Exactly a year since the previous update I have revised the 3DFrame-py spreadsheet with the addition of non-linear analysis options. The new files can be d...Hace 4 días
-
Tiempo pasado, presente y futuro - 🔝*To translate this blog post to your language, select it in the top left Google box. * AVISOS que salvan vidas Haciendo caso de las posibles inund...Hace 5 días
-
Color, Conditions, and Copilot: How to save time using conditional formatting with Copilot in Excel - Hi everyone, this is part 11 in a series of posts to show you some of the things that are possible to do with Copilot in Excel. *What is conditional f...Hace 6 días
-
5 Ways to Calculate Hours Worked in Microsoft Excel - Wondering how to calculate hours worked in Excel? You’ve reached the best resource to learn from. So, tag along! Calculating time values in Microsoft Excel...Hace 1 semana
-
Insertar un objeto vinculado en Excel es fácil y práctico - Aprende a insertar un objeto en Excel. Ya puedes traer objeto vinculado en Excel de manera más avanzada que con los comandos Copiar y Pegar te permiten t...Hace 1 semana
-
Debra’s Excel News–October 2024 - New PIVOTBY function, get ready for Spreadsheet Day, and more, in this month’s Excel news. Visit my Excel website for more tips, tutorials and videos, and ...Hace 4 semanas
-
4 ejemplos de utilización de validación de datos con fórmulas - Ya sabes que la herramienta de Validación de datos es de gran utilidad para controlar y restringir la introducción de datos y así, asegurarte de…Hace 1 mes
-
Trucos de Excel: Referencias Relativas, Absolutas y Mixtas Explicadas ✨ [VIDEO] - ¡Hola a todos! Hoy hablaremos sobre un tema muy importante para quienes usan Excel: los tipos de referencia. Las referencias son fundamentales al momento d...Hace 1 mes
-
How To Predict Bearing Life With Excel - When you work in mechanical engineering, understanding the reliability and performance of bearings under various conditions is crucial. Bearings are the co...Hace 2 meses
-
How to calculate WEEKNUMBER in Month / Quarter / Year with Excel? - Let's say you have daily data and your boss wants to see the trends by week in month or week in quarter? How do you calculate the week number in a month ...Hace 2 meses
-
Excel: Cálculo de Finiquito, Beneficios Sociales Bolivia - Es importante tener nociones mínimas acerca el cálculo del finiquito y Beneficios Sociales de un trabajador en Bolivia, ya sea para la verificación de nues...Hace 2 meses
-
-
Minutos de juego y puntos. El Espanyol, sus finales de partido y mis enfados - Pienso que el Espanyol este 2024 se está dejando muchos puntos al final de los partidos. Cuando el ... Leer más » The post Minutos de juego y puntos. El ...Hace 7 meses
-
TikTok’s search evolution - 2 in 5 Americans use TikTok as a search engine. Nearly 1 in 10 Gen Zers are more likely to rely on TikTok than Google as a search engine. More than half of...Hace 7 meses
-
MASTERCLASS Gratis – Gráfica de Gestión Proyectos en #EXCEL. - Aprende a crear un Gráfico de CURVA S, ideal para GESTIÓN DE PROYECTOS, porque te permite identificar como esta tu proyecto tanto en COSTOS como en TIEMP...Hace 8 meses
-
Interés compuesto con Excel - Este es un mapa mental de las distintas funciones Excel para calcular el valor del dinero en el tiempo aplicando la ley de capitalización compuesta. En ...Hace 9 meses
-
Demos cursos de Excel 2007, 2010, 2013, 2016, 365 - Puedes consultar las demostraciones de los siguientes capítulos de los cursos Excel. Demo cursos ExcelHace 9 meses
-
Unblocking and Enabling Macros - When Windows detects that a file has come from a computer other than the one you're using, it marks the file as coming from the web, and blocks the file....Hace 1 año
-
-
Navigating Outlook Favorites - I have these four favorites defined in Outlook: From the inbox, I could hit Shift+F6 to get into the Favorites area but sometimes I would end up in no man’...Hace 1 año
-
Office Scripts: Trabajando con Tablas - [image: Office Scripts: Trabajando con Tablas] Me he dado cuenta que últimamente solo escribo de lenguaje M (es mi pequeño vicio)... pero hay que liberar l...Hace 1 año
-
Progress on the Block Protocol - Since the 1990s, the web has been a publishing place for human-readable documents. Documents published on the web are in HTML. HTML has a little bit of… Re...Hace 1 año
-
Hello world! - [image: Hello world!] Welcome to WordPress. This is your first post. Edit or delete it, then start writing!Hace 2 años
-
Decálogo para realizar Trabajos de Fin de Grado (TFGs) y de Fin de Máster (TFMs) - 1.- Tanto TFGs como TFMs son un requisito para graduarse a la vez que una oportunidad para aprender. Así, el tiempo que se le dedica es muy variable. De...Hace 3 años
-
London Excel Meetup Workbooks - The workbooks used in my presentation on “Analytical and Interactive Dashboards in Excel” at the London Excel Meetup, September 3, 2020Hace 4 años
-
Cálculo de jornada que termina al día siguiente (Power Query) y despedida - [image: Cálculo de jornada que termina al día siguiente (Power Query) y despedida] Este blog se ha ocupado de cálculos de tiempo con bastante intensidad, c...Hace 4 años
-
Visualize parts and whole - combine clustered column and stacked column charts - *Inga: Disa what?* *Igor: -ppeared.* by The FrankensTeam ------------------------------ Really it was 3 years ago we posted our last article? *Freddy: Th...Hace 5 años
-
-
-
-
-
-
-
-
-
1 Response to "Rendimiento de las macros VBA"
He actualizado a la versión 2.0 para añadir las macros que han aportado los maestros del foro Héctor Miguel y Macro Antonio en este hilo:
https://foro.todoexcel.com/threads/macros-100-veces-m%C3%A1s-r%C3%A1pidas-con-matrices.68209/
Con la última macro de Macro Antonio, valga la redundancia, el rendimiento mejora hasta 1.000 veces en el prototipo real de un mapa mundial que publicaré próximamente
Leave A Reply
Indícame las erratas que encuentres y qué es lo que te gustaría ver en los próximos artículos.