Shell – VBA

Written by

Mel Jenkins

Reviewed by

Steve Rynearson

Translated by

Dennis Madrid

Last updated on marzo 28, 2023

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:

Procedimiento LlamarNotepad

 

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á:

Procedimiento llamarNotepad_error

 

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

Procedimiento Llamar Notepad Archivo Existente

 

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.

Procedimiento Llamar Notepad Archivo Inexistente

 

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.

Devolución de un ID de Proceso desde el Comando Shell

 

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:

Ejemplo Abrir Archivo Excel con Comando Shell VBA

 

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.

vba-free-addin

Complemento de Ejemplos de Código de VBA

Acceda fácilmente a todos los ejemplos de código que se encuentran en nuestro sitio.

Simplemente navegue al menú, haga clic y el código se insertará directamente en su módulo. Complemento .xlam.

(¡No se requiere instalación!)

Descarga gratuita

Return to VBA Code Examples