【问题标题】:VBScript "open all workbooks" Error HandlingVBScript“打开所有工作簿”错误处理
【发布时间】:2020-08-31 19:30:10
【问题描述】:

我的VBScript 打开文件夹中的所有“xlsm”文件,运行VBA 代码“Slim”并关闭工作簿(一个接一个)。它工作正常,但我很难处理错误。如果脚本试图打开当前由其他人打开的工作簿,我最终会弹出错误Someone else is working in /path + wb-name/ right now. Please try again later. 并且循环暂停直到在警告消息上单击OK。看起来它可以毫无问题地打开工作簿,但最后会出现错误,因为 VBA 代码会保存一个新文件并尝试删除旧文件。因此,我将在错误消息的顶部得到一个新文件和未删除的旧文件。

虽然显然不是理想的解决方案,但在这种情况下退出整个循环也比等待点击 OK 要好,因为 VBScript 是自动启动的。

我需要为这种情况构建一个错误处理,这样已经打开的文件将被跳过,循环将继续不间断。不幸的是,DisplayAlerts = Falsegood ol' On Error Resume Next 不会在这里做。

如果可能以合理的方式,我想通过 VBScript 解决这个问题,而不是调整 VBA 代码。

Set fso = CreateObject("Scripting.FileSystemObject")
Set xl  = CreateObject("Excel.Application")

On Error Resume Next
xl.DisplayAlerts = False

For Each f In fso.GetFolder("G:\Archive").Files
  If LCase(fso.GetExtensionName(f.Name)) = "xlsm" Then
    
    Set wb = xl.Workbooks.Open(f.Path)
    
    xl.Run "Slim"    
    wb.Close

  End If

Next

xl.Quit

Set fso = Nothing
Set xl = Nothing

尝试了不同的场景,到目前为止还没有破解。最新选项是这样,但没有帮助(是否有其他方法可以检查工作簿当前是否为只读)?

For Each f In fso.GetFolder("G:\Archive").Files
  If LCase(fso.GetExtensionName(f.Name)) = "xlsm" Then
    
    Set wb = xl.Workbooks.Open(f.Path) 
    
    If NOT wb.ReadOnly Then

    xl.Run "Slim"
    wb.Close

    Else

    wb.Close

    End If
        
  End If

Next

【问题讨论】:

    标签: error-handling vbscript


    【解决方案1】:

    如果 Excel 文件已打开,则再次打开它会被阻止。重命名文件也被阻止,但重命名失败不会显示带有resume next的消息框

    试试这个代码。它首先尝试重命名文件。如果重命名成功,它会重新命名,然后运行宏。如果重命名失败,则跳过该文件。

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set xl  = CreateObject("Excel.Application")
    
    On Error Resume Next
    xl.DisplayAlerts = False
    For Each f In fso.GetFolder("D:\MikeStuff\StackOverflow\ExcelCheckOpen").Files
      If LCase(fso.GetExtensionName(f.Name)) = "xlsm" Then
        xpath = f.Path  ' file path lost after rename
        fso.MoveFile xpath, xpath & ".txt"  ' will fail if file locked by excel
        if fso.FileExists(xpath & ".txt") Then ' rename worked, file not locked
            fso.MoveFile xpath & ".txt", xpath  ' rename back
            Set wb = xl.Workbooks.Open(xpath)
            xl.Run "Slim"    
            wb.Close
        End If
      End If
    Next
    
    xl.Quit
    
    Set fso = Nothing
    Set xl = Nothing
    

    【讨论】:

    • 感谢您的回复!看起来是个不错的方法。我认为代码的后半部分需要一些调整。首先,我认为嵌套 IF 语句缺少一个 End If(否则将报告“下一个意外”错误)。但还有一些我不会马上破解的东西。如果在 wb.Close 之后添加一个 End If,代码将运行,但它只会以重命名的文件结束,例如看起来 rename-back + Workbook Open + xl.Run 不会运行(尽管当前打开的文件未重命名 - 因此主要的 IF 检查有效)。
    • 对不起 - 我的错字。 End If 已添加。对于另一个问题 - 如果重命名成功,它应该将文件重命名为原始名称。您是否看到具有不同名称的重复文件?
    • 不,.txt 扩展名仍然存在,例如也没有重复。可以肯定的是,嵌套的 IF 根本没有启动 - 它几乎会在眨眼间运行,所以看起来甚至没有打开工作簿。在末尾添加了一个消息框 WScript.Echo 以标记脚本的结束。这也显示没有问题,因此通过了 FOR EACH 循环。
    • 另一个错字。应该是f.Path。请重试。
    • 知道了(我想)。请重试。
    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多