



Si tienes libros pesados que tardan en abrirse o en actualizarse, te indicamos donde está el problema, como optimizar tus fórmulas, hojas y libros Excel.

Mediante las macros cronometramos el tiempo que tarda en ejecutarse los cálculos del libro, da cada hoja y de un rango, varias filas o columnas.
Debido a que Microsoft Windows es un sistema operativo multitarea, la segunda vez que se calcula el tiempo, puede ser más rápido que la primera vez. Para conseguir mayor precisión tomaremos varias mediciones y aplicaremos la media de los resultados.
- CREAR MACRO
Abrir el libro Excel deseado.
Pulsar la tecla Alt y mantener pulsada
Pulsar la tecla F11. Mostrará el editor de Visual Basic.
Ir a: Barra de Menú
Insertar
Módulo. Mostrará la ventana del módulo donde escribimos la macro.
Escribir el código de la macro:
Private Declare Function getFrequency Lib "kernel32" _
Alias "QueryPerformanceFrequency" (cyFrequency As Currency) As Long
Private Declare Function getTickCount Lib "kernel32" _
Alias "QueryPerformanceCounter" (cyTickCount As Currency) As LongFunction MicroTimer() As Double
Dim cyTicks1 As Currency
Static cyFrequency As CurrencyMicroTimer = 0
If cyFrequency = 0 Then getFrequency cyFrequency
getTickCount cyTicks1
If cyFrequency Then MicroTimer = cyTicks1cyFrequency
End Function
Sub Tiempo_Rango()
DoCalcTimer 1
End SubSub Tiempo_Hoja()
DoCalcTimer 2
End SubSub Tiempo_Libro_Recalcular()
DoCalcTimer 3
End SubSub Tiempo_Libro()
DoCalcTimer 4
End SubSub DoCalcTimer(jMethod As Long)
Dim dTime As Double
Dim dOvhd As Double
Dim oRng As Range
Dim oCell As Range
Dim oArrRange As Range
Dim sCalcType As String
Dim lCalcSave As Long
Dim bIterSave As BooleanOn Error GoTo Errhandl
dTime = MicroTimer
lCalcSave = Application.Calculation
bIterSave = Application.IterationIf Application.Calculation <> xlCalculationManual Then
Application.Calculation = xlCalculationManual
End IfSelect Case jMethod
Case 1If Application.Iteration <> False Then
Application.Iteration = False
End IfIf Selection.Count > 1000 Then
Set oRng = Intersect(Selection, Selection.Parent.UsedRange)
Else
Set oRng = Selection
End IfFor Each oCell In oRng
If oCell.HasArray Then
If oArrRange Is Nothing Then
Set oArrRange = oCell.CurrentArray
End IfIf Intersect(oCell, oArrRange) Is Nothing Then
Set oArrRange = oCell.CurrentArray
Set oRng = Union(oRng, oArrRange)
End IfEnd If
Next oCell
sCalcType = "Tiempo en calcular " & CStr(oRng.Count) & _
" Celdas del rango seleccionado: "Case 2
sCalcType = "Tiempo en abrir la hoja activa " & ActiveSheet.Name & ": "Case 3
sCalcType = "Recálculo tiempo en abrir el libro: "Case 4
sCalcType = "Tiempo en abrir el libro: "End Select
dTime = MicroTimer
Select Case jMethodCase 1
If Val(Application.Version) >= 12 Then
oRng.CalculateRowMajorOrder
Else
oRng.Calculate
End IfCase 2
ActiveSheet.CalculateCase 3
Application.CalculateCase 4
Application.CalculateFullEnd Select
dTime = MicroTimer - dTime
On Error GoTo 0
dTime = Round(dTime, 5)
MsgBox sCalcType & " " & CStr(dTime) & " Segundos.", _
vbOKOnly + vbInformation, "Test optimización Excel"Finish:
If Application.Calculation <> lCalcSave Then
Application.Calculation = lCalcSave
End IfIf Application.Iteration <> bIterSave Then
Application.Calculation = bIterSave
End IfExit Sub
Errhandl:
On Error GoTo 0
MsgBox "Error en el cálculo de tiempo " & sCalcType, _
vbOKOnly + vbCritical, "Test optimización Excel"
GoTo FinishEnd Sub
Guardar el libro con la extensión *.xlsm. Libro habilitado para macros.
- ANTES DE EJECUTAR LA MACRO
Ir a: Cinta de opciones
Pestaña: Archivo.
Ir a: Categoría Opciones. Mostrará la ventana de opciones de Excel.
Ir a: Categoría Fórmulas
Opciones de cálculo
Activar la casilla: Manual.
Pulsar el botón Aceptar. Cierra la ventana y elimina el cálculo automático.
- EJECUTAR MACRO: TIEMPO_LIBRO
Identifica el tiempo necesario para calcular todas las fórmulas del libro. Será el tiempo más elevado de todas las macros.
Ejecutar la macro "Tiempo_Libro".
Verificar como muestra mensaje con el tiempo empleado en analizar todo el libro, en segundos.

