10 formas de acelerar sus macros

A medida que sus macros de Excel se vuelven cada vez más sólidas y complejas, es posible que pierdan rendimiento. Cuando se habla de macros, la palabra rendimiento suele ser sinónimo de velocidad . La velocidad es la rapidez con la que los procedimientos de VBA realizan las tareas previstas. A continuación, se muestran diez formas de ayudar a que sus macros de Excel se ejecuten a su nivel de rendimiento óptimo.

Detener cálculos de hojas

¿Sabía que cada vez que se cambia o manipula una celda que afecta cualquier fórmula de su hoja de cálculo, Excel vuelve a calcular la hoja de cálculo completa? En hojas de trabajo que tienen una gran cantidad de fórmulas, este comportamiento puede ralentizar drásticamente sus macros.

Puede usar la propiedad Application.Calculation para decirle a Excel que cambie al modo de cálculo manual. Cuando un libro de trabajo está en modo de cálculo manual, el libro de trabajo no se volverá a calcular hasta que active explícitamente un cálculo presionando la tecla F9.

Coloque Excel en el modo de cálculo manual, ejecute su código y luego vuelva al modo de cálculo automático.

Sub Macro1 ()
Application.Calculation = xlCalculationManual
 'Coloque su código de macro aquí
Application.Calculation = xlCalculationAutomatic
End Sub

Volver a configurar el modo de cálculo en xlCalculationAutomatic activará automáticamente un nuevo cálculo de la hoja de trabajo, por lo que no es necesario presionar la tecla F9 después de que se ejecute la macro.

Deshabilitar la actualización de la pantalla de la hoja

Puede notar que cuando se ejecutan sus macros, su pantalla parpadea bastante. Este parpadeo es Excel tratando de volver a dibujar la pantalla para mostrar el estado actual de la hoja de trabajo. Desafortunadamente, cada vez que Excel vuelve a dibujar la pantalla, ocupa recursos de memoria.

Puede usar la propiedad Application.ScreenUpdating para deshabilitar las actualizaciones de pantalla hasta que su macro se haya completado. La desactivación de la actualización de la pantalla ahorra tiempo y recursos, lo que permite que su macro se ejecute un poco más rápido. Una vez que su código de macro haya terminado de ejecutarse, puede volver a activar la actualización de la pantalla.

Sub Macro1 ()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Falso
 'Coloque su código de macro aquí
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

Después de volver a establecer la propiedad ScreenUpdating en True, Excel activará automáticamente un nuevo dibujo de la pantalla.

Desactivar las actualizaciones de la barra de estado

La barra de estado de Excel, que aparece en la parte inferior de la ventana de Excel, normalmente muestra el progreso de ciertas acciones en Excel. Si su macro está trabajando con muchos datos, la barra de estado ocupará algunos recursos.

Es importante tener en cuenta que desactivar la actualización de la pantalla es independiente de desactivar la visualización de la barra de estado. La barra de estado seguirá actualizándose incluso si desactiva la actualización de la pantalla. Puede usar la propiedad Application.DisplayStatusBar para deshabilitar temporalmente cualquier actualización de la barra de estado, mejorando aún más el rendimiento de su macro:

Sub Macro1 ()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Falso
Application.DisplayStatusBar = Falso
 'Coloque su código de macro aquí
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
End Sub

Decirle a Excel que ignore los eventos

Puede implementar macros como procedimientos de eventos, indicando a Excel que ejecute cierto código cuando cambie una hoja de trabajo o un libro.

A veces, las macros estándar realizan cambios que desencadenan un procedimiento de evento. Por ejemplo, si tiene una macro estándar que manipula varias celdas en Sheet1, cada vez que se cambia una celda en esa hoja, su macro debe pausarse mientras se ejecuta el evento Worksheet_Change.

Puede agregar otro nivel de mejora del rendimiento utilizando la propiedad EnableEvents para indicarle a Excel que ignore los eventos mientras se ejecuta la macro.

Establezca la propiedad EnableEvents en False antes de ejecutar su macro. Una vez que haya terminado de ejecutarse el código de macro, puede volver a establecer la propiedad EnableEvents en True.

Sub Macro1 ()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Falso
Application.DisplayStatusBar = Falso
Application.EnableEvents = False
 'Coloque su código de macro aquí
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
End Sub

Ocultar saltos de página

Cada vez que su macro modifica el número de filas, modifica el número de columnas o altera la configuración de página de una hoja de trabajo, Excel se ve obligado a tomarse un tiempo para recalcular los saltos de página que se muestran en la hoja.

