VBScript - Como fazer o programa esperar até o processo terminar?
Eu tenho um problema em um VBScript que estou usando com uma macro VBA / Excel e um HTA. O problema é apenas o VBScript, eu tenho os outros dois componentes, ou seja, a macro VBA e front-end HTA funcionando perfeitamente. Mas antes de explicar o problema, acho que para você me ajudar, devo ajudá-lo a entender o contexto do VBScript.
Portanto, basicamente todos os componentes (VBScript, macro VBA e HTA) são partes de uma ferramenta que estou construindo para automatizar algumas tarefas manuais. É praticamente assim:
A - HTA~~~~~~~~~~~~
O usuário seleciona alguns arquivos do HTA / GUI.Dentro do HTML do HTA há algum VBScript dentro das tags "SCRIPT" que passa os usuários 4 arquivos de entrada como argumentos para um VBScript (executado por WScript.exe - você pode consultar a nota 1 para maior clareza aqui)O roteiro, vamos chamá-lomyScript.vbs de agora em diante, lida com os 4 argumentos, 3 dos quais são arquivos específicos e o 4º é um local de caminho / pasta que contém vários arquivos - (veja também a nota 2 para maior clareza)B - myScript.vbs~~~~~~~~~~~~
myScript.vbs abre os primeiros 3 argumentos que são arquivos do Excel. Um deles é um arquivo * .xlsm que possui minha macro VBA.Em seguida, myScript.vbs usa o argumento 4, que é um PATH, para uma pasta que contém vários arquivos e atribui isso a uma variável para passar a um objeto FileSystemObject ao chamar GetFolder, ou seja,
<code>... 'Other code here, irrelevant for this post Dim FSO, FLD, strFolder ... 'Other code here, irrelevant for this post arg4 = args.Item(3) strFolder = arg4 Set FSO = CreateObject("Scripting.FileSystemObject" 'Get a reference to the folder you want to search Set FLD = FSO.GetFolder(strFolder) ... </code>
A partir daqui, eu crio um loop para que eu possa abrir sequencialmente os arquivos dentro da pasta e, em seguida, executar minha macro, ou seja,
<code>... Dim strWB4, strMyMacro strMyMacro = "Sheet1.my_macro_name" 'loop through the folder and get the file names For Each Fil In FLD.Files Set x4WB = x1.Workbooks.Open(Fil) x4WB.Application.Visible = True x1.Run strMyMacro x4WB.close Next ... </code>
Por favor, note que quando os 3 primeiros arquivos do Excel forem abertos (controlados pelo código antes do loop e não mostrados aqui, pois não estou tendo nenhum problema com essa parte), devo mantê-los abertos.
São os arquivos na pasta (que foram passados como o quarto argumento) que devem abrir e fechar sequencialmente. Mas entre a abertura e o fechamento, eu preciso da macro VBA / (escrita em um dos três arquivos do Excel abertos anteriormente)para executar cada vez o loop itera e abre um novo arquivo da pasta (espero que você siga - se não, por favor me avise :)).
O problema que estou tendo é que os arquivos na pasta abrir e fechar, abrir e fechar, n número de vezes (n = # de arquivos na pasta, naturalmente) sem aguardar a execução da macro. Isso não é o que eu quero. Eu tentei a instrução WScript.sleep com um atraso de 10 segundos após a declaração 'x1.Run strMyMacro', mas sem sucesso.
Alguma ideia?
Obrigado, QF.
NOTAS:
1 - Para simplicidade / clareza, é assim:
<code> strCMD = cmd /c C:\windows\system32\wscript.exe myScript.vbs <arg1> <arg2> <arg3> <arg4> 'FYI - This is run by creating a WShell object, wsObj, and using the .run method, i.e. WShell.run(strCMD) </code>
2 O HTA emprega um pedaço de JavaScript que retira o arquivo de entrada do 4º usuário (HTML: INPUT TYPE = "file") e o transmite para o VBScript dentro do HTA. Isso me leva ao problema de não poder selecionar exclusivamente uma PASTA em HTML.