Tôi gặp sự cố trong VBScript mà tôi đang sử dụng với macro VBA/Excel và HTA. Vấn đề là chỉ VBScript, tôi có hai thành phần khác, tức là VBA vĩ mô và HTA front-end làm việc hoàn hảo. Nhưng trước khi tôi giải thích vấn đề, tôi nghĩ rằng để bạn giúp tôi tôi phải giúp bạn hiểu bối cảnh của VBScript. Vì vậy, về cơ bản tất cả các thành phần (VBScript, VBA vĩ mô và HTA) là một phần của một công cụ mà tôi đang xây dựng để tự động hóa một số công việc thủ công. Nó khá nhiều đi như thế này:VBScript - Làm thế nào để làm cho chương trình đợi cho đến khi quá trình kết thúc?
A - HTA
~~~~~~~~~~~~
- tài lựa chọn một số tập tin từ HTA/GUI.
- Trong HTML của HTA, có một số VBScript trong thẻ "SCRIPT" chuyển các tệp đầu vào của người dùng 4 làm đối số cho VBScript (được thực thi bởi WScript.exe - bạn có thể tham khảo ghi chú số 1 để rõ ràng)
- Kịch bản, cho phép gọi số myScript.vbs từ bây giờ xử lý 4 đối số, 3 trong số đó là tệp cụ thể và 4 là vị trí đường dẫn/thư mục có nhiều tệp trong đó - (xem chú thích # 2) cho rõ ràng)
B - myScript.vbs
~~~~~~~~~~~~
- myScript.vbs mở ra 3 đối số đầu tiên là các tệp Excel. Một trong số đó là tệp * .xlsm có macro VBA của tôi.
myScript.vbs sau đó sử dụng đối số thứ 4 mà là một đường dẫn đến một thư mục chứa nhiều file và gán cho một biến để thông qua một đối tượng FileSystemObject khi gọi GetFolder, tức là
... '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) ...
Từ đây tôi tạo ra một vòng lặp để tôi liên tục có thể mở các tập tin trong thư mục và sau đó chạy vĩ mô của tôi, tức là
... 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 ...
Hãy n ote rằng khi 3 tệp Excel đầu tiên đã mở (được kiểm soát bởi mã trước vòng lặp và không được hiển thị ở đây vì tôi không gặp vấn đề gì với phần đó), tôi phải giữ chúng mở.
Đó là các tệp trong thư mục (đã được chuyển làm đối số thứ tư) phải tuần tự mở và đóng. Nhưng inbetween mở và đóng, tôi yêu cầu VBA/macro (viết trong một trong 3 tệp Excel đã mở trước đó) để chạy mỗi lần vòng lặp lặp lại và mở tệp mới từ thư mục (Tôi hy vọng bạn làm theo - nếu không vui lòng cho tôi biết :)).
Sự cố tôi gặp phải là các tệp trong thư mục mở và đóng, mở và đóng, n số lần (n = # tệp trong thư mục, một cách tự nhiên) mà không chờ macro chạy. Đây không phải là điều tôi muốn. Tôi đã cố gắng tuyên bố WScript.sleep với một sự chậm trễ 10 giây sau khi tuyên bố 'x1.Run strMyMacro', nhưng vô ích.
Bất kỳ ý tưởng nào?
Cảm ơn, QF.
GHI CHÚ:
1 - Để đơn giản/rõ ràng đây là cách:
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 Các HTA sử dụng một mảnh của JavaScript mà dải những người sử dụng 4 tập tin đầu vào (HTML: INPUT TYPE = "file ") và chuyển cho VBScript trong HTA. Điều này giúp tôi giải quyết vấn đề không thể chọn độc quyền một FOLDER trong HTML.
bạn có thể thêm 'x4WB.close' đến hết VBA của bạn vĩ mô thay vì trong VBScript ? –
@oraclecertifiedprofessional: Tôi sẽ cung cấp cho nó một whirl cùng với các tài liệu tham khảo khác sau này. Cảm ơn. –