Macro no reconoce comandos de no actualizar pantalla y de calculo manual

Buenas tardes expertos , tengo un problema el cual detallare con minuciosamente a continuación. El problema es que cree una macro y el proceso se demora aprox 45 horas , el problema es que yo sabia que con los comandos para que la pantalla no se actualice y el calculo manual se supone que iría mas rapido y dejaría de hacer el calculo por hojas cada vez que lo iniciara. No entiendo porque sigue como que no lo hubiese guardado , ojalas me pueda ayudar, de antemano muchas gracias. El código de mi macro es el siguiente.

Attribute VB_Name = "Módulo1"
Private Sub WorkBook_Open()
Application.OnTime Now() + TimeValue("00:00:05"), "esta"
End Sub


Sub esta()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
End Sub


Public Function f_EquipoResponde(str_Equipo As String) As String
Dim obj_Shell As Object
Dim obj_FileSystem As Object
Dim obj_Fichero As Object
Dim str_ContenidoFichero As String
Dim str_FicheroTemporal As String
Dim str_NombreMaquina As String
Set obj_Shell = CreateObject("WScript.Shell")
Set obj_FileSystem = CreateObject("Scripting.FileSystemObject")
str_FicheroTemporal = ThisWorkbook.Path & "\temp.txt"
obj_Shell.Run "cmd /c ping -a -n 2 -w 150 " & str_Equipo & " > """ & _
str_FicheroTemporal & """", 0, True
Set obj_Fichero = obj_FileSystem.OpenTextFile(str_FicheroTemporal, 1, False)
str_ContenidoFichero = obj_Fichero.ReadAll
obj_Fichero.Close
Set obj_Fichero = Nothing
obj_FileSystem.DeleteFile (str_FicheroTemporal)
Set obj_FileSystem = Nothing
Set obj_Shell = Nothing
Dim nombre As String
nombre = Mid(Replace(str_ContenidoFichero, vbCrLf, ""), 17, 10)

If InStr(str_ContenidoFichero, "perdidos = 0") > 0 Then
f_EquipoResponde = nombre & " ha RECIBIDOS 100%"
End If
If InStr(str_ContenidoFichero, "perdidos = 1") > 0 Then
f_EquipoResponde = nombre & "ha RECIBIDOS 50%"
End If
If InStr(str_ContenidoFichero, "perdidos = 2") > 0 Then
f_EquipoResponde = "IP VACANTE"
End If
End Function

1 respuesta

Respuesta
1

Pues la macro que has agregado ("esta") lo que hace es 5 segundos después de abrir cambiar el calculo de excel a Manual... y eso lo hace bien... pues esa función cambia un parámetro de funcionamiento de Excel y queda activa aun después de ejecutar la macro

Pero... la otra linea, la de no mostrar los cambios en pantalla solo funciona mientras se esta ejecutando esa macro "esta"... y entonces en el segundo 6 esa macro ya habrá terminado y la actualización de pantalla regresa a lo normal para que tengas acceso a la interfaz de Excel... y continúes con tu trabajo normal-

La pregunta es... ¿cuál es la macro que demora 45 horas?

¿La ejecución de una función? O hay otra en la que haces escribes una formula que la involucra y haces un copiado valores a varias celdas...

En esa otra macro... que debería empezar por... Sub algo()... si podrías incluir <strong style="font-size: 14px; line-height: 1.5em;">Application.ScreenUpdating = False al principio... allí si debería notarse la diferencia.

Gracias Jaime por responder , bueno en cuanto a lo primero que señalaste haré los cambios , ahora el proceso que se demora 45 horas es el f_EquipoResponde () ya que este proceso se hace 255 veces por hoja. en aproximadamente 36 hojas

Ok... entiendo...

El detalle de dejar un proceso corriendo por horas sin actualizar la pantalla es que a veces se queda el icono de trabajo de windows y el sistema interpreta que la aplicación se colgó...

Quizás algo que te pueda ayudar es introducir, en alguna parte del código... la instrucción

DoEvents ... aunque puede mermar la eficiencia del proceso... permite retomar al usuario el control de la aplicación y evita que se "congele" ... como me parece que tu código no interactúa con las celdas de Excel podría no interferir...

Me comentas como te fue

a que te refieres con interactuar con las celrdas ?

saludos,

Nicolas

Si estuvieras haciendo una macro en la cual escribes en las celdas un valor y luego los lees y lo modificas y con eso haces cálculos... entonces... si esta con la actualización de pantalla en False... y tu macro demorara por decir 10 minutos... durante 10 minutos verías la pantalla congelada y luego todas las celdas cambiadas...

Si en esa macro tu introduces DoEvents... se ejecuta igual.. pero en esos 10 minutos puedes "trabajar" en la hoja de Excel... moverte por las celdas e introducir valores en otras... pero si eso "altera" el resultado de la macro... ya sea porque te desplazaste a otras celdas "en medio" de la ejecución del programa.. entonces ni modo... no te conviene...

Solo sería seguro si en la ejecución de la macro todos los valores escritos y leídos de celdas fueran direccionados de manera absoluta Workbooks("Miarchivo"). Sheets("HojaN").Cells(4,5)... porque si hay Range("A5").Select o movimiento grabado de flecha abajo o asi... la macro depende de que el usuario no pueda interferir con ella.

Aun si no fuera el caso, DoEvents te ayuda a poder "interrumpir" la macro en algún momento de ejecución de la misma porque aunque no hicieras nada mas que observar lo que pasa.. puedes presionar Ctrl + Break y cortar la macro... Pero si te resta "algo" de velocidad de ejecución.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas