Abrir y Cerrar Procesos desde Excel

El siguiente código es útil cuando se nos hace necesario recurrir a aplicaciones externas para realizar ciertas tareas que no se podrían hacer directamente en Excel o que son complicadas hacerlas, por ejemplo, podríamos necesitar tomar fotos y agregarlas en una carpeta especifica para mostrarlas en nuestras hojas de Excel, entonces necesitaríamos hacer uso de una aplicación externa que tomara las fotos.

Para ejecutar aplicaciones y cerrarlas desde Excel necesitamos hacer uso de las apis de windows, específicamente CreateProcessA y TerminateProcess, por lo que es necesario agregar el siguiente código en un módulo.

Option Explicit
 
Private Type STARTUPINFO
 cb As Long
 lpReserved As String
 lpDesktop As String
 lpTitle As String
 dwX As Long
 dwY As Long
 dwXSize As Long
 dwYSize As Long
 dwXCountChars As Long
 dwYCountChars As Long
 dwFillAttribute As Long
 dwFlags As Long
 wShowWindow As Integer
 cbReserved2 As Integer
 lpReserved2 As Long
 hStdInput As Long
 hStdOutput As Long
 hStdError As Long
End Type
 
Private Type PROCESS_INFORMATION
 hProcess As Long
 hThread As Long
 dwProcessID As Long
 dwThreadID As Long
End Type
 
Private Declare Function CreateProcessA Lib "kernel32" (ByVal lpApplicationName As Long, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long

Private Const NORMAL_PRIORITY_CLASS = &H20&

Private hAplicacion As Long

Lo que hace este código es declarar los tipos de variables STARTUPINFO y PROCESS_INFORMATION que se utilizan para almacenar la información de las aplicaciones que se ejecutan, declarar las apis para poderlas usar en nuestros códigos, declarar la constante NORMAL_PRIORITY_CLASS que se utiliza como parámetro de la api CreateProcessA, y por ultimo declarar la variable hAplicacion donde se almacena el apuntador de la aplicación que se utilizara para poder cerrarla.

Teniendo ya el código anterior, podemos crear nuestros códigos para ejecutar las aplicaciones.

Sub ejecutar()
    'Se declaran las variables (todas son necesarias)
    Dim proc As PROCESS_INFORMATION
    Dim start As STARTUPINFO
    Dim ReturnValue As Integer

    If (hAplicacion = 0) Then
        ReturnValue = CreateProcessA(0&, "notepad.exe", 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
        hAplicacion = proc.hProcess
    End If
End Sub

Por ultimo creamos el código para cerrar la aplicación.

Sub cerrar()
    'Se cierra la aplicación utilizando su apuntador
    TerminateProcess hAplicacion, 0
    hAplicacion = 0
End Sub

Una vez agregado los códigos podemos agregar botones que ejecuten esos códigos para que al hacer clic en un botón se ejecute la aplicación y al hacer clic en otro botón se cierre.

El código es bastante simple para que sea fácil de utilizar, su principal limitación es que solo funciona para una sola aplicación, pero se puede mejorar y adaptar dependiendo del uso que se le vaya a dar.

El ejemplo funcionando lo encuentran en el siguiente enlace https://1drv.ms/x/s!ACvMpSG8IKpngU4, espero les sea útil.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s