Tengo un problema en un VBScript que estoy usando con una macro de VBA/Excel y una HTA. El problema es solo el VBScript, tengo los otros dos componentes, es decir, la interfaz VBA macro y HTA que funcionan perfectamente. Pero antes de explicar el problema, creo que para ayudarme, debo ayudarlo a comprender el contexto de VBScript.VBScript - ¿Cómo hacer que el programa espere hasta que el proceso haya finalizado?
Por lo tanto, básicamente todos los componentes (VBScript, VBA macro y HTA) son parte de una herramienta que estoy creando para automatizar algunas tareas manuales. Es más o menos así:
A - HTA
~~~~~~~~~~~~
- El usuario selecciona algunos archivos de la HTA/GUI.
- Dentro del HTML de la HTA hay algunos VBScript dentro de las etiquetas "SCRIPT" que pasa los 4 archivos de entrada de los usuarios como argumentos a un VBScript (ejecutado por WScript.exe - puede consultar la nota 1 para mayor claridad aquí)
- El script, vamos a llamarlo myScript.vbs a partir de ahora maneja los 4 argumentos, 3 de los cuales son archivos específicos y el 4to es una ubicación de ruta/carpeta que tiene múltiples archivos en él - (también vea la nota # 2 para mayor claridad)
B - myscript.vbs
~~~~~~~~~~~~
- myScript.vbs abre los primeros 3 argumentos que son archivos de Excel. Uno de ellos es un archivo * .xlsm que tiene mi macro VBA.
myscript.vbs utiliza entonces el cuarto argumento de que es una ruta a una carpeta que contiene varios archivos y asigna a que una variable para pasar a un objeto FileSystemObject al llamar GetFolder, es decir
... '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) ...
Desde aquí puedo crear un bucle para que pueda abrir secuencialmente los archivos dentro de la carpeta y luego ejecutar mi macro, es decir
... 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 ...
favor n Es decir, cuando los primeros 3 archivos de Excel se hayan abierto (controlados por código antes del ciclo y no se muestren aquí, ya que no tengo problemas con esa parte), debo mantenerlos abiertos.
Son los archivos en la carpeta (que se pasaron como el 4to argumento) que deben abrirse y cerrarse secuencialmente. Pero entre medio de apertura y cierre, requiero la VBA/macro (escrito en uno de los 3 archivos de Excel previamente abiertos) para funcionar cada vez se repite el bucle y se abre un nuevo archivo de la carpeta (espero que siga - si no por favor Házmelo saber :)).
El problema que tengo es que los archivos de la carpeta se abren y cierran, se abren y se cierran, n cantidad de veces (n = n. De archivos en la carpeta, naturalmente) sin esperar que se ejecute la macro. Esto no es lo que quiero. He probado la sentencia WScript.sleep con un retraso de 10 segundos después de la declaración 'x1.Run strMyMacro', pero fue en vano.
¿Alguna idea?
Gracias, QF.
NOTAS:
1 - Para simplificar/claridad esta es la forma:
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)
2 La HTA emplea un fragmento de código JavaScript que elimina el archivo de entrada cuarta usuarios (HTML: input type = archivo " ") y lo pasa al VBScript dentro de la HTA. Esto me hace olvidar el problema de no poder seleccionar exclusivamente una CARPETA en HTML.
¿Es posible añadir el 'x4WB.close' hasta el final de su macro de VBA en lugar de en el VBScript ? –
@oraclecertifiedprofessional: voy a darle un giro junto con las otras referencias más adelante. Gracias. –