6 febrero, 2025

CERRAR UN PROGRAMA DESDE EXCEL CON VBA

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!!

Comparte este post

21 comentarios en «CERRAR UN PROGRAMA DESDE EXCEL CON VBA»

    1. 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

  1. 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.

    1. 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

  2. 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

  3. 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?

    1. 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.

  4. 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».

    1. 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.

  5. Hola, buen dia, excelente aporte.
    Tengo una duda, espero explicarme….

    Tengo un excel que de forma automatica abre y cierra libros para guardar info, pero al momento de ver mi task manager, observo multiples procesos de excel abiertos, pero checanto las ventanas, no lo estan.
    Quisiera cerrar desde excel, todos los procesos que se abren (por ejecucion de de otras macros del mismo excel), pero sin cerrar el excel donde trabajo.

    No se si tenga un post relacionado a esto, y sino, me gustaria ver si existe una forma de resolver mi duda.

    De antemano muchas gracias y saludos

      1. Buen dia

        De antemano muchas Grx por prestarle atencion a mi comentario.
        Intentare explicar mi situacion…

        Tengo un excel que por medio de una macro, abre otro libro de excel, pega una informacion, y enseguida cierra el libro que abrio. La macro finaliza exitosamente.

        El problema es, cuando abro el administrador de tareas de Windows, veo que hay dos o mas procesos de Excel corriendo, pero lo cierto es que solo tengo uno ejecutandose.

        Mi teoria es, que se queda (el excel que se abrio por medio de la macro y que tambien se cerro), en la memoria de la computadora (lo mas seguro que en la RAM).

        Lo que busco es, que desde la misma macro cierre correctamente el proceso de Excel para que no lo vea en el administrador de tareas de Windows.

        O

        Una macro, donde pueda eliminar los procesos de Excel que no esten abiertos.

        Muchas Gracias por su tiempo, y si no logre explicarme lo suficiente, de antemano una enorme disculpa y no preocupe en invertir mas su tiempo a este tema.

        Saludos y que tenga un excelente dia.

        1. Hola:

          El problema de trabajar en ese tipo de errores es que debes acceder a elementos del equipo en los que cualquier error puede ocasionar un problema mayor, ese el motivo de no entrar a valorar la consulta. No es lo mismo cerrar un programa que entrar en el arbol de procesos y cerrar uno. No obstante, si estás trabajando con objetos en tu macro, deberías utilizar «nothing» para liberar memoria y eso puede que sea el problema que tienes.

          Verifica si en tu código tienes un set y cómo se está comportando.
          Saludos.

  6. Hola buen día muy buena información, una consulta tengo un formulario que con macro ingresa nuevos clientes, pero necesito un nuevo formulario que asocie al cliente cree una columna nueva y pueda poner mas información con macro, La idea es que un nuevo formulario agregue varios presupuestos pero siempre en una nueva columna y asociado al cliente que especifique con id, si es posible que me ayudes te agradezco

  7. Hola Damián:

    Tu consulta requiere un gran desarrollo y en estos momentos no dispongo del tiempo suficiente. Puedes intentar utilizar los recursos de esta web para intentarlo tu mismo. Saludos.

  8. Me gusto, mi pregunta es, ¿se podría hacer para un programa? La idea es decidir que hacer, si esta abierto ejecutar una sentencia como traerlo a primer plano y si esta cerrado otra sentencia como abrirlo o un mensaje.
    básicamente es identificar si el proceso esta activo o inactivo y dependiendo de eso ya añadirle las instrucciones que uno quiera.

    de antemano gracias y saludos.

    1. Intentaré investigar si es posible hacer lo que indicas. De todas formas está macro cierra cualquier programa que se le especifique. Pero estudiaré lo de traerlo a primer plano.

      Saludos.

  9. Hola Segu,

    Perfecta la macro. Mil gracias. Se puede cerrar una ventana desde la macro? Por ejemplo: C:\Mis Documentos ?

    Muchas gracias por tu ayuda.

    Patrick

    1. Sí, es posible, hay desarrollos realizados en internet. Creo que si pones en el buscador: «close a window explorer with vba» encontrarás ejemplos. En esta web todavía no lo he desarrollado como ejemplo. Saludos

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies