簡體   English   中英

使用vbs搜索文件夾,打開文件時,運行macro personal.xlsb保持打開狀態,因此無法移動文件

[英]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應用程序實例不會自動終止。 這些工作簿也不會神奇地關閉自己。 您需要自己做。

其他改進:

  • VisibleDisplayAlerts是應用程序對象的屬性,因此您只需要設置一次,而不是為每個打開的工作簿設置一次。
  • 不要通過字符串串聯來構造路徑。 請改用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM