Acelerar tus macros de Excel


En  este  post se  va  a  intentar dar  muy resumidamente  pistas  para quienes manejen el tema de programación de macros en VB dentro de  excel para optimizar  el rendimiento de estas . ¿Tus macros van lentas? ¿Problemas a la hora de ejecutarlas? ¿Cuáles son las técnicas recomendadas?

AL COMIENZO DE LAS MACROS

Podemos hacer una llamada a la funcion  iniciomacro, la cual hara las siguintes cosas:

  1.  Apagar el parpadeo de pantalla evitando  los movimientos de pantalla que se producen al seleccionar celdas, hojas y libros   .Lo hacemos con la instrucción Application.screenupdating=False
  2.  Apagar los cálculos automáticos evitando que se recalcule todo cada vez que se pegan o modifican datos
    Lo hacemos con la instrucción: Application.calculation=xlCalculationManual
  3. Apagar los eventos automáticos evitando que se disparen macros de evento si las hubiere
    Lo hacemos con la instrucción: Application.EnableEvents=False
  4.  Apagar visualización de saltos de página sirve para evitar algunos problemas de compatibilidad entre macros Excel 2003 vs. 2007/2010.Lo hacemos con la instrucción: ActiveSheet.DisplayPageBreaks = False

En resumen, siempre debemos comenzar una  macros así: iniciamacro e incluiremos en el código la siguinte función:

Sub iniciamacro()

Application.screenupdating=False
Application.calculation=xlCalculationManual
Application.EnableEvents=False
ActiveSheet.DisplayPageBreaks = False

End Sub

EN LA FINALIZACION DE LA EJECUCION DE CADA MACRO

Para optimizar el rendimiento en la finlizacion de culquier macro deemos  borrar contenido de portapapeles pues permite limpiar el portapapeles en caso de haber copiado datos . Además debemos volver a su estado original las instrucciones con las que comenzamos la macro qeu hacemos con la instrucción: Application.CutCopyMode = False

En resumen, siempre debemos finalizar la macros con  una llamada a la funcion borracache   cuyo código es el siguinte:

Sub borracache()
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
Application.CutCopyMode = False
End Sub

OTRAS TECNICAS UTILES

Usar la instrucción WITH.Se usa para evitar tener que referenciar un mismo objeto muchas veces mejorando asi el rendimiento

Ejecución lenta:

Sheets(1).Range(“A1:Z1″).Font.Italic = True
Sheets(1).Range(“A1:Z1″).Font.Interior.Color = vbRed
Sheets(1).Range(“A1:Z1″).MergeCells = True

Ejecución rápida:

With Sheets(1).Range(“A1:Z1″)
.Font.Italic = True
.Font.Interior.Color = vbRed
.MergeCells = True
End With

Evitar la instrucción SELECT que se genera sobre todo en las macros grabadas.La mayoría de las veces no es necesario seleccionar para cumplir el objetivo

Ejecución lenta:

Range(“E1″).Select
Selection.Copy
Range(“D10″).Select
ActiveSheet.Paste

Ejecución rápida:

Range(“E1″).Copy Range(“D10”)

Evitar blucles  loops FOR EACH,dado que  tener que ir celda por celda consume mucho tiempo  y se puede resolver el problema de forma más directa mediante otars técnicas: agrupar, ir a especial, filtros, filtros avanzados (la idea es poder realizar la acción sobre todos los elementos al mismo tiempo, en lugar de tener que ir uno a uno)

Ejecución lenta:

For Each cell In Range(“A1:A10000″)
If cell = Empty Then cell = 0
Next cell

Usar las funciones nativas de Excel pues  quizás ya exista una función Excel que lo haga dado que las macros siempre ejecutan más rápido las funciones nativas de Excel

Ejecución lenta…

mProducto = 1
For i = 1 to 100
mProducto = mProducto * Cells(3,i)
Next

