Obtención de Excel para actualizar los datos en una hoja desde VBA
Pregunta
¿Cómo se obtienen los datos de la hoja de cálculo en Excel para recalcularse desde dentro de VBA, sin el simple cambio de un valor de celda?
Solución
Las siguientes líneas harán el truco:
ActiveSheet.EnableCalculation = False
ActiveSheet.EnableCalculation = True
Editar: El método .Calculate ()
no funcionará para todas las funciones. Lo probé en una hoja con funciones de matriz de complemento. La hoja de producción que estoy usando es lo suficientemente compleja como para no probar el método .CalculateFull ()
, pero puede funcionar.
Otros consejos
Esto debería hacer el truco ...
'recalculate all open workbooks
Application.Calculate
'recalculate a specific worksheet
Worksheets(1).Calculate
' recalculate a specific range
Worksheets(1).Columns(1).Calculate
En ocasiones, Excel puede tener problemas y necesita un inicio rápido para volver a aplicar una ecuación. Esto sucede en algunos casos cuando estás utilizando fórmulas personalizadas.
Asegúrate de que tienes el siguiente script
ActiveSheet.EnableCalculation = True
Vuelva a aplicar la ecuación de elección.
Cells(RowA,ColB).Formula = Cells(RowA,ColB).Formula
Luego se puede hacer un bucle según sea necesario.
También puedes probar
Application.CalculateFull
o
Application.CalculateFullRebuild
si no te importa reconstruir todos los libros abiertos, en lugar de solo la hoja de cálculo activa. ( CalculateFullRebuild
también reconstruye las dependencias).
Tuve un problema con la desactivación de una imagen de fondo (una marca de agua BORRADOR) en VBA. Mi cambio no se estaba mostrando (que se realizó con el método Sheets (1) .PageSetup.CenterHeader = " "
), por lo que necesitaba una manera de actualizar. El enfoque de ActiveSheet.EnableCalculation
en parte funcionó, pero no cubrió las celdas no utilizadas.
Al final encontré lo que necesitaba con un forro que hizo que la imagen desapareciera cuando ya no estaba configurada: -
Application.ScreenUpdating = True
Después de una actualización de la conexión de datos, algunas UDF no se estaban ejecutando. Usando una subrutina, intentaba recalcular una sola columna con:
Sheets("mysheet").Columns("D").Calculate
Pero la declaración anterior no tuvo efecto. Ninguna de las soluciones anteriores ayudó, excepto la sugerencia de kambeeks para reemplazar las fórmulas que funcionaron y fue rápida si el recálculo manual se activó durante la actualización. El siguiente código solucionó mi problema, incluso si no era exactamente responsable de OP " kluge " comentando, proporcionó una solución rápida / confiable para forzar el nuevo cálculo de las celdas especificadas por el usuario.
Application.Calculation = xlManual
DoEvents
For Each mycell In Sheets("mysheet").Range("D9:D750").Cells
mycell.Formula = mycell.Formula
Next
DoEvents
Application.Calculation = xlAutomatic