Shell – VBA
In this Article
- Call Shell (Llamar al Comando Shell)
- Shell Wait
- Devolviendo un Error desde la Función Shell
- Abrir un Archivo Existente con Shell
- Parámetros utilizados por la función Shell
- Devolución de un ID de Proceso desde el Comando Shell
- Llamando a Otros Programas con Shell
- ShellExecute y ShellExecuteEx frente al Comando Shell
Este tutorial le mostrará cómo utilizar la función Shell de VBA.
Podemos utilizar la función VBA Shell para llamar a un programa ejecutable independiente desde dentro de un programa VBA. Por ejemplo, si necesitamos abrir el Bloc de Notas desde Excel, podemos utilizar la función VBA Shell para hacerlo. Si la llamada Shell tiene éxito, devuelve el valor Windows TaskID del programa llamado. Si la llamada Shell falla, devuelve cero.
Shell tiene dos parámetros de entrada: un nombre de ruta requerido para el programa a llamar, y un valor opcional windowstyle que controla el estilo de la ventana donde se ejecutará el programa. El valor pathname puede incluir la ruta / directorio del programa y los argumentos.
Call Shell (Llamar al Comando Shell)
Este código puede formar parte de una macro para ejecutar el Bloc de notas utilizando la funciónVBA Call para llamar a la función Shell.
Sub llamarNotepad()
Call Shell("notepad", vbNormalFocus)
End Sub
Por ejemplo:
Shell Wait
Podemos utilizar el comando Wait de VBA para retrasar la llamada al comando Shell durante un periodo de tiempo específico.
Sub Detener_Ejecucion_VBA()
'Se usa para detener por determinado tiempo la ejecución del código VBA
Application.Wait (Now + TimeValue("00:00:05"))
Call Shell("notepad", vbNormalFocus)
End Sub
Por lo tanto, pasarán 5 segundos antes de que el comando Shell sea llamado.
Devolviendo un Error desde la Función Shell
Si tenemos un error en nuestro código al llamar a la función Shell, se devolverá un error y nuestro código entrará en modo depuración.
Por ejemplo, en esta macro, hemos escrito «note pad» incorrectamente.
Sub llamarNotepad_error()
Call Shell("note pad", vbNormalFocus)
End Sub
El resultado de ejecutar esta macro será:
Abrir un Archivo Existente con Shell
Si tenemos un archivo específico que deseamos abrir con el comando Shell, podemos incluir el nombre del archivo en nuestro código.
Sub Llamar_Notepad_Archivo_Existente()
Call Shell("Notepad.exe D:\AutomateExcel\Ejemplo Call Shell.txt", vbNormalFocus)
End Sub
Si escribimos mal el nombre del archivo, éste no se encontrará y aparecerá un cuadro de mensaje preguntándonos si deseamos crear un archivo nuevo.
Parámetros utilizados por la función Shell
La función Shell tiene 2 parámetros – el nombre del programa a llamar, y el estilo de ventana que el programa va a utilizar. Hemos estado usando el vbNormalFocus en los ejemplos anteriores lo que significa que cuando el programa (en este caso Notepad) se abre, tiene el foco y se abre en la posición y tamaño por defecto en el PC.
El Shell ofrece otras cinco opciones:
vbHide Oculta la ventana y fija el foco en esa ventana
vbMinimizedFocus Muestra la ventana como un icono con foco
vbMaximizedFocus Abre el programa en una ventana maximizada con foco
vbNormalNoFocus Restaura la ventana en su posición y tamaño más recientes
vbMinimizedNoFocus Muestra la ventana como un icono y la ventana actualmente activa permanece activa
Devolución de un ID de Proceso desde el Comando Shell
Cuando ejecutamos el comando Shell, devuelve un ID de proceso o tarea. Podemos almacenar el ID de Proceso en una variable, y utilizar ese ID de Proceso en la ejecución de otro comando – por ejemplo, el comando TaskKill para cerrar el archivo del Bloc de Notas.
Sub TestPID()
Dim ProcessID As Integer
ProcessID = Shell("notepad", vbNormalFocus)
Call Shell("Taskkill /F /PID " + CStr(ProcessID))
MsgBox ("Notepad ProcessID = " + CStr(ProcessID))
End Sub
En la primera línea, se abre el Bloc de Notas y Windows asigna un valor al ID del Proceso. Almacenamos este valor en la variable ProcessID. A continuación, utilizamos TaskKill para forzar al Bloc de notas a cerrar la instancia del Bloc de notas que acabamos de abrir. El modificador /F fuerza al Bloc de notas a finalizar, y el modificador /PID indica a TaskKill que busque el valor de ID de proceso del Bloc de notas. La función CStr convierte ProcessID al formato de cadena que Shell, y MsgBox en la siguiente línea, necesitan.
Llamando a Otros Programas con Shell
Shell abrirá cualquier otro programa de Windows. Por ejemplo, este código llama a Excel, y abre el archivo de Excel ‘example_workbook.xlsx’:
Sub Llamar_Ejemplo_xlsx()
Call Shell("Excel ""D:\AutomateExcel\ejemplo-ancho-columnas""", vbNormalFocus)
End Sub
Esto muestra el archivo abierto:
ShellExecute y ShellExecuteEx frente al Comando Shell
El espacio de programación de Windows ofrece las funciones ShellExecute y ShellExecuteEx que llaman a programas externos desde el código de software. Comparadas con la función Shell de VBA, estas funciones de Windows ofrecen más flexibilidad, pero VBA no las soporta y por lo tanto este artículo no las cubre.