Visual Basic - Como puedo saber que terminó la ejecución de un archivo .batl desde Excel

Life is soft - evento anual de software empresarial
 
Vista:

Como puedo saber que terminó la ejecución de un archivo .batl desde Excel

Publicado por Aduy Yoani Garia Duarte (3 intervenciones) el 30/11/2017 01:15:17
En Excel he creado una macro (VBA) y entre sus funciones está que a través de un archivo .bat puedo mover archivos de una carpeta ubicada en el PC A a otra carpeta de un PC B (a través de la red local). Pero no he encontrado la forma de poder saber que este proceso de transferencia ha terminado.

¿Cómo puedo crear un mensaje msg en Excel que indique que la transferencia de archivos ha terminado?para así poder continuar trabajando con la macro!

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 1.229
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Como puedo saber que terminó la ejecución de un archivo .batl desde Excel

Publicado por Antoni Masana (444 intervenciones) el 30/11/2017 07:42:17
En primer lugar el BAT en la última línea a de crear un fichero (ver línea 13 del código).
Se ejecuta el BAT (ver línea 17).
Se espera a que exista el fichero de la marca de que finalizo el BAT.
Si el BAT termina por error al pasados 5 minutos (No se cuanto tiempo puede durar las copias. añade un 30% más de tiempo a lo que tarden) se cancela la espera.
Mientras espera en la barra de la parte inferior izquierda va mostrando los segundos que pasan y un texto.
Si se excede el tiempo sale un AVISO de error.
Si el BAT finalizo bien Borra la marca y sale un aviso informando.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Sub Copiar_Files()
    ...
    Dim OldStatusBar As Boolean
    ....
    OldStatusBar = Application.DisplayStatusBar
                   Application.StatusBar = True
 
    Texto_1 = "Esperando que termine la copia... "
    Texto_2 = "CANCELADO." & vbCrLf & vbCrLf & "Demasiado tiempo esperando que finalice el BAT"
 
    ' ---&--- Marca Fin .BAT
 
    Fin_BAT = "C:\Tmp\Fin_BAT.tmp"
 
    ' ---&--- Lanza el proceso .BAT
 
    Shell Prog, vbHide
 
    ' ---&--- Espera la Señal de finalizado
 
    Tmp = Timer
    While Dir(Fin_BAT) = "" And Int(Timer - Tmp) <= 300
        Application.StatusBar = Texto & Timer - Tmp & " Seg."
        DoEvents
    Wend
 
    ' ---&--- Finalizado por Exceso de tiempo
 
    If Int(Timer - Tmp) >= 300 Then
       MsgBox Texto_2, vbCritical + vbOKOnly, "MACRO"
       Exit Sub
    End If
 
    ' ---&--- Ya se han copiado los ficheros
 
    If Dir(Fin_BAT) <> "" Then
       Kill Fin_BAT
       MsgBox "Copia Finalizada.", vbInformation + vbOKOnly, "MACRO"
       Exit Sub
    End If
End Sub

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Como puedo saber que terminó la ejecución de un archivo .batl desde Excel

Publicado por Aduy Yoani Garia Duarte (3 intervenciones) el 01/12/2017 17:21:41
Sr, Antoní, gracias por su respuesta la estoy evaluando y ejecuto, pero no logro llegar al resultado esperado

la instrucción que tengo en VBA de Excel es la siguiente

Private Sub CommandButton4_Click()

Shell "C:\CEDIS\mover.bat", vbNormalFocus

End Sub

Cómo se puede observar el shell ejecuta el archivo .bat y me muestra la ventana del Símbolo del sistema mostrando los archivos en la medida que los está pasando y cuando cierra la venta interpreto que ya se terminó la ejecución de mover los archivos .bat,, he buscado la opción de que la ventana del Símbolo del sistema no se muestre (vbHide) al usuario , pero el hecho de no ver dicha ventana, no puedo saber cuando termina el proceso de mover los archivos de una carpeta a otra.

Lo que me indicas de la línea 13 corresponde a crear en C;\ un archivo de extensión tmp?
Fin_BAT = "C:\Tmp\Fin_BAT.tmp"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.229
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Como puedo saber que terminó la ejecución de un archivo .batl desde Excel

Publicado por Antoni Masana (444 intervenciones) el 01/12/2017 19:28:05
Perdón, no me he acabado de explicar bien del todo.

El archivo BAT C:\CEDIS\mover.bat debe ser algo así:

1
2
3
4
5
@if exist C:\Tmp\Fin_BAT.tmp  @del C:\Tmp\Fin_BAT.tmp
Copy ...
Copy ...
Copy ...
@echo. >C:\Tmp\Fin_BAT.tmp

o

1
2
3
4
5
@del C:\Tmp\Fin_BAT.tmp 2>nul
Copy ...
Copy ...
Copy ...
@echo. >C:\Tmp\Fin_BAT.tmp

La primera línea del BAT, y empieza con un ECHO OFF la segunda, es borrar el FIN_BAT.tmp y la última línea del BAT crearlo.

La macro espera encontrar el fichero cuando finaliza el BAT como señal de que ha finalizado.

Las dos primeras líneas de los ejemplos que he puesto hacen lo mismo: la primera borra el fichero si existe y la segunda captura el mensaje de error si no existe al borrarlo.

El carácter @ a la izquierda de la línea es para ocultar el comando si no tienes un ECHO OFF en el BAT.

La MACRO debería quedar asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Private Sub CommandButton4_Click()
    Dim Texto_1 As String, OldStatusBar As Boolean, _
        Texto_2 As String, Fin_BAT as String, Tmp As Single
 
    OldStatusBar = Application.DisplayStatusBar
                   Application.StatusBar = True
 
    Texto_1 = "Esperando que termine la copia... "
    Texto_2 = "CANCELADO." & vbCrLf & vbCrLf & "Demasiado tiempo esperando que finalice el BAT"
 
    ' ---&--- Marca Fin .BAT
 
    Shell "C:\CEDIS\mover.bat", vbHide
 
    ' ---&--- Espera la Señal de finalizado
 
    Tmp = Timer
    While Dir(Fin_BAT) = "" And Int(Timer - Tmp) <= 300
        Application.StatusBar = Texto & Timer - Tmp & " Seg."
        DoEvents
    Wend
 
    ' ---&--- Finalizado por Exceso de tiempo
 
    If Int(Timer - Tmp) >= 300 Then
       MsgBox Texto_2, vbCritical + vbOKOnly, "MACRO"
       Exit Sub
    End If
 
    ' ---&--- Ya se han copiado los ficheros
 
    If Dir(Fin_BAT) <> "" Then
       Kill Fin_BAT
       MsgBox "Copia Finalizada.", vbInformation + vbOKOnly, "MACRO"
       Exit Sub
    End If
End Sub


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como puedo saber que terminó la ejecución de un archivo .batl desde Excel

Publicado por Aduy Yoani Garia Duarte (3 intervenciones) el 05/12/2017 04:40:10
Sr. Antoni, escribo para agradecerle por tan valioso apoyo. Excelente, muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar