La fonction `Shell` en VBA (Visual Basic for Applications) est utilisée pour exécuter un autre programme à partir de votre code VBA. Voici comment vous pouvez utiliser cette fonction :
Syntaxe de base
Shell(pathname, [windowstyle])
- pathname : Il s’agit d’une chaîne de caractères qui spécifie le chemin et le nom du fichier exécutable que vous souhaitez lancer. Vous pouvez également inclure les arguments que l’exécutable prend en entrée.
- windowstyle (optionnel) : Un argument numérique qui spécifie le style de la fenêtre dans laquelle le programme sera exécuté. Voici les options disponibles :
- `vbHide` (0) : Cache la fenêtre et active une autre fenêtre.
- `vbNormalFocus` (1) : Affiche la fenêtre normalement et lui donne le focus.
- `vbMinimizedFocus` (2) : Affiche la fenêtre en mode minimisé et lui donne le focus.
- `vbMaximizedFocus` (3) : Affiche la fenêtre en mode maximisé et lui donne le focus.
- `vbNormalNoFocus` (4) : Affiche la fenêtre normalement sans lui donner le focus.
- `vbMinimizedNoFocus` (6) : Affiche la fenêtre en mode minimisé sans lui donner le focus.
Exemple d’utilisation
Voici un exemple simple qui montre comment exécuter l’application “Bloc-notes” de Windows :
Sub ExecuteNotepad()
Dim TaskID As Double
TaskID = Shell("notepad.exe", vbNormalFocus)
End Sub
Dans cet exemple, la fonction `Shell` lance le Bloc-notes et stocke l’ID du processus dans la variable `TaskID`.
Notes supplémentaires
- Chemin d’accès complet : Si le programme que vous souhaitez exécuter n’est pas dans les variables d’environnement du chemin système, vous devrez spécifier le chemin d’accès complet.
- Gestion des erreurs : Assurez-vous de gérer les erreurs potentielles, comme essayer de lancer un programme qui n’existe pas à l’endroit spécifié.
- Attendre la fin du processus : La fonction `Shell` lance un programme mais ne patiente pas jusqu’à ce que celui-ci se termine. Si vous avez besoin d’attendre, vous devrez utiliser des API Windows supplémentaires, comme `WaitForSingleObject`.
Exemple avancé avec attente
Pour attendre la fin d’un processus, vous pourriez utiliser le code suivant combiné avec des API Windows :
Declare PtrSafe Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As LongPtr, ByVal dwMilliseconds As Long) As Long
Declare PtrSafe Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongPtr
Sub RunProgramAndWait()
Dim processId As LongPtr
Dim processHandle As LongPtr
Dim result As Long
processId = Shell("notepad.exe", vbNormalFocus)
' Open the process to wait for its completion
processHandle = OpenProcess(&H100000, False, processId)
If processHandle Then
' Wait indefinitely (-1) for the process to finish
result = WaitForSingleObject(processHandle, &HFFFFFFFF)
End If
End Sub
Ce code utilise les fonctions `OpenProcess` et `WaitForSingleObject` pour attendre que le Bloc-notes se termine avant de poursuivre l’exécution de la macro VBA. Notez que `Declare PtrSafe` est utilisé pour la compatibilité avec les versions 64 bits de VBA.