VBScript - Jak sprawić, by program poczekał, aż proces się zakończy?
Mam problem z VBScript, którego używam z makrem VBA / Excel i HTA. Problemem jest po prostu VBScript, mam dwa pozostałe komponenty, tj. Makro VBA i interfejs HTA działają idealnie. Ale zanim wyjaśnię problem, myślę, że aby mi pomóc, muszę pomóc ci zrozumieć kontekst VBScript.
Tak więc zasadniczo wszystkie komponenty (VBScript, makro VBA i HTA) są częścią narzędzia, które buduję, aby zautomatyzować niektóre prace ręczne. To wygląda tak:
A - HTA~~~~~~~~~~~~
Użytkownik wybiera niektóre pliki z HTA / GUI.W kodzie HTML aplikacji HTA znajduje się kilka znaczników VBScript w znacznikach „SCRIPT”, które przekazują użytkownikom 4 pliki wejściowe jako argumenty do VBScript (wykonanego przez WScript.exe - możesz tu przeczytać uwagę # 1)Skrypt, nazwijmy tomyScript.vbs od teraz obsługuje 4 argumenty, z których 3 są specyficznymi plikami, a czwarty jest lokalizacją ścieżki / folderu, w której znajduje się wiele plików - (patrz także uwaga # 2 dla jasności)B - myScript.vbs~~~~~~~~~~~~
myScript.vbs otwiera pierwsze 3 argumenty, które są plikami Excel. Jednym z nich jest plik * .xlsm, który ma moje makro VBA.myScript.vbs używa wtedy czwartego argumentu, który jest PATH do folderu, który zawiera wiele plików i przypisuje go do zmiennej w celu przekazania do obiektu FileSystemObject podczas wywoływania GetFolder, tj.
<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>
Od tego momentu tworzę pętlę, dzięki której mogę kolejno otwierać pliki w folderze, a następnie uruchamiać moje makro, tj.
<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>
Pamiętaj, że gdy pierwsze 3 pliki Excela zostaną otwarte (kontrolowane kodem przed pętlą i nie są tutaj pokazane, ponieważ nie mam z tym problemu), muszę je otworzyć.
Są to pliki w folderze (który został przekazany jako czwarty argument), które muszą kolejno otwierać i zamykać. Ale między otwarciem a zamknięciem wymagam VBA / makro (napisany w jednym z 3 wcześniej otwartych plików Excel)biegać za każdym razem pętla iteruje i otwiera nowy plik z folderu (mam nadzieję, że podążasz - jeśli nie, daj mi znać :)).
Problem polega na tym, że pliki w folderze otwierają się i zamykają, otwierają i zamykają, n razy (naturalnie n = # plików w folderze), nie czekając na uruchomienie makra. To nie jest to, czego chcę. Próbowałem instrukcji WScript.sleep z 10 sekundowym opóźnieniem po instrukcji „x1.Run strMyMacro”, ale bezskutecznie.
Jakieś pomysły?
Dzięki, QF.
UWAGI:
1 - Dla uproszczenia / jasności tak:
<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 HTA wykorzystuje fragment JavaScript, który usuwa 4. plik wejściowy użytkowników (HTML: INPUT TYPE = "plik") i przekazuje go do VBScript w HTA. Sprawia to, że nie mogę wybrać wyłącznie FOLDERU w HTML.