当使用vbs搜索文件夹时,打开文件,运行宏个人.xlsb保持打开状态,因此无法移动文件

时间:2016-11-04 17:54:48

标签: excel vba excel-vba vbscript macros

我使用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

1 个答案:

答案 0 :(得分:1)

与其他COM对象不同,当脚本终止时,MS Office应用程序的实例不会自动终止。工作簿也不会神奇地关闭自己。你需要自己做。

其他改进:

  • VisibleDisplayAlerts是应用程序对象的属性,因此您只需将它们设置一次,而不是为每个打开的工作簿设置它们。
  • 不要通过字符串连接构造路径。请改用BuildPath方法。它自动处理路径分隔符,因此您无需在路径组件中添加或删除反斜杠。
  • 您可以使用n-way条件(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进程将保持延迟,直到脚本最终终止,从而自动删除引用。