Ejecución rápida!
mProducto = Application.WorkSheetFunction.Product(Range(“C1:C100″))

Optimizar el uso de Variables.Tenemos varios métodos  para hacer uan mejor gestión de las variables:

  • Forzar la declaración de variables:En el editor VBA, menú Herramientas > Opciones > pestaña Editor > marcar “Requerir declaración de variables”
  • Usar la variable correcta: si es fecha usar Date, si es texto usar String, si es valor usar Long…
  • Evitar el uso de la variable Variant ya que insume más recursos
  • Usar nombres de variables que nos digan algo (por ej. “UltimaFila” o “FilaZ” en lugar de “f” o “uf”)

Escribir las macros en módulos y no en hojas,dado que las hojas pueden ser borradas o copiadas y esto generaría problemas inesperados

Separar el proceso en varias macros (divide y vencerás) ,pues si tu macro hace muchas cosas conviene separarla en muchas macros pequeñas y luego unirlas  (es más fácil para controlar, auditar, etc…).Además te permite luego poder rehusar alguna parte del proceso en otras macros

Macro muy larga y lenta:

Sub MegaMacro()
‘Codigo limpia datos
’Codigo carga datos
Código arregla datos
’Código arma reporte
End Sub()

Mejor dividir en diferentes macros para cada proceso:

Sub LimpiaDatos()
‘Codigo…
End Sub Sub

CargaDatos()
‘Codigo…
End Sub

Sub ArreglaDatos()
‘Codigo…
End Sub

Sub ArmaReporte()
‘Codigo…
End Sub

Finalmente podemos unir todos los procesos:

Sub ProcesoCompleto()
Call LimpiaDatos
Call CargaDatos
Call ArreglaDatos
Call ArmaReporte
End Sub()

Ser cuidadoso con la instrucción ON ERROR RESUME NEXT ya que esta instrucción hace que la macro siga avanzando aunque encuentre un error y en algunos casos esto hará que se ignoren errores que no deberían ser ignorados pues podrías tener errores (bugs) y tal vez  no sea lo adecuado

Fuente aqui

Un detector wifi que alerta sobre la calidad del aire


La idea financiada mediante la plataforma de crowdfunding   Indiegogo (www.indiegogo.com/projects/birdi)    que  tiene previsto costar 99$/unidad  cuanto se comercialice( o 190$ por  dos) , pretende  implementar un  sensor que  monitorizará  las partículas del ambiente, el polen, el exceso de humedad y las emisiones presentes en su entorno de modo que cuando detecte algún tipo de contaminación o de un aumento del monóxido de carbono  pudiendo ser  un inminente riesgo de incendio o peligro para nuestra salud, nos enviará automáticamente una alerta a nuestro terminal móvil al igual que lo hará cuando   los valores vuelvan a ser normales (avisándonos  de nuevo para confirmar que se trataba de una falsa alarma) ademas respetando nuestras horas de sueño (solo nos molestará en caso de que la emergencia sea real) todo ello gracias a que integra un interfaz  WiFi y por supuesto se apoya en   la pertinente aplicación para móviles (Android e iOS),

Birdi por tanto pretende ser  un monitor de aire inteligente que monitorea la calidad del aire, los peligros de la salud de todos los días, la contaminación y las situaciones de emergencia como incendios y monóxido de carbono para que pueda mantenerse conectado y protegido en su casa,todo ello  en un dispositivo que tiene el mismo aspecto que un sensor de humos convencional de pared o de techo.

Sus promotores  reivindican  volver  colocar la alarma de humo típico esta vez  con un Birdi  (que estéticamente no desentona) para también  conectarnos  con la información importante de  la calidad del aire que estás respirando , alertas sobre un fuego o la exposición a gases peligrosos como el monóxido de carbono, etc   pudiéndose   ademas  silenciar directamente desde su teléfono(no más agitando frenéticamente o utilizando un palo de escoba).