Puede evitar este comportamiento simplemente ocultando los saltos de página antes de iniciar su macro.

Establezca la propiedad de hoja DisplayPageBreaks en False para ocultar los saltos de página. Si desea seguir mostrando los saltos de página después de que se ejecute la macro, vuelva a establecer la propiedad de hoja DisplayPageBreaks en True.

Sub Macro1 ()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Falso
Application.DisplayStatusBar = Falso
Application.EnableEvents = False
Activesheet.DisplayPageBreaks = Falso
 'Coloque su código de macro aquí
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
Activesheet.DisplayPageBreaks = Verdadero
End Sub

Suspender las actualizaciones de la tabla dinámica

Si su macro manipula tablas dinámicas que contienen grandes fuentes de datos, es posible que experimente un rendimiento deficiente al hacer cosas como agregar o mover campos dinámicos de forma dinámica.

You can improve the performance of your macro by suspending the recalculation of the pivot table until all pivot field changes have been made. Simply set the PivotTable.ManualUpdate property to True to defer recalculation, run your macro code, and then set the PivotTable.ManualUpdate property back to False to trigger the recalculation.

Sub Macro1()
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=True
 'Place your macro code here
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=False
End Sub

Steering clear of copy and paste

It’s important to remember that although Macro Recorder saves time by writing VBA code for you, it does not always write the most efficient code. A prime example is how Macro Recorder captures any copy-and-paste action you perform while recording.

You can give your macros a slight boost by cutting out the middleman and performing a direct copy from one cell to a destination cell. This alternate code uses the Destination argument to bypass the clipboard and copy the contents of cell A1 directly to cell B1.

Range("A1").Copy Destination:=Range("B1")

If you need to copy only values (not formatting or formulas), you can improve performance even more by avoiding the Copy method all together. Simply set the value of the destination cell to the same value found in the source cell. This method is about approximately 25 times faster than using the Copy method:

Range("B1").Value = Range("A1").Value

Si necesita copiar solo fórmulas de una celda a otra (no valores ni formato), puede establecer la fórmula de la celda de destino en la misma fórmula contenida en la celda de origen:

Rango ("B1"). Fórmula = Rango ("A1"). Fórmula

Usando la declaración With

Al grabar macros, a menudo manipulará el mismo objeto más de una vez. Puede ahorrar tiempo y mejorar el rendimiento utilizando la instrucción With para realizar varias acciones en un objeto determinado de una sola vez.

La instrucción With utilizada en el siguiente ejemplo le dice a Excel que aplique todos los cambios de formato a la vez:

    Con rango ("A1"). Fuente
    .Negrita = Verdadero
    .Italico = Verdadero
    .Underline = xlUnderlineStyleSingle
    Terminar con

Adquirir el hábito de dividir acciones en declaraciones With no solo hará que sus macros se ejecuten más rápido, sino que también facilitará la lectura de su código de macro.

Evitar el método de selección

A Macro Recorder le gusta usar el método Select para seleccionar explícitamente objetos antes de realizar acciones sobre ellos. Por lo general, no es necesario seleccionar objetos antes de trabajar con ellos. De hecho, puede mejorar drásticamente el rendimiento de las macros si no utiliza el método Seleccionar.

Después de grabar sus macros, conviértase en un hábito de alterar el código generado para eliminar los métodos de selección. En este caso, el código optimizado tendría el siguiente aspecto:

    Hojas ("Hoja1"). Rango ("A1"). FórmulaR1C1 = "1000"
    Hojas ("Hoja2"). Rango ("A1"). FórmulaR1C1 = "1000"
    Hojas ("Hoja3"). Rango ("A1"). FórmulaR1C1 = "1000"

Tenga en cuenta que se está seleccionando la nada. El código simplemente usa la jerarquía de objetos para aplicar las acciones necesarias.

Limitar viajes a la hoja de trabajo

Otra forma de acelerar sus macros es limitar la cantidad de veces que hace referencia a los datos de la hoja de trabajo en su código. Siempre es menos eficiente tomar datos de la hoja de trabajo que de la memoria. Es decir, sus macros se ejecutarán mucho más rápido si no tienen que interactuar repetidamente con la hoja de trabajo.

Por ejemplo, el siguiente código simple obliga a VBA a regresar continuamente a Hojas ("Hoja1"). Rango ("A1") para obtener el número necesario para la comparación que se realiza en la instrucción If:

