我使用vbs在文件夹中搜索包含" OPS"的文件名。和#"夏娃"并从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
答案 0 :(得分:1)
与其他COM对象不同,当脚本终止时,MS Office应用程序的实例不会自动终止。工作簿也不会神奇地关闭自己。你需要自己做。
其他改进:
Visible
和DisplayAlerts
是应用程序对象的属性,因此您只需将它们设置一次,而不是为每个打开的工作簿设置它们。BuildPath
方法。它自动处理路径分隔符,因此您无需在路径组件中添加或删除反斜杠。If
)而不是使用单独的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进程将保持延迟,直到脚本最终终止,从而自动删除引用。