У меня проблема с VBScript, который я использую с макросом VBA / Excel и HTA. Проблема только в VBScript, у меня есть два других компонента, то есть макрос VBA и интерфейс HTA, которые работают отлично. Но прежде чем я объясню проблему, я думаю, что для того, чтобы вы мне помогли, я должен помочь вам понять контекст VBScript.
Итак, в основном все компоненты (VBScript, VBA macro и HTA) являются частями инструмента, который я создаю для автоматизации некоторых ручных работ. Это примерно так:
A - HTA
~~~~~~~~~~~~
- Пользователь выбирает некоторые файлы из HTA / GUI.
- В HTML HTA есть некоторый VBScript в тегах «SCRIPT», который передает 4 входных файла пользователей в качестве аргументов VBScript (выполняется WScript.exe - вы можете обратиться к примечанию № 1 для ясности здесь)
- Сценарий, позволяющий называть его myScript.vbs с этого момента, обрабатывает 4 аргумента, 3 из которых являются конкретными файлами, а 4-й - это путь / расположение папки, в котором есть несколько файлов - (также см. примечание # 2 для ясности)
B - myScript.vbs
~~~~~~~~~~~~
- myScript.vbs открывает первые 3 аргумента, которые являются файлами Excel. Один из них - файл * .xlsm с моим макросом VBA.
myScript.vbs затем использует 4-й аргумент, который представляет собой ПУТЬ к папке, содержащей несколько файлов, и назначает его переменной для передачи объекту FileSystemObject при вызове GetFolder, т.е.
... '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) ...
Отсюда я создаю цикл, чтобы я мог последовательно открывать файлы в папке, а затем запускать свой макрос, т.е.
... 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 ...
Обратите внимание, что при открытии первых 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, который удаляет 4-й входной файл пользователя (HTML: INPUT TYPE = "file") и передает его сценарию VBScript в HTA. Это помогает мне решить проблему невозможности исключительного выбора ПАПКИ в HTML.
x4WB.close
в конец макроса VBA вместо VBScript? - person   schedule 23.04.2012