Para ReportMonth = 1 a 12
     Si Rango ("A1"). Valor = ReportMonth Entonces
     MsgBox 1000000 / ReportMonth
Terminara si
Siguiente informeMes

Un método mucho más eficiente es guardar el valor en Hojas ("Hoja1"). Rango ("A1") en una variable llamada MiMes. De esta forma, el código hace referencia a la variable MyMonth en lugar de a la hoja de trabajo:

Atenuar MyMonth como entero
MyMonth = Rango ("A1"). Valor
Para ReportMonth = 1 a 12
Si MyMonth = ReportMonth entonces
MsgBox 1000000 / ReportMonth
Terminara si
Siguiente informeMes

Considere aprovechar las variables para trabajar con datos en la memoria en lugar de hacer referencia directamente a las hojas de trabajo.

Evite la referencia excesiva

Al llamar a un método o propiedad de un objeto, debe pasar por la interfaz IDispatch del componente OLE. Las llamadas a estos componentes OLE toman tiempo, por lo que reducir la cantidad de referencias a componentes OLE puede mejorar la velocidad del código de macro.

Para la invocación de propiedades o métodos de objetos, generalmente se utiliza el método de representación de  Object.Method  , es decir, el "." El símbolo se utiliza para invocar propiedades y métodos.

Por lo tanto, el número de llamadas a métodos o propiedades se puede juzgar según el número de símbolos ".". Cuanto menos "." símbolo, más rápido se ejecuta el código.

Por ejemplo, la siguiente declaración incluye 3 símbolos ".".

ThisWorkbook.Sheet1.Range("A1").Value = 100

La siguiente declaración tiene sólo un símbolo ".".

Activewindow.Top = 100

Aquí te dejamos algunos trucos para reducir el número de símbolos "." para correr más rápido.

Primero, cuando necesite hacer referencia al mismo objeto repetidamente, puede configurar el objeto en una variable para reducir la cantidad de llamadas. Por ejemplo, el siguiente código requiere dos llamadas por línea.

ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = 100
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = 200
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = 300

Debido a que es necesario hacer referencia repetidamente al  objeto Sheets ("Hoja1")  , se puede establecer primero en una variable  sht  , de modo que cada código solo deba llamarse una vez.

Set sht = ThisWorkbook.Sheets("Sheet1")
sht.Cells(1, 1) = 100
sht.Cells(2, 1) = 200
sht.Cells(3, 1) = 300

En segundo lugar, si no desea declarar una variable temporal sht, también puede utilizar la  instrucción With  mencionada anteriormente. Como se muestra en el siguiente ejemplo:

With ThisWorkbook.Sheets("Sheet1")
    .Cells(1, 1) = 100
    .Cells(2, 1) = 200
    .Cells(3, 1) = 300
End With

En tercer lugar,  cuando hay muchos bucles, intente mantener las propiedades y métodos fuera del bucle.  Al reutilizar un valor de propiedad del mismo objeto en un bucle, primero puede asignar el valor de propiedad a una variable específica fuera del bucle y luego usar la variable en el bucle, lo que puede lograr una velocidad más rápida. Como se muestra en el siguiente ejemplo:

For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = Cells(1, 2).Value
Next i

Cada bucle en este ejemplo obtiene la propiedad Valor de la celda Celdas (1,2). Si asigna la propiedad Valor de Celdas (1.2) a una variable antes de que comience el ciclo, obtendrá una ejecución más rápida. Como se muestra en el siguiente ejemplo:

tmp = Cells(1, 2).Value
For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = tmp
Next i

El código anterior llama  a ThisWorkbook.Sheets("Sheet1")  cada vez que se repite. Puede hacer esto más rápido usando la  instrucción With  para mover la llamada a  ThisWorkbook.Sheets("Hoja1")  fuera del bucle. Como se muestra en el siguiente ejemplo:

tmp = Cells(1, 2).Value
With ThisWorkbook.Sheets("Sheet1")
    For i = 1 To 1000
        .Cells(1, 1) = tmp
        .Cells(2, 1) = tmp
        .Cells(3, 1) = tmp
    Next i
End With

Evite el uso de tipos de variantes

