Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Quando executa a função Shell num procedimento Visual Basic for Applications (VBA), este inicia um programa executável de forma assíncrona e devolve o controlo ao procedimento. Este programa shelled continua a ser executado independentemente do seu procedimento até o fechar.
Se o procedimento precisar de aguardar o fim do processo de shell, pode utilizar a API do Windows para consultar o status da aplicação, mas isto não é muito eficiente. Este tópico explica um método mais eficiente.
A API do Windows tem uma funcionalidade integrada que permite que a sua aplicação aguarde até que um processo de shell seja concluído. Para utilizar estas funções, tem de ter uma alça para o processo de shell. Para tal, utilize a função CreateProcess em vez da função Shell para iniciar o programa shelled.
Criar o processo de shell
Para criar um processo endereçável, utilize a função CreateProcess para iniciar a aplicação com shell. A função CreateProcess dá ao programa o processamento do processo descastado através de um dos respetivos parâmetros transmitidos.
Aguarde até que o processo de shelled termine
Depois de utilizar a função CreateProcess para obter uma alça de processo, pode transmitir essa alça para a função WaitForSingleObject . Isto faz com que o procedimento VBA suspenda a execução até que o processo shelled termine.
Os passos seguintes são necessários para criar um procedimento VBA que utilize a função CreateProcess para executar a aplicação Bloco de Notas do Windows. Este código mostra como utilizar as funções CreateProcess e WaitForSingleObject da API do Windows para aguardar até que um processo descascado termine antes de retomar a execução.
A sintaxe da função CreateProcess é complexa, pelo que, no código de exemplo, é encapsulada numa função chamada ExecCmd. O ExecCmd utiliza um parâmetro, a linha de comandos da aplicação a executar.
Crie um módulo padrão e cole as seguintes linhas na secção Declarações:
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 WaitForSingleObject Lib "kernel32" (ByVal _ hHandle As Long, ByVal dwMilliseconds As Long) As Long 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 CloseHandle Lib "kernel32" (ByVal _ hObject As Long) As Long Private Const NORMAL_PRIORITY_CLASS = &H20& Private Const INFINITE = -1&Cole o seguinte código no módulo:
Public Sub ExecCmd(cmdline As String) Dim proc As PROCESS_INFORMATION Dim start As STARTUPINFO Dim ReturnValue As Integer ' Initialize the STARTUPINFO structure: start.cb = Len(start) ' Start the shelled application: ReturnValue = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, _ NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc) ' Wait for the shelled application to finish: Do ReturnValue = WaitForSingleObject(proc.hProcess, 0) DoEvents Loop Until ReturnValue <> 258 ReturnValue = CloseHandle(proc.hProcess) End SubPara testar a função, cole o seguinte código na janela Imediato e prima Enter. O bloco de notas é iniciado. Após um momento, feche o Bloco de Notas. A caixa de mensagem é apresentada quando o Bloco de Notas é fechado.
ExecCmd "NOTEPAD.EXE": MsgBox "Process Finished"
Suporte e comentários
Tem dúvidas ou quer enviar comentários sobre o VBA para Office ou sobre esta documentação? Confira Suporte e comentários sobre o VBA para Office a fim de obter orientação sobre as maneiras pelas quais você pode receber suporte e fornecer comentários.