{"id":15055,"date":"2021-03-23T21:08:20","date_gmt":"2021-03-24T02:08:20","guid":{"rendered":"https:\/\/www.perucontable.com\/excelcontable\/?p=15055"},"modified":"2023-11-17T20:09:05","modified_gmt":"2023-11-18T01:09:05","slug":"14-formas-de-acelerar-y-optimizar-tus-macros-excel","status":"publish","type":"post","link":"https:\/\/www.perucontable.com\/excelcontable\/14-formas-de-acelerar-y-optimizar-tus-macros-excel\/","title":{"rendered":"14 FORMAS DE ACELERAR Y OPTIMIZAR TUS MACROS EXCEL"},"content":{"rendered":"\n<p>Esta informaci\u00f3n es muy \u00fatil para quienes manejen el tema de&nbsp;<strong>programaci\u00f3n de macros excel.&nbsp;<\/strong>\u00bfTus macros van lentas? \u00bfProblemas a la hora de ejecutarlas? \u00bfCu\u00e1les son las t\u00e9cnicas recomendadas?<\/p>\n\n\n\n<p>Respecto de usar menos c\u00f3digo depender\u00e1 de las habilidades del&nbsp;<strong>programador excel<\/strong>&nbsp;en cuesti\u00f3n. Hemos visto infinidad de casos donde 30 o 40 l\u00edneas de c\u00f3digo VBA se pueden resumir en 5 o 6 l\u00edneas (algo similar pasa con las f\u00f3rmulas excel). Siempre hay macros o f\u00f3rmulas que hacen la tarea de forma m\u00e1s directa y sin dar tantas vueltas!<\/p>\n\n\n\n<p>Otra recomendaci\u00f3n clave es&nbsp;<strong>invertir mucho tiempo inicial en planificar y analizar la l\u00f3gica del trabajo.&nbsp;<\/strong>Esto nos va a ahorrar muchos problemas y dolores de cabeza posteriores!<\/p>\n\n\n\n<p>Hay algunas instrucciones puntuales que siempre conviene usar y que&nbsp;<strong>van a acelerar y optimizar nuestras macros en todos los casos<\/strong>. Vamos a ver repasar algunas t\u00e9cnicas puntuales que podemos usar al comienzo, durante y al final de nuestras macros.<\/p>\n\n\n\n<p><strong>AL COMIENZO DE LAS MACROS<br>1. Apagar el parpadeo de pantalla<\/strong><br>Lo hacemos con la instrucci\u00f3n:&nbsp;<em>Application.screenupdating=False<br>E<\/em>vita los movimientos de pantalla que se producen al seleccionar celdas, hojas y libros<\/p>\n\n\n\n<p><strong><br>2. Apagar los c\u00e1lculos autom\u00e1ticos<\/strong><br>Lo hacemos con la instrucci\u00f3n:&nbsp;<em>Application.calculation=xlCalculationManual<br><\/em>Evita que se recalcule todo cada vez que se pegan o modifican datos<\/p>\n\n\n\n<p><strong><br>3. Apagar los eventos autom\u00e1ticos<\/strong><br>Lo hacemos con la instrucci\u00f3n:&nbsp;<em>Application.EnableEvents=False<br><\/em>Evita que se disparen macros de evento si las hubiere<\/p>\n\n\n\n<p><strong><br>4. Apagar visualizaci\u00f3n de saltos de p\u00e1gina<br><\/strong>Lo hacemos con la instrucci\u00f3n:&nbsp;<em>ActiveSheet.DisplayPageBreaks = False<br><\/em>Sirve para evitar algunos problemas de compatibilidad entre macros Excel 2003 vs. 2007\/2010<\/p>\n\n\n\n<p>En resumen, siempre debemos comenzar las macros as\u00ed:<\/p>\n\n\n\n<p><em>Application.screenupdating=False<br>Application.calculation=xlCalculationManual<br>Application.EnableEvents=False<br>ActiveSheet.DisplayPageBreaks = False<\/em><\/p>\n\n\n\n<p><strong>AL FINAL DE LAS MACROS<\/strong><\/p>\n\n\n\n<p><strong><br>5. Borrar contenido de portapapeles<br><\/strong>Lo hacemos con la instrucci\u00f3n:&nbsp;<em>Application.CutCopyMode = False<br><\/em>Permite limpiar el portapapeles en caso de haber copiado datos<br>Adem\u00e1s debemos volver a su estado original las instrucciones con las que comenzamos la macro.<\/p>\n\n\n\n<p>En resumen, siempre debemos finalizar las macros as\u00ed:<\/p>\n\n\n\n<p><em>Application.screenupdating=True<br>Application.calculation=xlCalculationAutomatic<br>Application.EnableEvents=True<br>ActiveSheet.DisplayPageBreaks = True<br>Application.CutCopyMode = False<\/em><\/p>\n\n\n\n<p><strong>OTRAS TECNICAS UTILES<br>6. Usar la instrucci\u00f3n WITH<br><\/strong>Se usa para evitar tener que referenciar un mismo objeto muchas veces<\/p>\n\n\n\n<p><em>Ejecuci\u00f3n leeenta\u2026<br><\/em><em>Sheets(1).Range(\u00abA1:Z1\u00bb).Font.Italic = True<br>Sheets(1).Range(\u00abA1:Z1\u00bb).Font.Interior.Color = vbRed<br>Sheets(1).Range(\u00abA1:Z1\u00bb).MergeCells = True<\/em><\/p>\n\n\n\n<p><em>Ejecuci\u00f3n r\u00e1pida!<br><\/em><em>With&nbsp;Sheets(1).Range(\u00abA1:Z1\u00bb)<br>.Font.Italic = True<br>.Font.Interior.Color = vbRed<br>.MergeCells = True<br>End With<\/em><\/p>\n\n\n\n<p><em><br><\/em><strong>7. Evitar la instrucci\u00f3n SELECT<\/strong><\/p>\n\n\n\n<p>Se genera sobre todo en las macros grabadas<br>La mayor\u00eda de las veces no es necesario seleccionar para cumplir el objetivo<\/p>\n\n\n\n<p><em>Ejecuci\u00f3n leeenta\u2026<\/em><em><br>Range(\u00abE1\u00bb).Select<br>Selection.Copy<br>Range(\u00abD10\u00bb).Select<br>ActiveSheet.Paste<\/em><\/p>\n\n\n\n<p><em>Ejecuci\u00f3n r\u00e1pida!<br><\/em><em>Range(\u00abE1\u00bb).Copy Range(\u00abD10\u201d)<\/em><\/p>\n\n\n\n<p><strong>8. Evitar loops FOR EACH<br><\/strong><br>Tener que ir celda por celda consume mucho tiempo<br>Se puede resolver el problema de forma m\u00e1s directa!<\/p>\n\n\n\n<p><em>Ejecuci\u00f3n leeenta\u2026<br><\/em>For Each&nbsp;cell In Range(\u00abA1:A10000\u00bb)<br>If cell = Empty Then cell = 0<br>Next cell<\/p>\n\n\n\n<p>* Los loops siempre son leeentos<br>* En este caso recorre 10.000 celdas!<\/p>\n\n\n\n<p><em>Ejecuci\u00f3n r\u00e1pida!<br><\/em>Existen diversas formas de evitar los loops. La soluci\u00f3n depender\u00e1 del caso concreto en cuesti\u00f3n. Generalmente se usan algunas de estas t\u00e9cnicas: agrupar, ir a especial, filtros, filtros avanzados. La idea es poder realizar la acci\u00f3n sobre todos los elementos al mismo tiempo, en lugar de tener que ir uno a uno!<\/p>\n\n\n\n<p><strong>9. Usar las funciones nativas de Excel<\/strong><\/p>\n\n\n\n<p>No quieras reinventar la rueda. Quiz\u00e1s ya exista una funci\u00f3n Excel que lo haga!<\/p>\n\n\n\n<p>Las macros siempre ejecutan m\u00e1s r\u00e1pido las funciones nativas de Excel<\/p>\n\n\n\n<p><em>Ejecuci\u00f3n leeenta\u2026<br><\/em><em>mProducto = 1<br>For&nbsp;i = 1&nbsp;to&nbsp;100<br>mProducto = mProducto * Cells(3,i)<br>Next<\/em><br><em>Ejecuci\u00f3n r\u00e1pida!<br><\/em><em>mProducto = Application.WorkSheetFunction.Product(Range(\u00abC1:C100\u00bb))<\/em><\/p>\n\n\n\n<p><strong>10. Forzar la declaraci\u00f3n de variables<\/strong><\/p>\n\n\n\n<p>En el editor VBA, men\u00fa Herramientas &gt; Opciones &gt; pesta\u00f1a Editor &gt; marcar \u201cRequerir declaraci\u00f3n de variables\u201d<br>Luego usar la variable correcta: si es fecha usar Date, si es texto usar String, si es valor usar Long\u2026<br>Evitar el uso de la variable Variant ya que insume m\u00e1s recursos\u2026<br>Usar nombres de variables que nos digan algo (por ej. \u201cUltimaFila\u201d o \u201cFilaZ\u201d en lugar de \u201cf\u201d o \u201cuf\u201d)<\/p>\n\n\n\n<p><strong>11. Escribir las macros en m\u00f3dulos y no en hojas<br><\/strong><br>Las hojas pueden ser borradas o copiadas y esto generar\u00eda problemas inesperados<\/p>\n\n\n\n<p><strong>12. Separar el proceso en varias macros (divide y conquistar\u00e1s)<\/strong><\/p>\n\n\n\n<p>Si tu macro hace muchas cosas conviene separarla en muchas macros peque\u00f1as y luego unirlas<br>Es m\u00e1s f\u00e1cil para controlar, auditar, etc\u2026<br>Adem\u00e1s te permite luego poder rehusar alguna parte del proceso en otras macros<\/p>\n\n\n\n<p><em>Macro muy laaarga\u2026<br><\/em><em>Sub MegaMacro()<br><\/em><em>\u2018Codigo limpia datos<br>\u2019Codigo carga datos<br>\u2019C\u00f3digo arregla datos<br>\u2019C\u00f3digo arma reporte<br>End Sub()<\/em><\/p>\n\n\n\n<p><br>Mejor dividir en diferentes macros para cada proceso<br><em>Sub LimpiaDatos()<br><\/em><em>\u2018Codigo\u2026<\/em><em><br>End Sub&nbsp;<\/em>Sub<\/p>\n\n\n\n<p>CargaDatos()<br><em>\u2018Codigo\u2026<br><\/em>End Sub<\/p>\n\n\n\n<p>Sub ArreglaDatos()<br><em>\u2018Codigo\u2026<br><\/em>End Sub<\/p>\n\n\n\n<p>Sub ArmaReporte()<br><em>\u2018Codigo\u2026<br><\/em>End Sub<\/p>\n\n\n\n<p><em><br>Finalmente podemos unir todos los procesos<br>Sub ProcesoCompleto()<br>Call LimpiaDatos<br>Call CargaDatos<br>Call ArreglaDatos<br>Call ArmaReporte<br>End Sub()<\/em><\/p>\n\n\n\n<p><em><strong>13. Ser cuidadoso con la instrucci\u00f3n ON ERROR RESUME NEXT<br><\/strong><br>Esta instrucci\u00f3n hace que la macro siga avanzando aunque encuentre un error<br>En algunos casos esto har\u00e1 que se ignoren errores que no deber\u00edan ser ignorados<br>Podr\u00edas tener errores (bugs) y no enterarte!<\/em><\/p>\n\n\n\n<p><strong>14. Comentar bien las macros<br><\/strong><br>\u00bfQu\u00e9 pasar\u00eda si tuvieras que volver a revisar\/arreglar\/ampliar tu c\u00f3digo 8 meses despu\u00e9s?<br>A\u00f1adir comentarios te ayudar\u00e1 a describir y recordar la l\u00f3gica y te ahorrar\u00e1 mucho tiempo!<\/p>\n\n\n\n<p>Fuente: <a href=\"https:\/\/www.todoexcel.com\/\">https:\/\/www.todoexcel.com\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta informaci\u00f3n es muy \u00fatil para quienes manejen el tema de&nbsp;programaci\u00f3n de macros excel.&nbsp;\u00bfTus macros van lentas? \u00bfProblemas a la hora de ejecutarlas? \u00bfCu\u00e1les son las t\u00e9cnicas recomendadas? Respecto de usar menos c\u00f3digo depender\u00e1 de las habilidades del&nbsp;programador excel&nbsp;en cuesti\u00f3n. Hemos visto infinidad de casos donde 30 o 40 l\u00edneas de c\u00f3digo VBA se pueden [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":15056,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"yst_prominent_words":[316],"_links":{"self":[{"href":"https:\/\/www.perucontable.com\/excelcontable\/wp-json\/wp\/v2\/posts\/15055"}],"collection":[{"href":"https:\/\/www.perucontable.com\/excelcontable\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.perucontable.com\/excelcontable\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.perucontable.com\/excelcontable\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.perucontable.com\/excelcontable\/wp-json\/wp\/v2\/comments?post=15055"}],"version-history":[{"count":2,"href":"https:\/\/www.perucontable.com\/excelcontable\/wp-json\/wp\/v2\/posts\/15055\/revisions"}],"predecessor-version":[{"id":16925,"href":"https:\/\/www.perucontable.com\/excelcontable\/wp-json\/wp\/v2\/posts\/15055\/revisions\/16925"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.perucontable.com\/excelcontable\/wp-json\/wp\/v2\/media\/15056"}],"wp:attachment":[{"href":"https:\/\/www.perucontable.com\/excelcontable\/wp-json\/wp\/v2\/media?parent=15055"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.perucontable.com\/excelcontable\/wp-json\/wp\/v2\/categories?post=15055"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.perucontable.com\/excelcontable\/wp-json\/wp\/v2\/tags?post=15055"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/www.perucontable.com\/excelcontable\/wp-json\/wp\/v2\/yst_prominent_words?post=15055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}