Los principiantes generalmente prefieren usar variables de tipo Variante, que tienen la ventaja de ser menos complicadas porque se puede usar cualquier tipo de datos sin el problema de desbordamiento de la memoria si los datos son demasiado grandes para los tipos de datos Integer o Long. Sin embargo, los datos de tipo Varienmt requieren más espacio de memoria adicional que los otros tipos especificados (2 bytes para datos de tipo entero, 4 bytes para datos largos y 16 bytes para datos de variante), VBA requiere más tiempo para procesar datos de tipo variante que otros tipos especificados. de datos. Como muestra el siguiente ejemplo.

Sub VariantTest()
    Dim i As Long
    Dim ix As Integer, iy As Integer, iz As Integer
    Dim vx As Variant, vy As Variant, vz As Variant
    Dim tm As Date
    vx = 100: vy = 50
    tm = Timer
    For i = 1 To 1000000
        vz = vx * vy
        vz = vx + vy
        vz = vx - vy
        vz = vx / vy
    Next i
    Debug.Print "Variant types take " & Format((Timer - tm), "0.00000") & " seconds"
    ix = 100: iy = 50
    tm = Timer
    For i = 1 To 1000000
        iz = ix * iy
        iz = ix + iy
        iz = ix - iy
        iz = ix / iy
    Next i
    Debug.Print "Integer types take " & Format((Timer - tm), "0.00000") & " seconds"
End Sub

En el código anterior, las líneas 8 a 13 realizan 1 millón de operaciones de suma, resta, multiplicación y división de variables variantes, y las líneas 17 a 22 realizan 1 millón de operaciones de suma, resta, multiplicación y división de variables enteras. En mi computadora, la operación de la variable Variante tomó aproximadamente  0,09375  segundos, mientras que la operación de la variable Entero tomó aproximadamente  0,03125  segundos. Los resultados pueden variar de una computadora a otra, pero  las variables variantes son significativamente más lentas que las variables enteras .

Por este motivo,  se recomienda evitar el uso de variables variantes cuando pueda utilizar explícitamente el tipo de datos especificado .


Hoja inteligente 9.1.1

Hoja inteligente 9.1.1

Smartsheet es una plataforma de trabajo dinámica que le permite gestionar proyectos, crear flujos de trabajo y colaborar con su equipo.

Compartirpunto

Compartirpunto

SharePoint es un sistema de colaboración basado en web que utiliza una variedad de aplicaciones de flujo de trabajo, bases de datos de "listas" y otros componentes web, así como funciones de seguridad para dar control a los grupos empresariales que trabajan juntos.

Calendario perpetuo 1.0.38/1.0.36

Calendario perpetuo 1.0.38/1.0.36

Van Nien Calendar es una aplicación de visualización de calendario en su teléfono, que le ayuda a ver rápidamente la fecha lunisolar en su teléfono, organizando así su importante trabajo.

Outlook 2021

Outlook 2021

Microsoft Outlook es una aplicación empresarial y de productividad desarrollada por Microsoft Corporation.

Haga clic arriba

Haga clic arriba

ClickUp es una de las plataformas de productividad mejor calificadas para cualquier empresa. Grandes empresas como Google, Booking.com, San Diego Padres y Uber utilizan ClickUp para aumentar la productividad en el lugar de trabajo.

Visor de PDF-XChange 2.5.322.10

Visor de PDF-XChange 2.5.322.10

PDF se ha convertido en un formato de uso común para leer, crear y enviar documentos de texto. A su vez, se ha producido un aumento en el número de programas utilizados para este tipo de documentación. PDF-XChange Viewer se encuentra entre un número creciente de visores de PDF.

Apache OpenOffice

Apache OpenOffice

Apache OpenOffice ofrece un conjunto completo de aplicaciones de Office que rivalizan con Microsoft 365, especialmente en Excel, PowerPoint y Word. Le permite gestionar sus proyectos de forma más eficaz y admite varios formatos de archivo.

Descargar iTaxviewer 1.8.7

Descargar iTaxviewer 1.8.7

El software iTaxViewer es el software de lectura de archivos XML más popular en la actualidad. Este software es una aplicación de lectura de declaraciones electrónicas de impuestos en formato XML de la Dirección General de Tributación.

Lector de PDF Nitro

Lector de PDF Nitro

Nitro PDF Reader es un práctico editor de PDF que cubre todas las tareas básicas que la mayoría de las personas realizan todos los días con documentos PDF.

Lector Foxit 12

Lector Foxit 12

Foxit Reader es principalmente un lector de PDF y también le permite crear archivos PDF, firmarlos, editarlos y agregar anotaciones. Funciona en sistemas operativos, existen complementos para varios programas del paquete Microsoft Office.