【问题标题】:Error 91 displays after Application Quit instruction应用程序退出指令后显示错误 91
【发布时间】:2021-08-05 19:20:38
【问题描述】:

我已经构建了一个加载项,旨在从 www 下载。加载项将出现在用户计算机的“下载”文件夹中。

在激活时,加载项活动的第一阶段是使用 SaveAs 将自身复制到用户的“/Microsoft/AddIns”文件夹中。然后“父”加载项自行关闭并退出 Excel。 (在重新启动 Excel 时,“子”加载项将被加载并处于活动状态。)

代码是

Sub CheckInstall()

'Several lines of code before this.
'They have been tested and seem to work well.

MyNewfileNm = TestBase & GCSAPPNAME

If IsInstalled(MyNewfileNm) Then

    Application.DisplayAlerts = False
    ThisWorkBook.SaveCopyAs MyNewfileNm
    Application.DisplayAlerts = True

    MsgBox "We're done, and Excel will close." & Chr(13) & _
    "On reopening you will find 'ACBA Mapping' loaded and active in the ADD-INS tab."
    
    
    Excel.Application.Quit
    ActiveWorkbook.Close False


Else
        ThisWorkBook.SaveCopyAs MyNewfileNm
    
            If ActiveWorkbook Is Nothing Then
                Workbooks.Add
                Set oAddIn = Application.AddIns.Add(MyNewfileNm, False)
                oAddIn.Installed = True
            Else
                Set oAddIn = Application.AddIns.Add(MyNewfileNm, False)
                oAddIn.Installed = True
            End If
            
    MsgBox "We're done, and Excel will close." & Chr(13) & _
    "On reopening you will find 'ACBA Mapping' loaded and active in the ADD-INS tab."
    
    Excel.Application.Quit
    ActiveWorkbook.Close False
End If


End Sub

这会按预期处理和复制自身,但在 Application.Quit 完成之前,我收到错误代码 91。单击错误消息时,它只是恢复指令代码。结果完全符合预期。

但是,我必须解决生成错误消息的问题或禁止显示错误消息。暂时我也做不到。

我将不胜感激。

【问题讨论】:

  • 您为什么要在退出 Excel 后关闭工作簿?
  • 如果您在打开未保存的工作簿的情况下退出 excel,它会询问您是否要保存它。在这种情况下,答案是“否”。打开工作簿只是为了方便复制的外接程序的安装过程。
  • 也就是说……为什么不先关闭再退出?
  • 是的,我也这么认为,但是在测试中,Excel.Application.Quit 未能完全退出。看来代码指令的顺序是必须的。
  • Raymond - 我想你可能已经注意到了潜在的问题。在 IF 语句的第一部分,我没有重新安装加载项。这已在例程的早期设置为 FALSE。我会在适当的时候测试它。

标签: excel vba


【解决方案1】:

这对我来说是一个愚蠢的错误。下面修改后的代码运行没有错误。唯一的区别是在主 IF 语句的第一部分中消除了关闭 ActiveWorkbook 的指令。那时没有可关闭的打开工作簿。

Sub Check Install()
'Several lines of code before this.
'They have been tested and seem to work well.

MyNewfileNm = TestBase & GCSAPPNAME

If IsInstalled(MyNewfileNm) Then

    Application.DisplayAlerts = False
    ThisWorkBook.SaveCopyAs MyNewfileNm
    Application.DisplayAlerts = True

    MsgBox "We're done, and Excel will close." & Chr(13) & _
    "On reopening you will find the " & NewMappingVersion & " version of 'ACBA Mapping' loaded."
    
    
    Excel.Application.Quit
'    In principle we haven't initiated a Workbook so there is no need to close it.
'    ActiveWorkbook.Close False


Else
        ThisWorkBook.SaveCopyAs MyNewfileNm
    
            If ActiveWorkbook Is Nothing Then
                Workbooks.Add
                Set oAddIn = Application.AddIns.Add(MyNewfileNm, False)
                oAddIn.Installed = True
            Else
'               This shouldn't be necessary, but leave it for the time being.
                Set oAddIn = Application.AddIns.Add(MyNewfileNm, False)
                oAddIn.Installed = True
            End If
            
    MsgBox "We're done, and Excel will close." & Chr(13) & _
    "On reopening you will find 'ACBA Mapping' version " & NewMappingVersion & " loaded and active in the ADD-INS tab."
    
    Excel.Application.Quit
    ActiveWorkbook.Close False
End If


End Sub

【讨论】:

  • If..Else..End If 语句中设置oAddInoAddIn.Installed = True 的行似乎是多余的。您可以在一行中将其简化为 If ActiveWorkbook Is Nothing Then Workbooks.Add,然后将两行都设置为 oAddInoAddIn.Installed = True,因此总共 3 行
  • @RaymondWu 我也是这么想的,但是在测试时,它产生了一个错误。 “答案”中的代码是从 Jan Karel Peterse 复制的,并进行了一些小的修改。
  • @Stephan 那不可能,但无论如何它都是一件小事,只要它能工作。
猜你喜欢
  • 2018-02-22
  • 2013-04-01
  • 1970-01-01
  • 2020-11-17
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
相关资源
最近更新 更多