Hola a todos 🙂
Estos días tenía pensado subir algún post relacionado con la minería de datos y la utilización de variables estadísticas para obtener datos y resultados relevantes en nuestras investigaciones.
Pues bien, ese artículo tendrá que esperar, el motivo es que esta semana he tenido muchas consultas y algunas han sido (y siguen siendo) bastante complejas.
Pero como me encanta publicar cosas nuevas en la web, hoy os voy a dejar un código en VBA que tiene como finalidad la de cerrar desde Excel cualquier programa que tengamos abierto en nuestro equipo.
Por ejemplo, si tenemos Word abierto y necesitamos cerrarlo, o Acrobat, etc … podemos utilizar esta macro:
Sub Cierra_Programa()
'Declaramos variables
Dim cObj As Object
Dim Programa As Object
Dim Proceso As Object
'Realizamos una consulta SQL para verificar si el programa está activo, en proceso.
Set cObj = GetObject("winmgmts://.")
Set Proceso = cObj.ExecQuery("SELECT * FROM " & _
"Win32_Process WHERE Name = 'winword.exe'")
'Con un For recorremos la consulta y cerramos el programa
For Each Programa In Proceso
On Error Resume Next
Call Programa.Terminate
On Error GoTo 0
Next
'Liberamos variables
Set Proceso = Nothing
Set cObj = Nothing
End Sub
En este ejemplo estamos cerrando Word, pero si quisiéramos cerrar Acrobat Reader porque tenemos uno o varios PDF’s abiertos, tendríamos que cambiar esto (en rojo) en la macro:
'"Win32_Process WHERE Name = 'AcroRd32.exe'")
O para el bloc de notas:
"Win32_Process WHERE Name = 'notepad.exe'")
Es una macro muy sencilla y que nos puede solucionar muchos dolores de cabeza cuando necesitamos cerrar desde la aplicación que hemos creado en Excel algún programa.
No creo que sea necesario adjuntar documento para esta ocasión, dado que sencillamente solo tenéis que copiar el código en vuestro editor de VBA en un módulo estándar y aplicarlo.
Espero que os sea de utilidad.
Saludos!!
EJECUTAR UNA MACRO CON EL PROGRAMADOR DE TAREAS DE WINDOWS | EXCEL SIGNUM
[…] Para ello, tenemos en esta web una macro que sirve para cerrar programas, entre ellos, word: CERRAR UN PROGRAMA DESDE EXCEL CON VBA […]
Luis Vicente
Me ha gustado, pero si el nombre del programa está en una variable como funciona
Segu
Hola Luis Vicente:
Solo tienes que componer la cadena. Imagina que word es la variable utilizada para "winword.exe":
Sería así:
word = "winword.exe"
'Realizamos una consulta SQL para verificar si el programa está activo, en proceso.
Set cObj = GetObject("winmgmts://.")
Set Proceso = cObj.ExecQuery("SELECT * FROM " & _
"Win32_Process WHERE Name = '" & word & "' ")
Saludos
Luis Emilio Duque Jaramillo
excelente, me solucionó problema de error en la ejecución de un macro automático, que se bloqueaba cuando tenía abierto outlook. ahora me pregunto que hacer si quiero cerrar varios programas a la vez?, esto es para evitar el mismo error si tengo abierto el archivo que quiero enviar como pdf.
Segu
Para cerrar varios programas a la vez, podemos introducir todos los procesos en un array y ejecutar un proceso que vaya comprobando si están abiertos, así:
For Each Programas In Array("winword.exe", "notepad.exe", "AcroRd32.exe")
Set cObj = GetObject("winmgmts://.")
Set Proceso = cObj.ExecQuery("SELECT * FROM " & _
"Win32_Process WHERE Name = " & Chr(39) & Programas & Chr(39))
'Con un For recorremos la consulta y cerramos el programa
For Each Programa In Proceso
On Error Resume Next
Call Programa.Terminate
On Error GoTo 0
Next
Next
David
Bueno el aporte, ¿pero puedo cerrar un archivo en específico?, uno que se encuentre en una ruta con un nombre definido, por ejemplo: C:\Users\prueba\Documento.pdf.
¿En donde colocar la ruta?
Saludos
Segu
Hola David: intentaré desarrollar un post sobre lo que indicas. Este post no sería adecuado para cerrar un archivo específico. Saludos.
José Armaza
Excelente. Efectivamente el programa cierra Word, pero qué pasa si tengo un archivo abierto en Word sobre el que estoy trabajando. ¿Cómo se podría implementar una confirmación antes de cerrar la aplicación?
Segu
Hola José:
Lo único que tienes que hacer es introducir un Msgbox de dos botones (Si/No) y listo, lo debes incluir entre el control de error.
On Error Resume Next
Mensaje = MsgBox("Deseas cerrar word?", vbYesNo)
If Mensaje = vbYes Then
Call Programa.Terminate
On Error GoTo 0
Saludos.
José Armaza
Muchas gracias, funciona. Utilicé el código en una pequeña aplicación para exportar a Word el contenido de ciertas celdas de Excel y lo envié a un amigo. Sin embargo, cuando trata de abrir el archivo en Word generado por la aplicación, recibe el siguiente mensaje: Error “Archivo en uso”: “ está bloqueado para su edición por” otro usuario “. Abra “Sólo lectura” o haga clic en “Notificar” para abrir la notificación de sólo lectura y recibir cuando el documento ya no está en uso. ¿Cómo se podría solucionar este error? En el código del programa estoy trabajando con el método "late binding".
Segu
Hola José:
El mundo Word no es mi especialidad, en la web he encontrado información sobre el error: https://support.office.com/es-es/article/otro-usuario-ha-bloqueado-la-edici%C3%B3n-de-este-archivo-de-excel-6fa93887-2c2c-45f0-abcc-31b04aed68b3
Una medida puede ser la de introducir un tiempo desde que cierra el programa y lo abre, con un application.wait() aunque yo no sé cual es el código.
Por otra parte, verificar cada uno de puntos del enlace.
Saludos.