VBScript - Как заставить программу ждать завершения процесса?

У меня проблема в VBScript, который я использую с макросом VBA/Excel и HTA. . Проблема только в VBScript, у меня есть два других компонента, то есть макрос VBA и интерфейс HTA, которые работают отлично. Но прежде чем я объясню проблему, я думаю, что для того, чтобы вы мне помогли, я должен помочь вам понять контекст VBScript.

Таким образом, практически все компоненты (VBScript, макрос VBA и HTA) являются частями инструмента, который я создаю для автоматизации некоторых рутинных операций. Это выглядит примерно так:

A - HTA

~~~~~~~~~~~~~

  1. Пользователь выбирает некоторые файлы из HTA/GUI.
  2. В HTML HTA есть некоторый VBScript в тегах «SCRIPT», который передает пользователям 4 входных файла в качестве аргументов для VBScript (выполняемого WScript.exe - вы можете обратиться к примечанию № 1 для ясности здесь)
  3. Скрипт, давайте назовем его myScript.vbsс этого момента, затем обрабатывает 4 аргумента, 3 из которых являются конкретными файлами, а 4-й - путь/папка, содержащая несколько файлов - (также см. примечание №2 для ясности)

B - myScript.vbs

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  1. myScript.vbs открывает первые 3 аргумента, которые являются файлами Excel. Один из них — файл *.xlsm с моим макросом VBA.
  2. Затем myScript.vbs использует 4-й аргумент, который представляет собой ПУТЬ к папке, содержащей несколько файлов, и присваивает ее переменной для передачи объекту FileSystemObject при вызове GetFolder, т.е.

    ... 'Другой код здесь, неактуально для этого поста
    Dim FSO, FLD, strFolder
    ... 'Другой код здесь, не относящийся к этому сообщению
    arg4 = args.Item(3)
    стрПапка = arg4
    Установите FSO = CreateObject("Scripting.FileSystemObject"
    'Получите ссылку на папку, которую вы хотите найти
    Установить FLD = FSO.GetFolder(strFolder)
    ...
    
  3. Отсюда я создаю цикл, чтобы последовательно открывать файлы в папке а затем запустить мой макрос, т.е.

    ...
    Дим strWB4, strMyMacro
    strMyMacro = "Лист1.my_macro_name"
    
    'перебрать папку и получить имена файлов
    Для каждого файла в FLD.Files
    
    Установить x4WB = x1.Workbooks.Open(Fil)
    x4WB.Application.Visible = Истина
    x1.Выполнить strMyMacro
    x4WB.закрыть
    Следующий
    ...
    

Обратите внимание, что когда первые 3 файла Excel открыты (контролируются кодом до цикла и не показаны здесь, поскольку у меня нет проблем с этой частью), я должен держать их открытыми.

Именно файлы в папке (которая была передана в качестве 4-го аргумента) должны последовательно открываться и закрываться. Но между открытием и закрытием мне требуется, чтобы VBA/макрос (написанный в одном из трех ранее открытых файлов Excel) запускался каждый раз, когда повторяется цикл и открывает новый файл из папки (надеюсь, вы следуете - если нет, пожалуйста, дайте мне знать :)).

Проблема, с которой я сталкиваюсь, заключается в том, что файлы в папке открываются и закрываются, открываются и закрываются n раз (n = количество файлов в папке, естественно) без ожидания запуска макроса. Это не то, чего я хочу. Я пробовал оператор WScript.sleep с 10-секундной задержкой после оператора «x1.Run strMyMacro», но безрезультатно.

Есть идеи?

Спасибо, QF.

ПРИМЕЧАНИЯ:

1. Для простоты/ясности это делается следующим образом:

    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 HTA использует фрагмент JavaScript, который удаляет четвертый входной файл пользователя (HTML: INPUT TYPE="file") и передает его в VBScript в HTA. Это помогает мне обойти проблему невозможности исключительного выбора ПАПКИ в HTML.

8
задан Community 9 July 2018 в 19:34
поделиться