Por tanto estos son los tres pilares que monitoriza Birdi :

  • Calidad del aire:para interior y exterior  Birdi debería ayudarle  a controlar la salud de su casa, ya se trate de factores tales como la temperatura, la humedad o la forma en que el aire es rancio o peligros externos como la contaminación, el polen y partículas, birdi está ahí para ayudarle a respirar un poco más fácil.
  • Fuego: para  nunca tener otra falsa alarma pues se puede  silenciar la alarma de humo directamente desde el teléfono(en lugar de tratar de subir a una silla para tocar el techo, o agitando un paño de cocina frenéticamente, desconectarlo nucna ha sido tan facil ).Ademas  en un incendio real, se asegura de que usted obtenga la ayuda que necesita.
  • Los humos : tendencias de la exposición el monóxido de carbono es un asesino silencioso, y puede ser perjudicial incluso por debajo de los niveles de alarma. No sólo le avisa a sus , seres queridos y los servicios de emergencia en caso de emergencia, también muestra las tendencias para minimizar los peligros a los que corren mayor riesgo: los niños y los ancianos.

Y a continuación estas son algunas de sus principales  características :

  • MEDIANTE UN  TELÉFONO INTELIGENTE SE MANEJA EL DISPOSITIVO(Alertas “gratificantes “).¿Alguna vez se ha levantado en el medio de la noche debido a que su detector de humo estaba sonando por  batería baja? Birdi es más inteligente que eso pues no enviara  alertas adecuadas cuando NO  las necesiea. Es el aire lleno de polen o la contaminación? ¿Hay un incendio en su casa? ¿Alguien está fumando? Todo el que tiene que saber lo averiguará derecha cuando más importa. Y si la batería está baja, enviaran un mensaje  con unos meses de antelación, nunca a las 2 de lamadrugada.
  • OPEN DATA (La nueva vigilancia de la vecindad).Si en la casa de tu vecino está en problemas, es probable que necesite saber.De Birdi que todo el mundo en el bloque sabe si hay una emergencia.Tener un invitado Airbnb? Es probablemente el mejor que se los mantiene en el bucle. No hay que olvidarse de la abuela tampoco. Se llamará a ella en su teléfono fijo, y enviara una notificación de que algo anda mal.Y si hay un desastre natural en su camino como un tornado, una inundación o un terremoto, el Birdi  notificara a su propietario  No se trata sólo de fuego más.
  • FUNCIONA INCLUSO EN LOS TELÉFONOS DE LÍNEA FIJA(” Abuela friendly”).El mundo es un lugar diverso. Tenemos que asegurarnos de que el sistema funciona en cualquier dispositivo y en una gran cantidad de idiomas. En caso de que se active la alarma, Birdi le llamará con detalles acerca de la alerta y que remendar a través de las autoridades en caso de que sea una emergencia. Nuestro hardware se integra directamente con Twilio para la comunicación inmediata y fiabilidad, directamente desde su casa hasta el teléfono.
  • USO DE DATOS PARA HACERNOS MÁS SALUDABLES.  Calidad del aire interior es 2-8veces  peor que al aire libre. ¿Cuál es la contaminación  en su casa en este momento? La mayoría de nosotros no tenemos idea. Sin embargo, estamos viendo las tasas de asma siguen aumentando y el mal de aire está ahora decidida a ser una causa de cáncer. Birdi es el único dispositivo que ambas pistas de emergencias ypodria  dar consejos sobre cómo mejorar el aire para su familia y amigos,de hecho estan abriendo esos datos para desarrolladores y científicos con una API para que las personas más brillantes de todo el mundo pueden ayudar a todos nosotros tomemos medidas y mejorar el aire a nuestro alrededor.

Eso sí, por el momento es solo un prototipo muy avanzado y sus responsables siguen  buscando financiación mediante crowdfunding en la web Indiegogo para que este dispositivo llegue a ser real.

Fuente   http://canarydetector.com/