- EJECUTAR MACRO: TIEMPO_LIBRO_RECALCULAR
Volver a calcular inmediatamente después de un cálculo, mostrará un mejor tiempo.
Ejecutar la macro "Tiempo_Libro_Recalcular".
Verificar como muestra mensaje con el tiempo empleado en analizar todo el libro, por segunda vez, en segundos.

- EJECUTAR MACRO: TIEMPO_HOJA
Identifica el tiempo de carga para calcular la hoja activa del libro.
Debido a que sólo se vuelven a calcular el libro, este modo, la hora de volver a calcular para cada hoja de cálculo. Debe habilitar para determinar cuáles son las hojas de cálculo del problema.
Abrir la hoja deseada. Para verificar su tiempo de carga.
Ejecutar la macro "Tiempo_Hoja".
Verificar como muestra mensaje con el tiempo empleado en analizar la hoja activa, en segundos.
Repetir el proceso para el resto de la hoja. Para determinar cuáles son las hojas que producen los problemas.

- EJECUTAR MACRO: TIEMPO_RANGO
Identifica el tiempo de carga para calcular el rango seleccionado de la hoja activa.
Ir a: la hoja que presenta anomalías.
Seleccionar un rango, varias filas o varias columnas. Identificando el área que presenta anomalías, para posteriormente revisar las fórmulas que producen el problema.
Ejecutar la macro "Tiempo_Rango".
Verificar como muestra mensaje con el tiempo empleado en analizar todo el libro, en segundos.
Repetir el proceso para el resto de rangos. Hasta analizar toda la hoja.


Buenas tardes:
Sería posible que me facilitásen la macro para poder copiar y pegar?
Gracias y enhorabuena por su web
Hola Antonio,
Remitida la macro.
Saludos.
Excelente ,antes este tema no lo tenìa claro, pero gracias a ustedes, me fue clara la explicacion, mil gracias
A lo mejor la solución es muy simple, mi problema es que tengo excel de 64 bits y me pide que declare para 64 bits. Que debo cambiar en el código para que funcione?
En efecto, la solución es muy simple, el mismo excel te lo explica. Hay que establecer el atributo PtrSafe en las declaraciones de las funciones, específicamente dónde se llaman a librerías 32 bits.
Donde dice esto:
Private Declare Function getFrequency Lib "kernel32" _
Alias "QueryPerformanceFrequency" (cyFrequency As Currency) As Long
Private Declare Function getTickCount Lib "kernel32" _
Alias "QueryPerformanceCounter" (cyTickCount As Currency) As Long
Queda así:
Private Declare PtrSafe Function getFrequency Lib "kernel32" _
Alias "QueryPerformanceFrequency" (cyFrequency As Currency) As Long
Private Declare PtrSafe Function getTickCount Lib "kernel32" _
Alias "QueryPerformanceCounter" (cyTickCount As Currency) As Long
El resto del código permanece intacto, y ya con eso no tuve problemas. Lo comparto por si a alguien le sirve también.
Gracias estimado, necesitaba ese cambio en la macro, saludos
Muchisimas gracias tenia ese problema
Suena interesante, tiene algún costo acceder a ellas?
Hola Leonel,
Si lees el artículo se indica como realizarlo.
Saludos.
Hola ingrese la macro pero aun no entiendo la utiliza, tengo una hoja de calculo con múltiples formulas anidadas, de búsqueda a otras Hojas etc, cuyo tiempo de carga inicial es de 16 segundos, cuando cambio los filtros el tiempo de primer recalculo se mantiene en 16 Segundos.
La Macro no reduce el tiempo de calculo cierto.
Hola Miguel Angel,
En efecto, la macro calcula el tiempo y en la hoja que tarde en calcular deberemos de replantear las fórmulas, formatos, etc.
Saludos.