[英]When using vbs to search folder, open file, run macro personal.xlsb stays open so files cannot be moved
我正在使用vbs在文件夾中搜索包含“ OPS”和“ Eve”的文件名,並從Personal.xlsb調用宏,另存為,關閉。 該腳本可以正常運行,並且可以滿足我的需要,但Personal.xlsb會在后台保持打開狀態,並且不允許我移動/刪除/執行其他操作。 這些文件,除非我通過任務管理器停止該過程。 這很麻煩,因為這樣做會關閉所有其他打開的Excel工作簿。 任何幫助表示贊賞。 也歡迎有關以下代碼的一般VBS技巧。
Dim app, fso, file, fName, wb, dir, wb2, shell, searchFileNameOPS, searchFileNameEvents
dir = "C:\Users\ntunstall\Desktop\test\"
searchFileNameOPS = "OPS"
searchFileNameEvents = "Event"
Set app = CreateObject("Excel.Application")
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("WScript.Shell")
Set wb2 = app.Workbooks.Open("C:\Users\ntunstall\AppData\Roaming\Microsoft\Excel\XLSTART\PERSONAL.XLSB")
For Each file In fso.GetFolder(dir).Files
If InStr(file.Name, searchFileNameOPS) = 1 Then
fName = fso.GetBaseName(file)
Set wb = app.Workbooks.Open(file)
app.Application.Visible = False
app.Application.DisplayAlerts = False
app.Run wb2.Name & "!Main"
app.ActiveWorkbook.SaveAs dir & fName & ".xlsm", 52
End If
If InStr(file.Name, searchFileNameEvents) = 1 Then
fName = fso.GetBaseName(file)
Set wb = app.Workbooks.Open(file)
app.Application.Visible = False
app.Application.DisplayAlerts = False
app.Run wb2.Name & "!Events"
app.ActiveWorkbook.SaveAs dir & fName & ".xlsm", 52
End If
Next
WScript.Quit
與其他COM對象不同,腳本終止時,MS Office應用程序實例不會自動終止。 這些工作簿也不會神奇地關閉自己。 您需要自己做。
其他改進:
Visible
和DisplayAlerts
是應用程序對象的屬性,因此您只需要設置一次,而不是為每個打開的工作簿設置一次。 BuildPath
方法。 它自動處理路徑分隔符,因此您無需費心在路徑組件中添加反斜杠或從中刪除反斜杠。 If
語句,您可以使用n路條件( If..ElseIf
)。 If
塊實際上只是在很小的差異上做相同的事情,因此您可能希望將該代碼放在過程中,並將不同的值作為參數傳遞。 WScript.Quit
是無用的。 僅在某些情況下要退出腳本(通常使用非零退出代碼)時才需要。 dir = "C:\Users\ntunstall\Desktop\test"
Sub RunMacroAndSaveAs(file, macro)
Set wb = app.Workbooks.Open(file)
app.Run wb2.Name & "!" & macro
wb.SaveAs fso.BuildPath(file.ParentFolder, fso.GetBaseName(file) & ".xlsm"), 52
wb.Close
End Sub
Set fso = CreateObject("Scripting.FileSystemObject")
Set app = CreateObject("Excel.Application")
app.Visible = False
app.DisplayAlerts = False
Set wb2 = app.Workbooks.Open("C:\Users\...\XLSTART\PERSONAL.XLSB")
For Each file In fso.GetFolder(dir).Files
If InStr(file.Name, "OPS") = 1 Then
RunMacroAndSaveAs file, "Main"
ElseIf InStr(file.Name, "Event") = 1 Then
RunMacroAndSaveAs file, "Events"
End If
Next
app.Quit
如果終止Excel實例后沒有立即退出腳本,則可能還需要添加Set app = Nothing
來刪除對應用程序對象的引用。 否則,Excel進程將一直徘徊,直到腳本最終終止,從而自動刪除引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.